0
votes

Comment ne pas entrer si la déclaration dans une boucle si elle a été exécutée

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?

Voici mon Code et liste: Voici mon code et mon code

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)

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?

 ce que je veux

code comme texte: xxx


6 commentaires

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?


4 Réponses :


2
votes

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


8 commentaires

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 disparaisse une fois qu'il était passé une fois



0
votes

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


1 commentaires

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?



0
votes

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: je ne veux pas que le code ne vérifie même »les cellules aînantes (1, i) =" c "à nouveau ... strong> donc, cette version fait exactement cela.

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


5 commentaires

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.



0
votes

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


0 commentaires