Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1300to1304
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Excel 3 Bedingungen in IF + Zählen

VBA Excel 3 Bedingungen in IF + Zählen
12.03.2013 19:51:05
Thomas
Hallo!
Ich habe folgendes Problem:
Ich möchte in drei Spalten etwas auslesen: Name, Zustand und eine Zahl + dannach wenn diese drei Bedingungen erfüllt sind zählen lassen.
Mein Code sieht momentan so aus:
Public Sub zählen ()
Dim wksBlatt as Worksheet
Dim varArr As Variant
Dim lngAnzahl as Long
Dim lngZahl as Long
Set wksBlatt = Tabelle1
varArr = wksBlatt.Range("C:D", "M:M")
For lngZahl = 1 to 800
If varArr(lngZahl;1) = "Name" And varArr(lngZahl;2) = "Zustand" And varArr(lngZahl;1) 

Es funktioniert soweit auch ganz gut nur bei der letzten Bedingung 0 da gibt er mir zum Beispiel wenn eine negative Zahl vorhanden ist und ich das Programm starte gibt er mir aus das es keine gibt.
Vielen Dank im Voraus!!
Grüsse

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Excel 3 Bedingungen in IF + Zählen
12.03.2013 20:01:39
schauan
Hallo Thomas,
erst mal eine schnelle Antwort aus dem Bauch heraus ;-)
müssten nicht Kommas in Deinen Arrayaufrufen stehen?
 Hoffe, geholfen zu haben. Grüße, André aus G in T  (xls 97-2013)

AW: VBA Excel 3 Bedingungen in IF + Zählen
12.03.2013 20:32:18
Thomas
Also gegen Veränderungen vom Code oder der gleichen bin ich offen!
Ich komm nur nicht mehr weiter gerade.

André meint Syntaxfehler, nicht Code-...
12.03.2013 21:46:03
Luc:-?
…Änderung im Allgemeinen, Thomas!
Mich wundert, dass dein Code angeblich läuft, denn ; als Trenner in VBA mit der Bedeutung gab's letztmalig zu Xl95 (VB5). Dieser ganze Teil ist deshalb suspekt…
varArr = wksBlatt.Range("C:D", "M:M")
For lngZahl = 1 to 800
If varArr(lngZahl;1) = "Name" And varArr(lngZahl;2) = "Zustand" And varArr(lngZahl;1) < 0 Then
lngAnzahl = lngAnzahl +1
End If

Außerdem könntest du ruhig (wie üblich) deutlicher strukturieren (Einrückungen von CodeBlöcken mit {TAB})!
Ein > kann ich nirgends entdecken und die 1.Zeile oben erscheint mir ebenfalls merkwürdig → eigentlich schreibt man einen solchen Range doch "C:D,M:M" oder als Union
Es ist so nicht wirklich klar, was du beabsichtigst, es sei denn, du willst gleichzeitig (zeilenweise) die Werte der 1. 2 Spalten auf das Auftreten dieser Begriffe und die 3. auf <0 prüfen. Das könnte man auch noch etwas bzw ganz anders gestalten.
Gruß Luc :-?

Anzeige
AW: André meint Syntaxfehler, nicht Code-...
12.03.2013 21:49:13
Thomas
Wie gesagt es sollen drei Bedingungen erfüllt sein: Name + Zustand + 0
Wenn diese drei Bedingungen erfüllt sind soll dies gezählt werden und später eben ausgespuckt.
:)

AW: André meint Syntaxfehler, nicht Code-...
12.03.2013 22:22:52
Thomas
Wie gesagt es sollen drei Bedingungen erfüllt sein: Name + Zustand + 0
Wenn diese drei Bedingungen erfüllt sind soll dies gezählt werden und später eben ausgespuckt.
:)

AW: André meint Syntaxfehler, nicht Code-...
12.03.2013 22:24:58
Thomas
Wie könnt ich denn dieses Szenario gestalten?
Grüsse

Ich werd' mal was testen, wart's ab! owT
12.03.2013 22:26:07
Luc:-?
:-?

So, das dürfte fktionieren, ...
13.03.2013 01:56:18
Luc:-?
…Thomas,
relativ pflegeleicht bei späteren Bereichs- und Bedingungskorrekturen…
Sub Zählen2Bedingg()
Const adBer$ = "C1:D800,M1:M800", Bed1$ = "Name", Bed2$ = "Zustand"
Dim anzNN(1) As Long, arvBer(3), ZNr As Variant, Bereich As Range
Set Bereich = Tabelle1.Range(adBer)
With WorksheetFunction
arvBer(0) = Evaluate("row(1:" & Bereich.Rows.Count & ")")
arvBer(1) = .Transpose(Bereich.Areas(1).Columns(1).Value2)
arvBer(2) = .Transpose(Bereich.Areas(1).Columns(2).Value2)
arvBer(3) = .Transpose(Bereich.Areas(2).Columns(1).Value2)
End With
For Each ZNr In arvBer(0)
If arvBer(1)(ZNr) = Bed1 And arvBer(2)(ZNr) = Bed2 Then
anzNN(1 + CInt(arvBer(3)(ZNr)  0)
End If
Next ZNr
Tabelle1.Cells(4, 4) = "0=" & anzNN(1)
Set Bereich = Nothing
End Sub

Gruß Luc :-?

Anzeige
Zusätzl Empfehlung u.Ergänzung
13.03.2013 12:06:39
Luc:-?
Tach, Thomas;
es wäre ratsam, auch die Adresse der Zählerausgabe als Konstante anzulegen, zB adErg$ = "D4" und die dann in der betreffenden PgmZeile zu verwenden → Tabelle1.Range(adErg) = "<0=" & anzNN(0) & …
Genauso sinnvoll wäre es, ggf entweder den internen Namen des Blattes (hier benutzter xlVBA-Standard Tabelle1 ) auf größere Aussagekraft u/o Individualität hin zu ändern (der Standard wäre in allen Mappen derselbe und dem Internnamen kann kein Mappenname zugeordnet wdn!) oder ähnlich wie du es vorhattest (in der von dir gewählten Art war es allerdings überflüssig) eine Variable wksBlatt zu deklarieren, den (externen) Blattnamen als Konstante vorzugeben (txBlN$ = "Tab1", oder wie es bei dir heißt) und den dann bei der Referenzierung zu verwenden → Set wksBlatt = ActiveWorkbook.Sheets(txBlN). Der Internname Tabelle1 wäre dann im vorliegenden Pgm nur durch wksBlatt zu ersetzen.
Wenn dann auch noch der Vglswert der Zählbedingung als Konstante eingetragen wird (VglW As Double = 0; was für den speziellen Zweck wahrscheinlich nicht erforderlich sein wird, aber die Zählerei flexibler gestalten würde) u/o gar die Art des Vgls (→ erforderte einen etwas anderen VglsAufbau), ggf auch noch die Übertragung der relevanten Bereiche in Datenfelder flexibel gestaltet würde, wäre das Pgm beinahe universell. Wenn dann statt der PgmKonstanten auch noch benannte MappenKonstanten (Namen!) benutzt würden, könnte das auch von einem VBA-Unkundigen nach Bedarf angepasst wdn.
Gruß Luc :-?

Anzeige
AW: VBA Excel 3 Bedingungen in IF + Zählen
12.03.2013 22:45:30
Daniel
Hi
gehe ich recht in der Annahmne, daß "Name" in Spalte C steht, "Zustand" in Spalte D und der Zahlenwert in Spalte M ?
wenn ja, dann bespielsweise so:
Public Sub zählen ()
Dim wksBlatt as Worksheet
Dim varArrC As Variant, varArrD as Variant, varArrM as Variant
Dim lngAnzahl as Long
Dim lngZahl as Long
Set wksBlatt = Tabelle1
varArrC = wksBlatt.Range("C1:C800").Value
varArrD = wksBlatt.Range("D1:D800").Value
varArrM = wksBlatt.Range("M1:M800").Value
For lngZahl = 1 to 800
If varArrC(lngZahl, 1) = "Name" And varArrD(lngZahl, 1) = "Zustand" And varArrM(lngZahl,  _
1) 
oder etwas schneller:
Public Sub zählen ()
Dim wksBlatt as Worksheet
Dim varArrC As Variant, varArrD as Variant, varArrM as Variant
Dim lngAnzahl as Long
Dim lngZahl as Long
Set wksBlatt = Tabelle1
varArrC = wksBlatt.Range("C1:C800").Value
varArrD = wksBlatt.Range("D1:D800").Value
varArrM = wksBlatt.Range("M1:M800").Value
For lngZahl = 1 to 800
If varArrC(lngZahl, 1) = "Name" Then
If varArrD(lngZahl, 1) = "Zustand" Then
if varArrM(lngZahl, 1) 
Gruß Daniel

Anzeige
AW: VBA Excel 3 Bedingungen in IF + Zählen
12.03.2013 22:51:38
Daniel
Hi
gehe ich recht in der Annahmne, daß "Name" in Spalte C steht, "Zustand" in Spalte D und der Zahlenwert in Spalte M ?
wenn ja, dann bespielsweise so:
Public Sub zählen ()
Dim wksBlatt as Worksheet
Dim varArrC As Variant, varArrD as Variant, varArrM as Variant
Dim lngAnzahl as Long
Dim lngZahl as Long
Set wksBlatt = Tabelle1
varArrC = wksBlatt.Range("C1:C800").Value
varArrD = wksBlatt.Range("D1:D800").Value
varArrM = wksBlatt.Range("M1:M800").Value
For lngZahl = 1 to 800
If varArrC(lngZahl, 1) = "Name" And varArrD(lngZahl, 1) = "Zustand" And varArrM(lngZahl,  _
1) 
oder etwas schneller:
Public Sub zählen ()
Dim wksBlatt as Worksheet
Dim varArrC As Variant, varArrD as Variant, varArrM as Variant
Dim lngAnzahl as Long
Dim lngZahl as Long
Set wksBlatt = Tabelle1
varArrC = wksBlatt.Range("C1:C800").Value
varArrD = wksBlatt.Range("D1:D800").Value
varArrM = wksBlatt.Range("M1:M800").Value
For lngZahl = 1 to 800
If varArrC(lngZahl, 1) = "Name" Then
If varArrD(lngZahl, 1) = "Zustand" Then
if varArrM(lngZahl, 1) 
Gruß Daniel

Anzeige
noch ein Vorschlag
13.03.2013 01:53:44
Erich
Hi Thomas,
probier mal

Option Explicit
Sub Zaehle2()
Dim arCD, arrM, aCDM(1 To 800) As String, zz As Long
With Worksheets("Tabelle1")
arCD = .Range("C1:D800").Value
arrM = .Range("M1:M800").Value
For zz = 1 To 800
aCDM(zz) = arCD(zz, 1) & "#" & arCD(zz, 2) & "#" & -(arrM(zz, 1) 
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

und noch einer
13.03.2013 02:00:19
Erich
Hi Thomas,
oder so:

Sub Zaehle3()
Dim arCD, arrM, zz As Long, ee As Long
With Worksheets("Tabelle1")
arCD = .Range("C1:D800").Value
arrM = .Range("M1:M800").Value
For zz = 1 To 800
ee = ee - (arCD(zz, 1) = "Name") * (arCD(zz, 2) = "Zustand") * (arrM(zz, 1) 
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich

Anzeige
Schlaflos & Langeweile, Erich? ;-) Gruß owT
13.03.2013 02:07:32
Luc:-?
:-?

Hi Luc, nee, PC qualifiziert downen ;-) Gruß owT
13.03.2013 02:13:02
Erich

Beim PC-Downen war ich wohl schneller ;-) Gruß owT
13.03.2013 19:33:23
Luc:-?
:-?

Nich nur dabei! ;-) But: Wo is Thomas? owT
13.03.2013 19:50:56
Erich

...dat iss de Question! Wieda Eena vaschütt ...
14.03.2013 11:56:52
Luc:-?
…jejangn, Erich!
Gruß aus TF, Luc :-?

321 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige