[Excel VBA] Zoekopdracht stopt na eerste hit?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Da_maniaC
  • Registratie: September 2004
  • Laatst online: 16-09 20:12

Da_maniaC

a.k.a. The Sequenz Pounder

Topicstarter
Ik heb een stukje VBA geschreven (na wat Google-Fu) dat een aantal handeling uitvoert voor iedere maal dat op de actieve sheet een waarde (voorbeeld: AAA) wordt gevonden.

Echter, telkens wanneer de eerste hit is behandeld stopt de code. In plaats van dat iedere occurrence van de waarde die wordt gevonden in de sheet wordt behandeld.

Kan iemand mij misschien uitleggen wat ik verkeerd doe? :?


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Dim Found As Range
    Dim FoundRegel As Long
    Dim FirstFoundAddr As String
    Dim ActiveFoundCell As Range
    Set SearchRange = Range("A:AZ")
      
    With SearchRange
    Set Found = Cells.Find(What:="AAA", LookIn:=xlFormulas, LookAt:=xlPart)
    If Not Found Is Nothing Then
    FirstFoundAddr = Found.Address
    FoundRegel = Found.Row
    End If
        Do Until Found Is Nothing
            If PlanWb.Sheets(CurSheet).Range("P" & FoundRegel).Value = 1 Then
            PlanWb.Sheets(CurSheet).Range("R" & FoundRegel).Value = 10
            PlanWb.Sheets(CurSheet).Range("S" & FoundRegel).Value = "Checked"
            PlanWb.Sheets(CurSheet).Range("Z" & FoundRegel).Value = "0:15"
            End If
        Set Found = .FindNext(After:=Found)
            If Found.Address = FirstFoundAddr Then Exit Do
        Loop
    End With

Inventory | Instagram: @sequenzpounder | http://www.zdaemon.org | ZDaemon! Client/Server port for DOOM!

Alle reacties


Acties:
  • +1 Henk 'm!

  • m-vw
  • Registratie: Mei 2013
  • Laatst online: 22:29

m-vw

Dus?

De code stopt niet, maar de waarde Foundregel wordt nooit aangepast.
Denk dat als je regels 10 en 11 ook nog eens tussen 20 en 21 zet je probleem opgelost is.

Acties:
  • +1 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:24

Reptile209

- gers -

@Da_maniaC: Ga eens met de step-debugger (F8) door de code lopen, dan zie je op welk punt hij er mee stopt en waarschijnlijk ook wel waarom. Dat helpt al een hoop in het troubleshooten.

Ik weet niet of het uitmaakt, maar in het FindNext-voorbeeld van Microsoft wordt niet Cells.Find() gebruikt, maar alleen .Find().
m-vw schreef op woensdag 1 mei 2024 @ 14:45:
De code stopt niet, maar de waarde Foundregel wordt nooit aangepast.
Denk dat als je regels 10 en 11 ook nog eens tussen 20 en 21 zet je probleem opgelost is.
FoundRegel wordt hier ook verder niet gebruikt, dus dat hindert niet :). FirstFoundAddr moet juist niet worden aangepast, daarmee zie je dat je 'rond' bent met zoeken en dat je kan stoppen (regel 20).

[ Voor 14% gewijzigd door Reptile209 op 01-05-2024 14:53 ]

Zo scherp als een voetbal!


Acties:
  • +1 Henk 'm!

  • Da_maniaC
  • Registratie: September 2004
  • Laatst online: 16-09 20:12

Da_maniaC

a.k.a. The Sequenz Pounder

Topicstarter
m-vw schreef op woensdag 1 mei 2024 @ 14:45:
De code stopt niet, maar de waarde Foundregel wordt nooit aangepast.
Denk dat als je regels 10 en 11 ook nog eens tussen 20 en 21 zet je probleem opgelost is.
Je had toch gelijk, Regel 11 moest inderdaad meegenomen worden in mijn Loop. Dan werkt het.
FirstFoundAddr moet niet mee in de Loop, dan hebben we geen check meer dat de hele file 1 maal is doorgelopen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    Dim Found As Range
    Dim FoundRegel As Long
    Dim FirstFoundAddr As String
    Dim ActiveFoundCell As Range
    Set SearchRange = Range("A:AZ")
      
    With SearchRange
    Set Found = Cells.Find(What:="AAA", LookIn:=xlFormulas, LookAt:=xlPart)
    If Not Found Is Nothing Then
    FirstFoundAddr = Found.Address

    End If
        Do Until Found Is Nothing
            FoundRegel = Found.Row
            If PlanWb.Sheets(CurSheet).Range("P" & FoundRegel).Value = 1 Then
            PlanWb.Sheets(CurSheet).Range("R" & FoundRegel).Value = 10
            PlanWb.Sheets(CurSheet).Range("S" & FoundRegel).Value = "Checked"
            PlanWb.Sheets(CurSheet).Range("Z" & FoundRegel).Value = "0:15"
            End If
        Set Found = .FindNext(After:=Found)
            If Found.Address = FirstFoundAddr Then Exit Do
        Loop
    End With

.
Reptile209 schreef op woensdag 1 mei 2024 @ 14:50:
@Da_maniaC: Ga eens met de step-debugger (F8) door de code lopen, dan zie je op welk punt hij er mee stopt en waarschijnlijk ook wel waarom. Dat helpt al een hoop in het troubleshooten.
Ik hoopte al dat het iets kleins was, maar dit zal ik de volgende keer eerst eens doen ja.
Ik gebruik ook veel Debug.Print voor het Immediate Window zodat ik na/tijdens uitvoer kan zien wat er met sommige variabelen gebeurd.

[ Voor 15% gewijzigd door Da_maniaC op 01-05-2024 15:10 ]

Inventory | Instagram: @sequenzpounder | http://www.zdaemon.org | ZDaemon! Client/Server port for DOOM!


Acties:
  • +1 Henk 'm!

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Ik geef vaak de voorkeur aan een for-nextlus.
Als het te doorzoeken bereik bv. A1:AZ600 is, dan kan dat zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Set Searchrange = range("A1:AZ600")
With Searchrange
For x = 1 To 600
For y = 1 To 52
If .Cells(x, y).Value = "AAA" Then
If .Cells(x, 16).Value = 1 Then
.Cells(x, 18).Value = 10
.Cells(x, 19).Value = "Checked"
.Cells(x, 26).Value = "0:15"
End If
End If
Next y, x
End With

Acties:
  • 0 Henk 'm!

  • Da_maniaC
  • Registratie: September 2004
  • Laatst online: 16-09 20:12

Da_maniaC

a.k.a. The Sequenz Pounder

Topicstarter
dix-neuf schreef op woensdag 1 mei 2024 @ 15:59:
Ik geef vaak de voorkeur aan een for-nextlus.
Als het te doorzoeken bereik bv. A1:AZ600 is, dan kan dat zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Set Searchrange = range("A1:AZ600")
With Searchrange
For x = 1 To 600
For y = 1 To 52
If .Cells(x, y).Value = "AAA" Then
If .Cells(x, 16).Value = 1 Then
.Cells(x, 18).Value = 10
.Cells(x, 19).Value = "Checked"
.Cells(x, 26).Value = "0:15"
End If
End If
Next y, x
End With
Werkt prima. Eerlijkgezegd wil ik graag methodes gebruiken die ook lekker makkelijk leesbaar zijn (dat vind ik soms belangrijker dan 2-4 lijnen code besparen).

Inventory | Instagram: @sequenzpounder | http://www.zdaemon.org | ZDaemon! Client/Server port for DOOM!


Acties:
  • 0 Henk 'm!

  • dix-neuf
  • Registratie: Juli 2018
  • Niet online
Da_maniaC schreef op woensdag 1 mei 2024 @ 16:11:
Eerlijkgezegd wil ik graag methodes gebruiken die ook lekker makkelijk leesbaar zijn (dat vind ik soms belangrijker dan 2-4 lijnen code besparen).
En vind je die for-nextlus niet makkelijk leesbaar?
Het is bijna gewoon Nederlands.

Acties:
  • 0 Henk 'm!

  • m-vw
  • Registratie: Mei 2013
  • Laatst online: 22:29

m-vw

Dus?

dix-neuf schreef op woensdag 1 mei 2024 @ 15:59:
Ik geef vaak de voorkeur aan een for-nextlus.
Als het te doorzoeken bereik bv. A1:AZ600 is, dan kan dat zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Set Searchrange = range("A1:AZ600")
With Searchrange
For x = 1 To 600
For y = 1 To 52
If .Cells(x, y).Value = "AAA" Then
If .Cells(x, 16).Value = 1 Then
.Cells(x, 18).Value = 10
.Cells(x, 19).Value = "Checked"
.Cells(x, 26).Value = "0:15"
End If
End If
Next y, x
End With
Maar hier bekijk je letterlijk iedere cel. Nu zal de Find-unctie ongetwijfeld achter de schermen hetzelfde doen, maar waarom daar dan zelf code voor schrijven.

Ik heb het niet uitgetest, maar ik vermoed dat de ingebouwde functie ook sneller is. Al zal je dat bij kleine data sets niet merken.

Acties:
  • 0 Henk 'm!

  • SinergyX
  • Registratie: November 2001
  • Laatst online: 22:25

SinergyX

____(>^^(>0o)>____

dix-neuf schreef op woensdag 1 mei 2024 @ 15:59:
Ik geef vaak de voorkeur aan een for-nextlus.
Als het te doorzoeken bereik bv. A1:AZ600 is, dan kan dat zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Set Searchrange = range("A1:AZ600")
With Searchrange
For x = 1 To 600
For y = 1 To 52
If .Cells(x, y).Value = "AAA" Then
If .Cells(x, 16).Value = 1 Then
.Cells(x, 18).Value = 10
.Cells(x, 19).Value = "Checked"
.Cells(x, 26).Value = "0:15"
End If
End If
Next y, x
End With
Maar dit script zoekt in elke cell dus of deze AAA bevat, ik weet de 'achtergrond' werking niet van de Excel .find functie, maar die lijkt me efficienter te werk gaan dan letterlijk elke cell af te gaan.

Nog 1 keertje.. het is SinergyX, niet SynergyX
Im as excited to be here as a 42 gnome warlock who rolled on a green pair of cloth boots but was given a epic staff of uber awsome noob pwning by accident.

Pagina: 1