Microsoft Excel

Herbers Excel/VBA-Archiv

VBA Excel 3 Bedingungen in IF + Zählen

Betrifft: VBA Excel 3 Bedingungen in IF + Zählen von: Thomas Kaltenberg
Geschrieben am: 12.03.2013 19:51:05

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) < 0 Then
lngAnzahl = lngAnzahl +1
End If
Next lngZahl
Worksheets(Tabelle1).Range("D4").Value = lngAnzahl
End Sub


Es funktioniert soweit auch ganz gut nur bei der letzten Bedingung <0 oder >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

  

Betrifft: AW: VBA Excel 3 Bedingungen in IF + Zählen von: schauan
Geschrieben am: 12.03.2013 20:01:39

Hallo Thomas,

erst mal eine schnelle Antwort aus dem Bauch heraus ;-)
müssten nicht Kommas in Deinen Arrayaufrufen stehen?

Homepage90 Hoffe, geholfen zu haben. Grüße, André aus G in T  (xls 97-2013)



  

Betrifft: AW: VBA Excel 3 Bedingungen in IF + Zählen von: Thomas Kaltenberg
Geschrieben am: 12.03.2013 20:32:18

Also gegen Veränderungen vom Code oder der gleichen bin ich offen!

Ich komm nur nicht mehr weiter gerade.


  

Betrifft: André meint Syntaxfehler, nicht Code-... von: Luc:-?
Geschrieben am: 12.03.2013 21:46:03

…Ä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 :-?


  

Betrifft: AW: André meint Syntaxfehler, nicht Code-... von: Thomas Kaltenberg
Geschrieben am: 12.03.2013 21:49:13

Wie gesagt es sollen drei Bedingungen erfüllt sein: Name + Zustand + < bzw. > 0

Wenn diese drei Bedingungen erfüllt sind soll dies gezählt werden und später eben ausgespuckt.

:)


  

Betrifft: AW: André meint Syntaxfehler, nicht Code-... von: Thomas Kaltenberg
Geschrieben am: 12.03.2013 22:22:52

Wie gesagt es sollen drei Bedingungen erfüllt sein: Name + Zustand + < bzw. > 0

Wenn diese drei Bedingungen erfüllt sind soll dies gezählt werden und später eben ausgespuckt.

:)


  

Betrifft: AW: André meint Syntaxfehler, nicht Code-... von: Thomas Kaltenberg
Geschrieben am: 12.03.2013 22:24:58

Wie könnt ich denn dieses Szenario gestalten?

Grüsse


  

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

:-?


  

Betrifft: So, das dürfte fktionieren, ... von: Luc:-?
Geschrieben am: 13.03.2013 01:56:18

…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)) = anzNN(1 + CInt(arvBer(3)(ZNr) < 0)) - _
                                                  CInt(arvBer(3)(ZNr) <> 0)
        End If
    Next ZNr
    Tabelle1.Cells(4, 4) = "<0=" & anzNN(0) & " / >0=" & anzNN(1)
    Set Bereich = Nothing
End Sub

Gruß Luc :-?


  

Betrifft: Zusätzl Empfehlung u.Ergänzung von: Luc:-?
Geschrieben am: 13.03.2013 12:06:39

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 :-?


  

Betrifft: AW: VBA Excel 3 Bedingungen in IF + Zählen von: Daniel
Geschrieben am: 12.03.2013 22:45:30

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) < 0 Then
          lngAnzahl = lngAnzahl +1
       End If
    Next lngZahl
    Worksheets(Tabelle1).Range("D4").Value = lngAnzahl
    End Sub
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) < 0 Then
                   lngAnzahl = lngAnzahl +1
                End If
          End If
       End If
    Next lngZahl
    Worksheets(Tabelle1).Range("D4").Value = lngAnzahl
    End Sub
Gruß Daniel


  

Betrifft: AW: VBA Excel 3 Bedingungen in IF + Zählen von: Daniel
Geschrieben am: 12.03.2013 22:51:38

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) < 0 Then
          lngAnzahl = lngAnzahl +1
       End If
    Next lngZahl
    Worksheets(Tabelle1).Range("D4").Value = lngAnzahl
    End Sub
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) < 0 Then
                   lngAnzahl = lngAnzahl +1
                End If
          End If
       End If
    Next lngZahl
    Worksheets(Tabelle1).Range("D4").Value = lngAnzahl
    End Sub
Gruß Daniel


  

Betrifft: noch ein Vorschlag von: Erich G.
Geschrieben am: 13.03.2013 01:53:44

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) < 0)
      Next zz
      .Cells(1, 256).Resize(800) = Application.Transpose(aCDM)
      .Range("D4").Value = Application.CountIf _
         (.Cells(1, 256).Resize(800), "Name#Zustand#1")
      .Columns(256).Clear
   End With
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: und noch einer von: Erich G.
Geschrieben am: 13.03.2013 02:00:19

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) < 0)
      Next zz
      .Range("D4").Value = ee
   End With
End Sub
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: Schlaflos & Langeweile, Erich? ;-) Gruß owT von: Luc:-?
Geschrieben am: 13.03.2013 02:07:32

:-?


  

Betrifft: Hi Luc, nee, PC qualifiziert downen ;-) Gruß owT von: Erich G.
Geschrieben am: 13.03.2013 02:13:02




  

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

:-?


  

Betrifft: Nich nur dabei! ;-) But: Wo is Thomas??? owT von: Erich G.
Geschrieben am: 13.03.2013 19:50:56




  

Betrifft: ...dat iss de Question! Wieda Eena vaschütt ... von: Luc:-?
Geschrieben am: 14.03.2013 11:56:52

…jejangn, Erich!
Gruß aus TF, Luc :-?


 

Beiträge aus den Excel-Beispielen zum Thema "VBA Excel 3 Bedingungen in IF + Zählen"