J'ai une boucle pour la boucle et à l'intérieur, j'ai si la déclaration.
Dans mon Excel, j'ai une liste contenant chaque valeur une fois. Une fois que je l'ai trouvé, je ne veux pas que le code vérifie même le conditionnel, je souhaite que cela saute cette partie de la déclaration IF complètement chaque fois que la boucle est exécutée, est-ce possible? P>
La première itération de la boucle constatera que "C" est la valeur de sorte qu'il fera de la sorte à l'intérieur (xc = i) p>
Je ne veux pas que le code vérifie même "les cellules aînantes (1, i) =" c "à nouveau, comme l'image suivante, est-ce possible? p>
code comme texte: p>
p>
4 Réponses :
Mon interprétation initiale de votre besoin était "Si le code frappe à nouveau" C ", n'agissez pas".
Pour ce faire, vous pouvez modifier la logique comme suit: P>
Option Explicit
Sub test()
Dim i As Integer
Dim dict As Object 'Scripting.Dictionary
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To 5
dict(Cells(i, 1).Value) = i
Next
Debug.Print dict("a") '4
Debug.Print dict("b") '2
Debug.Print dict("c") '1
'Etc.
End Sub
Vous avez absolument raison de voir les notes supplémentaires, c'était juste pour l'exemple
En ce qui concerne: elseif (xc = 0) et (cellules (I, 1) = "C"), il va toujours le vérifier. Ma liste a des valeurs uniques afin que ce soit la même chose que ma solution. Je ne veux même pas vérifier le booléen. Ce que je veux dire, c'est que vous avez écrit: elseIf (vrai / faux) et (vrai / faux) alors je veux tout ignorer et envoyer à cette section sur une section dans le code qui ne sera plus touché. Pensez-vous que c'est possible?
@Timwilliams - Je pensais que OP était intéressé par les premiers positions de valeurs non uniques. Maintenant, nous savons également qu'il y en a environ 60 et évidemment, il y a bien de meilleures façons d'y aller.
@Excelosaurus J'ai essayé votre code et travaille bien et répondez à la question 100%. Nice :) .. pour moi est la première fois que je vois le script.diconary ...
@Excelosaurus - Pour votre premier exemple de code, il convient de noter que VBA ne signifie pas "court-circuit" des tests booléens qui sont ainsi que ensemble - toutes les déclarations sont évaluées, puis le et est appliqué. Donc, même si xc = 0, la valeur de la cellule est toujours vérifiée.
Oups "même si xc! = 0 ..."
@Timwillidiams Mon interprétation de la nécessité d'OP (malgré la description littérale) est "si le code frappe" c 'à nouveau, n'agissez pas ". Va éditer pour faire cela clair. Dommage que nous n'ayons pas Andalso / Orelse dans VBA.
@Excelosaurus - semblait être comme ils voulaient que le test entier i> disparaisse une fois qu'il était passé une fois
Si j'ai compris votre question, vous pouvez essayer ce code:
Sub test()
Dim i, xa, xb, xc As Integer
Dim a, b, c As Boolean
a = False
b = False
c = False
For i = 1 To 5
If Cells(i, 1) = "a" And a <> True Then
xa = i
a = True
ElseIf Cells(i, 1) = "b" And b <> True Then
xb = i
b = True
ElseIf Cells(i, 1) = "c" And c <> True Then
xc = 1
c = True
End If
Next i
End Sub
Je ne veux même pas que cela vérifie même l'Electricité. Ce que je veux dire, c'est que vous avez écrit: elseIf (vrai / faux) et (vrai / faux) alors je veux tout ignorer et envoyer à cette section sur une section dans le code qui ne sera plus touché. Pensez-vous que c'est possible?
Je voulais juste "mod" le code de Ferdinando, il est donc un peu plus "lisible", je pense. La différence principale (la substance) entre cette version et Ferdinando's ou Excelosaurus 'est que la cellule n'est même pas testée une fois la valeur détectée. N'oubliez pas que la question était la suivante: Sub test()
Dim i As Integer, xa As Integer, xb As Integer, xc As Integer
Dim aFound As Boolean, bFound As Boolean, cFound As Boolean
Dim r As Range
For i = 1 To 5
Set r = Cells(i, 1)
If Not aFound Then
If r = "a" Then xa = i: aFound = True
ElseIf Not bFound Then
If r = "b" Then xb = i: bFound = True
ElseIf Not cFound Then
If r = "c" Then xc = i: cFound = True
End If
Next i
End Sub
Vous avez raison mais laissez-moi reformuler que: «Je ne veux pas que le code vérifie même une déclaration booléenne» (peu importe la façon dont il a l'air), je suis essentiellement à la recherche d'une solution pour marquer cette partie du code comme ignoré pour le reste du code. Je ne peux rien comme ça et c'est pourquoi je demande ici
@Assaf; Généralement, toutes les solutions proposées devraient vous conviennent dans ce cas. Joyeux codage!
@Assaf - J'ai du mal à comprendre votre besoin. Pour moi, il semble que vous souhaitiez la position de chaque valeur de chaque valeur, d'où ma dernière modification. Bien sûr, chaque fois que la boucle fonctionne, tout le dictionnaire sera reconstruit. Qu'est-ce que tu veux sauter et pourquoi?
Disons que je = 3, "c" et "b" déjà "trouvé". La valeur est maintenant "0" et la boucle vérifiera toujours "les cellules aînifs (I, 1) =" B "à chaque fois. Ce n'est pas très efficace. Quand j'ai une boucle qui fonctionne 40 fois et à l'intérieur du si j'aime 60 ans, il faut du temps. Je veux dire, ce n'est qu'une minute, mais j'aimerais en savoir plus pour les projets futurs
@Assaf; Comme vous l'avez peut-être remarqué, le code ci-dessus ne vérifierait pas «les cellules SOPEIF (I, 1) =« B »à chaque fois si« B »est déjà trouvé. J'ai également fait une petite édition pour le faire courir et encore plus efficacement.
Je n'aime pas l'idée de 60 ans. S'il vous plaît examiner le code ci-dessous. Afin de le tester, créez une feuille de calcul appelée "tachetsheet" et entrez votre A1: A5 sur les cellules H2: H6.
Sub TestSpike()
' 06 Jan 2019
Dim Rng As Range
Dim Items As Variant
Dim Spike As String
Dim Tmp As String
Dim i As Integer
Dim R As Long
Items = Split("c|b|0|a|1", "|")
With Worksheets("TestSheet").Columns("H")
For R = 2 To 6
Tmp = CStr(.Cells(R).Value)
If InStr(1, Spike, Tmp, vbTextCompare) = 0 Then
Spike = Spike & "|" & Tmp
On Error Resume Next
i = Application.WorksheetFunction.Match(Tmp, Items, 0)
If Err Then
MsgBox Tmp & " wasn't found in Array"
Else
MsgBox "i = " & i & " = Item " & Tmp
End If
End If
Next R
End With
End Sub
Veuillez fournir le code sous forme de texte, pas comme image.
Pourquoi est-il important si votre liste ne contient que des valeurs uniques?
@Timwillidis efficacité et heure. J'ai 60 anssif
@Trincot - J'ai édité le message d'origine, vérifiez le code comme texte
Si vous souhaitez être plus efficace, lisez la valeur de la cellule dans une variable avant d'entrer dans le bloc IF
@Timwilliams pouvez-vous me donner un exemple?