Quelqu'un peut-il me dire où je me trompe dans ce code? Devrais-je ajouter une autre déclaration If
?
Fondamentalement, il convient de vérifier:
IFcells (i, "A") contient le texte 'Miami'ETin (i, "D") contient le texte 'Florida'ALORSchange valeur de la cellule (i, "C") en 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
Brève leçon de syntaxe
Cells(Row, Column)
identifie une cellule. La ligne doit être un entier compris entre 1 et le maximum pour la version d'Excel que vous utilisez. La colonne doit être un identifiant (par exemple: "A", "IV", "XFD") ou un nombre (par exemple: 1, 256, 16384)
.Cells(Row, Column)
identifie une cellule dans une feuille identifiée dans une déclaration antérieure antérieure:
With ActiveSheet
:
.Cells(Row,Column)
:
End With
Si vous omettez le point, Cells(Row,Column)
est dans la feuille de calcul active. Donc, wsh = ActiveWorkbook
wsh.Range
n'est pas strictement nécessaire. Cependant, j'utilise toujours une instruction With afin que je ne me demande pas quelle feuille je voulais dire lorsque je reviens à mon code dans six mois. Donc, j'écrirais:
With ActiveSheet
:
.Range.
:
End With
En fait, je n’écrirais pas ce qui précède à moins que je ne souhaite vraiment que le code fonctionne sur la feuille active. Que se passe-t-il si l'utilisateur a la mauvaise feuille active au démarrage de la macro? Je souhaiterai écrire:
With Sheets("xxxx")
:
.Range.
:
End With
parce que mon code ne fonctionne que sur la feuille xxxx.
Cells(Row,Column)
identifie une cellule. Cellules (Ligne, Colonne) .xxxx identifie une propriété de la cellule. Value
est une propriété. La valeur est la propriété par défaut afin que vous puissiez généralement l'omettre et le compilateur saura ce que vous voulez dire. Mais dans certaines situations, le compilateur peut être confondu, il est donc conseillé d’inclure le .Value
.
Cells(Row,Column) like "*Miami*"
donnera True si la cellule est "Miami", "South Miami", "Miami, North" ou quelque chose de similaire.
Cells(Row,Column).Value = "Miami"
donnera True si la cellule est exactement égale à "Miami". "MIAMI" par exemple donnera False. Si vous souhaitez accepter MIAMI, utilisez la fonction minuscule:
Lcase(Cells(Row,Column).Value) = "miami"
Mes suggestions
Votre exemple de code ne cesse de changer au fur et à mesure que vous essayez différentes suggestions que je trouve déroutantes. Vous utilisiez Cells(Row,Column) <> "Miami"
lorsque j'ai commencé à taper ceci.
Utilisation
If Cells(i, "A").Value like "*Miami*" And Cells(i, "D").Value like "*Florida*" Then
Cells(i, "C").Value = "BA"
si vous voulez accepter, par exemple, "South Miami" et "Miami, North".
Utilisation
If Cells(i, "A").Value = "Miami" And Cells(i, "D").Value like "Florida" Then
Cells(i, "C").Value = "BA"
si vous voulez accepter, exactement, "Miami" et "Florida".
Utilisation
If Lcase(Cells(i, "A").Value) = "miami" And _
Lcase(Cells(i, "D").Value) = "florida" Then
Cells(i, "C").Value = "BA"
si vous ne vous souciez pas de l'affaire.
S'il n'y a pas de fautes de frappe dans la question, vous avez mal les conditions:
Vous avez dit ceci:
Les cellules IF (i, "A") contiennent le texte "Miami"
... mais votre code dit:
If Cells(i, "A") <> "Miami"
-> <>
signifie que la valeur de la cellule est n'est pas égale à "Miami", vous ne vérifiez donc pas ce que vous pensez vérifier.
Je suppose que vous voulez cela à la place:
If Cells(i, "A") like "*Miami*"
MODIFIER:
Désolé, mais je ne peux pas vraiment vous aider davantage. Comme je l'ai déjà dit dans un commentaire, je ne suis pas un expert VBA d'Excel.
Normalement, je voudrais maintenant ouvrir Excel et essayer votre code moi-même, mais je n'ai même pas avoir Excel sur aucune de mes machines chez moi (j'utilise OpenOffice).
Juste une chose générale: pouvez-vous identifier la ligne qui ne fonctionne pas?
Peut-être que cela aide quelqu'un d'autre à répondre à la question.
Est-ce qu'il exécute (ou du moins tente d'exécuter) la ligne Cells(i, "C").Value = "BA"
?
Ou est-ce que If Cells(i, "A") like "*Miami*"
est déjà False
?
Si oui, essayez de vérifier une seule cellule et voyez si cela fonctionne.
Si vous recherchez simplement l'occurrence de "Miami" ou "Florida" dans une chaîne (puisque vous mettez * aux deux extrémités), il est probablement préférable d'utiliser la fonction InStr au lieu de Like. Non seulement les résultats sont-ils plus prévisibles, mais je pense que vous obtiendrez de meilleures performances.
En outre, VBA n'est pas court-circuité. Ainsi, lorsque vous utilisez le mot clé AND, il testera les deux côtés de l'opérateur AND, que le premier test ait échoué ou non. En VBA, il est plus optimal d’utiliser 2 instructions if dans ces cas. Ainsi, vous ne vérifiez pas "Florida" si vous ne trouvez pas "Miami".
L’autre conseil que j’ai, c’est qu’une boucle for-each est plus rapide qu’une boucle for. En utilisant .offset, vous pouvez réaliser la même chose, mais avec une meilleure efficacité. Bien sûr, il existe des moyens encore meilleurs (comme les variantes de tableaux), mais ceux-ci ajouteront une couche de complexité inutile dans cet exemple.
Voici un exemple de code:
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
J'espère que vous trouverez certaines de ces informations utiles et que vous vous en tiendrez à VBA! ^^
Je pense que vous devriez ajouter .value dans la déclaration IF:
If Cells(i, "A").Value <> "Miami" And Cells(i, "D").Value <> "Florida" Then
Cells(i, "C").Value = "BA"
End IF