web-dev-qa-db-de.com

Verwendung von AND in der IF-Anweisung - VBA

Kann mir jemand sagen, wo ich in diesem Code hier falsch liege. Soll ich eine weitere If-Anweisung hinzufügen?

Grundsätzlich sollte es prüfen:

WENNZellen (i, "A") den Text "Miami"ENTHALTEN UNDin (i, "D") den Text "Florida"ENTHÄLT, DANNändern Wert der Zelle (i, "C") bis BA. 

Sub ABC()
Dim wsh As Worksheet, i As Long, lngEndRowInv As Long
Set wsh = ActiveSheet

i = 2
lngEndRowInv = wsh.Range("A" & wsh.Rows.Count).End(xlUp).Row
While i <= lngEndRowInv
If Cells(i, "A") like "*Miami*" And Cells(i, "D") like "*Florida*" Then
Cells(i, "C").Value = "BA"
End If
i = i + 1
Wend
End Sub
4
user823911

Kurze Syntaxstunde

Cells(Row, Column) identifiziert eine Zelle. Die Zeile muss eine ganze Zahl zwischen 1 und maximal für die von Ihnen verwendete Excel-Version sein. Spalte muss ein Bezeichner sein (zum Beispiel: "A", "IV", "XFD") oder eine Zahl (zum Beispiel: 1, 256, 16384)

.Cells(Row, Column) identifiziert eine Zelle in einer Tabelle, die in einer früheren With-Anweisung angegeben wurde:

With ActiveSheet
  :
  .Cells(Row,Column)
  :
End With

Wenn Sie den Punkt nicht angeben, befindet sich Cells(Row,Column) im aktiven Arbeitsblatt. Daher ist wsh = ActiveWorkbookwsh.Range nicht unbedingt erforderlich. Ich verwende jedoch immer eine With-Anweisung, daher wundere ich mich nicht, welches Blatt ich meinte, wenn ich innerhalb von sechs Monaten zu meinem Code zurückkehre. Also würde ich schreiben:

With ActiveSheet
  :
  .Range.  
  :
End With

Eigentlich würde ich das oben nicht schreiben, es sei denn, ich wollte wirklich, dass der Code auf dem aktiven Blatt funktioniert. Was ist, wenn der Benutzer beim Starten des Makros das falsche Blatt aktiviert hat. Ich würde schreiben:

With Sheets("xxxx")
  :
  .Range.  
  :
End With

weil mein code nur auf blatt xxxx funktioniert.

Cells(Row,Column) identifiziert eine Zelle. Zellen (Zeile, Spalte) .xxxx kennzeichnet eine Eigenschaft der Zelle. Value ist eine Eigenschaft. Value ist die Standardeigenschaft. Sie können sie normalerweise weglassen und der Compiler weiß, was Sie meinen. In bestimmten Situationen kann der Compiler jedoch verwirrt sein, so dass der Hinweis zum Einfügen des .Value gut ist.

Cells(Row,Column) like "*Miami*" gibt True aus, wenn die Zelle "Miami", "South Miami", "Miami, North" oder etwas Ähnliches ist.

Cells(Row,Column).Value = "Miami" gibt "True" aus, wenn die Zelle genau "Miami" ist. "MIAMI" zum Beispiel ergibt False. Wenn Sie MIAMI akzeptieren möchten, verwenden Sie die Kleinbuchstabenfunktion:

Lcase(Cells(Row,Column).Value) = "miami"  

Meine Vorschläge  

Ihr Beispielcode ändert sich ständig, wenn Sie verschiedene Vorschläge ausprobieren, die ich verwirrend finde. Sie haben Cells(Row,Column) <> "Miami" verwendet, als ich mit der Eingabe begonnen habe.

Benutzen

If Cells(i, "A").Value like "*Miami*" And Cells(i, "D").Value like "*Florida*" Then
  Cells(i, "C").Value = "BA"

wenn Sie beispielsweise "South Miami" und "Miami, North" akzeptieren möchten.

Benutzen

If Cells(i, "A").Value = "Miami" And Cells(i, "D").Value like "Florida" Then
  Cells(i, "C").Value = "BA"

wenn Sie "Miami" und "Florida" genau akzeptieren möchten.

Benutzen

If Lcase(Cells(i, "A").Value) = "miami" And _
   Lcase(Cells(i, "D").Value) = "florida" Then
  Cells(i, "C").Value = "BA"

wenn Sie sich nicht für den Fall interessieren.

9
Tony Dallimore

Wenn die Frage keinen Tippfehler enthält, haben Sie die Bedingungen nicht erfüllt:

Du hast das gesagt:

IF-Zellen (i, "A") enthalten den Text "Miami"

... aber dein Code sagt:

If Cells(i, "A") <> "Miami"

-> <> bedeutet, dass der Wert der Zelle nicht gleich "Miami" ist. Sie prüfen also nicht, was Sie zu prüfen glauben.

Ich denke, du willst das stattdessen:

If Cells(i, "A") like "*Miami*"

BEARBEITEN:

Sorry, aber ich kann dir wirklich nicht mehr helfen. Wie ich schon in einem Kommentar gesagt habe, bin ich kein Excel-VBA-Experte.
Normalerweise würde ich Excel jetzt öffnen und den Code selbst ausprobieren, aber ich habe nicht einmal have Excel auf meinen Rechnern zu Hause (ich verwende OpenOffice).

Nur eine allgemeine Sache: Können Sie die Zeile identifizieren, die nicht funktioniert?
Vielleicht hilft das jemand anderen, die Frage zu beantworten. 

Führt sie jemals die Zeile Cells(i, "C").Value = "BA" aus (oder versucht sie zumindest auszuführen)?
Oder ist das If Cells(i, "A") like "*Miami*"-Zeug bereits False?
Falls ja, überprüfen Sie nur eine Zelle und prüfen Sie, ob dies funktioniert.

4

Wenn Sie einfach nach dem Vorkommen von "Miami" oder "Florida" in einer Zeichenfolge suchen (da Sie an beiden Enden * angeben), ist es wahrscheinlich besser, die InStr-Funktion anstelle von Like zu verwenden. Die Ergebnisse sind nicht nur vorhersehbarer, sondern ich glaube, Sie werden eine bessere Leistung erzielen.

Außerdem ist VBA nicht kurzgeschlossen. Wenn Sie das AND-Schlüsselwort verwenden, werden beide Seiten des AND getestet, unabhängig davon, ob der erste Test fehlgeschlagen ist oder nicht. In VBA ist es optimaler, in diesen Fällen 2 if-Anweisungen zu verwenden, so dass Sie nicht nach "Florida" suchen, wenn Sie "Miami" nicht finden.

Der andere Rat, den ich habe, ist, dass eine for-each-Schleife schneller als eine for-Schleife ist. Mit .offset können Sie dasselbe erreichen, jedoch mit höherer Effizienz. Natürlich gibt es noch bessere Möglichkeiten (wie etwa Arrayvarianten), die jedoch eine Komplexitätsebene hinzufügen, die in diesem Beispiel nicht benötigt wird.

Hier ist ein Beispielcode:

Sub test()

Application.ScreenUpdating = False
Dim lastRow As Long
Dim cell As Range
lastRow = Range("A" & Rows.Count).End(xlUp).Row

For Each cell In Range("A1:A" & lastRow)
    If InStr(1, cell.Value, "Miami") <> 0 Then
        If InStr(1, cell.Offset(, 3).Value, "Florida") <> 0 Then
            cell.Offset(, 2).Value = "BA"
        End If
    End If
Next

Application.ScreenUpdating = True
End Sub

Ich hoffe, dass Sie einige davon hilfreich finden und mit VBA weiter machen! ^^

1
aevanko

Ich denke, Sie sollten .value in der IF-Anweisung anhängen:

If Cells(i, "A").Value <> "Miami" And Cells(i, "D").Value <> "Florida" Then
    Cells(i, "C").Value = "BA"
End IF
0
rkosegi