Microsoft Excel

Herbers Excel/VBA-Archiv

and Anweisung VBA | Herbers Excel-Forum


Betrifft: and Anweisung VBA von: klü
Geschrieben am: 11.01.2012 12:41:52

Liebe VBA Profis,

ich bin ein wirklicher VBA Neuling und komme mit meinem ersten Makro nicht so richtig weiter.

Die Daten kommen stammen aus einem Aktivitätssensor und am Ende will ich unterscheiden können ob die Tiere inaktiv oder aktiv waren. Dafür habe ich mir folgende Grenzen gesetzt:
Wenn der Wert in Spalte 2 (Aktivität x)>=0 <=13 ist und der Wert in Spalte 3 (Aktivität y) >=0<=10 ist und der Wert in Spalte 4 (Differenz) >=-4<=4 ist so ist das Tier "inaktiv" (soll in Spalte 5 ausgeben Verhaltensweise werden). Ist der Wert in Spalte 2 (Aktivität x)>=14 <=130 ist und der Wert in Spalte 3 (Aktivität y) >=11<=160 ist und der Wert in Spalte 4 (Differenz) >=-49<=-6 und >=5 <=77 so ist das Tier "aktiv" (soll in Spalte 5 Verhaltensweise ausgeben werden). Andernfalls soll der Ausdruck "etwas anderes" erscheinen (soll in Spalte 5 ausgeben Verhaltensweise werden).

Die Ausgaben für die inaktiven Daten sind richtig aber für die aktiven Daten wird stets "etwas anderes" ausgeben. In Spalte 7 habe ich vermerkt was als Ergebnis dort stehen sollte. Ich habe es in der Beispieldatei in VBA als Modul1 und Klasse 1 gespeichert.

Die Datei ist hier hinterlegt:
https://www.herber.de/bbs/user/78365.xlsm

Sub Unterscheidung()

Set inputs = Sheets("Sheet1")
Set output = Sheets("Sheet1")


Row = 1

Do While inputs.Cells(Row, 1) > 0

Row = Row + 1
output.Cells(Row, 1) = inputs.Cells(Row, 1)
output.Cells(Row, 2) = inputs.Cells(Row, 2)
output.Cells(Row, 3) = inputs.Cells(Row, 3)
output.Cells(Row, 4) = inputs.Cells(Row, 4)
output.Cells(Row, 5) = inputs.Cells(Row, 5)


If inputs.Cells(Row, 2) >= 0 And inputs.Cells(Row, 2) <= 13 And inputs.Cells(Row, 3) >= 0 And   _
_
inputs.Cells(Row, 3) <= 10 And inputs.Cells(Row, 4) >= -5 And inputs.Cells(Row, 4) <= 4 Then
inputs.Cells(Row, 5) = "inaktiv"
ElseIf inputs.Cells(Row, 2) >= 14 And inputs.Cells(Row, 2) <= 130 And inputs.Cells(Row, 3) >=   _
_
11 And inputs.Cells(Row, 3) <= 160 And inputs.Cells(Row, 4) >= -49 And inputs.Cells(Row, 4) <= - _
6 And inputs.Cells(Row, 4) >= 5 And inputs.Cells(Row, 4) <= 77 Then
inputs.Cells(Row, 5) = "aktiv"
Else
inputs.Cells(Row, 5) = "etwas anderes"
End If

Loop

End Sub

Vielen lieben Dank schonmal für eure Hilfe!

  

Betrifft: AW: and Anweisung VBA von: Josef Ehrensberger
Geschrieben am: 11.01.2012 13:05:39


Hallo ?,

input und output verweisen auf de selbe Tabelle! Ist das so gewollt?

Sub Unterscheidung()

Set inputs = Sheets("Sheet1")
Set output = Sheets("Sheet1") '??


Row = 1

With inputs
  Do While .Cells(Row, 1) > 0
    Row = Row + 1
    output.Cells(Row, 1) = .Cells(Row, 1)
    output.Cells(Row, 2) = .Cells(Row, 2)
    output.Cells(Row, 3) = .Cells(Row, 3)
    output.Cells(Row, 4) = .Cells(Row, 4)
    output.Cells(Row, 5) = .Cells(Row, 5)
    
    
    If (.Cells(Row, 2) >= 0 And .Cells(Row, 2) <= 13) And _
      (.Cells(Row, 3) >= 0 And .Cells(Row, 3) <= 10) And _
      (.Cells(Row, 4) >= -5 And .Cells(Row, 4) <= 4) Then
      .Cells(Row, 5) = "inaktiv"
      ElseIf (.Cells(Row, 2) >= 14 And .Cells(Row, 2) <= 130) And _
        (.Cells(Row, 3) >= 11 And .Cells(Row, 3) <= 160) And _
        ((.Cells(Row, 4) >= -49 And .Cells(Row, 4) <= -6) Or _
        (.Cells(Row, 4) >= 5 And .Cells(Row, 4) <= 77)) Then
        .Cells(Row, 5) = "aktiv"
      Else
        .Cells(Row, 5) = "etwas anderes"
      End If
    Loop
  End With
  
End Sub






« Gruß Sepp »



  

Betrifft: AW: and Anweisung VBA von: klü
Geschrieben am: 11.01.2012 13:15:47

Hallo Josef,

damit wollte ich nur erreichen das er mir die Ergebnisse im gleichen Tabellenblatt ausgibt in dem auch die Ausgangsdaten stehen.

LG Klü


  

Betrifft: AW: and Anweisung VBA von: Rudi Maintaire
Geschrieben am: 11.01.2012 13:16:15

Hallo,
1. Verwende niemals VBA-Schlüsselwörter als Variablen (Row ist eine Eigenschaft)
2. Deklariere alle Variablen.
Mit Select Case anstatt If ... And ... Then... ElseIf ... End If

Sub Unterscheidung()
  Dim wksInput As Worksheet, wksOutput As Worksheet
  Dim lRow As Long
  Dim arrOutput, iOutput
  
  Set wksInput = Sheets("Sheet1")
  Set wksOutput = Sheets("Sheet2")
  
  arrOutput = Array("was anderes", "Inaktiv", "Aktiv")
  lRow = 1
  
  Do While wksInput.Cells(lRow, 1) > 0
  
    lRow = lRow + 1
    iOutput = 0
    wksOutput.Cells(lRow, 1).Resize(, 5) = wksInput.Cells(lRow, 1).Resize(, 5)
    
    Select Case wksInput.Cells(lRow, 2)
      Case 0 To 13
        Select Case wksInput.Cells(lRow, 3)
          Case 0 To 10
            Select Case wksInput.Cells(lRow, 4)
              Case -5 To 4: iOutput = 1
            End Select
        End Select
      Case 14 To 130
        Select Case wksInput.Cells(lRow, 3)
          Case 11 To 160
            Select Case wksInput.Cells(lRow, 4)
              Case -49 To -6, 5 To 77: iOutput = 2
            End Select
        End Select
    End Select
    wksInput.Cells(lRow, 5) = arrOutput(iOutput)
  
  Loop

End Sub

Gruß
Rudi


  

Betrifft: AW: and Anweisung VBA von: klü
Geschrieben am: 11.01.2012 13:23:44

Perfekt Rudi,

es funktioniert. Jetzt muss ich mir das nochmal genauer anschauen damit ich das beim nächsten Mal auch selber hinbekomme!

Vielen lieben Dank du hast mir weitere Nächte mit Bauchschmerzen erspart!


  

Betrifft: (In)aktive Tiere per VBA oder Funktion ermitteln von: NoNet
Geschrieben am: 11.01.2012 13:38:18

Hallo Klü,

folgende Bemerkungen zu Deiner Mappe :

- Lösche die Klasse "Klasse1", der Code ist hier falsch platziert
- ROW und OUTPUT sind VBA Schlüsselwörter und sollten daher keineswegs als Variablennamen verwendet werden, da dies zu Verwirrungen und teilweise auch zu Fehlermeldungen führen kann
- Die Ausgabe der "INPUT"-Werte in den "OUTPUT"-Bereich ist überflüssig - zumindest wenn es sich dabei um ein und dasselbe Tabellenblatt handelt
- Es ist nützlich, die Variablen zuvor zu deklarieren (mit DIM...), mit OPTION EXPLICIT wird das sogar erforderlich !
- der entscheidende Fehler war, dass für "aktive" Tiere bei "Aktivität Y" 2 Grenzen gelten : (-49 bis -6) und (5 bis 77) - diese beiden Bedingungen müssen mit OR im Code verknüpft werden !

Hier mein Korrekturvorschlag für den Code :

Option Explicit 'Erfordert, dass ALLE Variablen im Modul zuvor deklariert werden müssen !

Sub Unterscheidung()
    'Diesen Code bitte in ein MODUL (z.B. "Modul1") - nicht in ein KLASSEN-Modul !
    'ROW ist ein VBA-Schlüsselwort und sollte daher NICHT als Variablenname verwendet werden !
    'Output ist ebenfalls ein VBA-Schlüsselwort - hier gilt das Gleiche !
    
    Dim lngRow As Long
    Dim shInput As Worksheet, shOutput As Worksheet
    Dim rngAktX As Range, rngAktY As Range, rngDif As Range 'Variablen für die INPUT-Werte
    
    Set shInput = Sheets("Sheet1")
    Set shOutput = Sheets("Sheet1")
    
    lngRow = 1
    
    Do While shInput.Cells(lngRow, 1) > 0
    
        lngRow = lngRow + 1
        Set rngAktX = shInput.Cells(lngRow, 2) 'Aktivität X aus Spalte B zuweisen
        Set rngAktY = shInput.Cells(lngRow, 3) 'Aktivität Y aus Spalte C zuweisen
        Set rngDif = shInput.Cells(lngRow, 4)  'Differenz aus Spalte D zuweisen
        
        'Ausgabe der Outputs in Inputs ist überflüssig !
'        output.Cells(lngrow, 1) = inputs.Cells(lngrow, 1)
'        output.Cells(lngrow, 2) = inputs.Cells(lngrow, 2)
'        output.Cells(lngrow, 3) = inputs.Cells(lngrow, 3)
'        output.Cells(lngrow, 4) = inputs.Cells(lngrow, 4)
'        output.Cells(lngrow, 5) = inputs.Cells(lngrow, 5)
        
        If rngAktX >= 0 And rngAktX <= 13 And rngAktY >= 0 And rngAktY <= 10 And _
            rngDif >= -4 And rngDif <= 4 Then
            shInput.Cells(lngRow, 5) = "inaktiv"
        ElseIf rngAktX >= 14 And rngAktX <= 130 And rngAktY >= 11 And rngAktY <= 160 And _
            ((rngDif >= -49 And rngDif <= -6) Or (rngDif >= 5 And rngDif <= 77)) Then
            shInput.Cells(lngRow, 5) = "aktiv"
        Else
            shInput.Cells(lngRow, 5) = "etwas anderes"
        End If
    Loop
End Sub
Das Ganze lässt sich auch ohne VBA direkt mit einer Funktion in Spalte E lösen (in E2 eingeben und runterkopieren) :

=WENN(UND(B2>=0;B2<=13;C2>=0;C2<=10;ABS(D2)<=4);"inaktiv";WENN(UND(B2>=14;B2<=130;C2>=11;C2<=160;ODER(UND(D2>=-49;D2<=-6);UND(D2>=5;D2<=77)));"aktiv";"etwas anderes"))

Gruß, NoNet


  

Betrifft: AW: (In)aktive Tiere per VBA oder Funktion ermitteln von: klü
Geschrieben am: 11.01.2012 14:40:58

Vielen Dank NoNet für die Erklärungen.
Ich bin echt begeistert das ich so schnell Antworten bekommen habe. Dafür nochmal vielen Dank auch für den Tip warum meine Anweisung nicht funktioniert hat und die alternative Anweisung in Excel!

Liebe Grüße

Klü