Probleem met combinatie Do while/If

Status
Niet open voor verdere reacties.

AMBERTJE

Gebruiker
Lid geworden
27 aug 2009
Berichten
121
Goedmiddag aan allen,

Ik heb een probleempje in mijn iteratie, telkens krijg ik de melding "End If without If block:
Dit is de originele code die werkte maar toen zocht ik enkel op cellen waar de 3 eerste karakters beginnen met "161":
Code:
'     Do While Cells(rij, 4) > 0
'           Cells(rij, 15).Formula = "=+RC[-11]*100+RC[-10]"
'          Cells(rij, 16).Formula = "=if(left(RC[-1],3)=""161"",1,0)"
'            rij = rij + 1
'      Loop
Nu moet ik ook de rijen zoeken waarvan de 3 eerste karaters beginnen met "261"

'1ste poging
Code:
 Do While Cells(rij, 4) > 0
           Cells(rij, 15).Formula = "=+RC[-11]*100+RC[-10]"
          Cells(rij, 16).Formula = "=if(left(RC[-1],3)=""161"" OR ""261"" ,1,0)"
            rij = rij + 1
      Loop

'2de poging
Code:
  Do While Cells(rij, 4) > 0
           Cells(rij, 15).Formula = "=+RC[-11]*100+RC[-10]"
           
          If Cells(rij, 15) = Left(Filter1, 3) = "161" Or Cells(rij, 15) = Left(Filter1, 3) = "261" Then Cells(rij, 16) = 1
          End If
            rij = rij + 1
      Loop


3de poging:

Code:
Do While Cells(rij, 4) > 0
           Cells(rij, 15).Formula = "=+RC[-11]*100+RC[-10]"
          Cells(rij, 16).Formula = "=if(left(RC[-1],3)=""161"" OR ""261"" ,1,0)"
            rij = rij + 1
      Loop


Kan iemand me helpen aub???
Groetjes,
Ambertje
 
Laatst bewerkt door een moderator:
toepassing van If in VB:

omdat VB niet als andere talen een regeleinde kent moet elk commando op een nieuwe regel.

zet je meerder commandos op een regel dan ontstaat er een andere constructie.


geldig:
if (a=1) Then A=2 else A=4 -> ik heb geen "End if" nodig. Dit heet inline coding.

geldig:
Code:
if (a=1) Then
  a=2
Else
 a=3
End If
omdat het If command niet op 1 regel staat moet de compiler weten wanneer de if is afgelopen.

ongeldig:
Code:
If (a=2) Then A=1
Else A=3

ongeldig
Code:
if (a=2) Then A=1
Else A=3
End If

door de voorwaarde tussen () te zetten houd je duidelijker in beeld wat de voorwaarde is en wat de actie.
is de actie een enkel commando dan kun je inline coding gebruiken.
is je actie complexer dan kun je beter de full coding gebruiken.
krijg je meldingen over "end if zonder IF" dan is het vaak een gebruik van inline coding op een verkeerde manier. Pas dan je coding naar een full versie en controleer opnieuw.
in je 2e voorbeeld staat er duidelijk een end if te veel.
in je 3e voorbeeld heb je wel een voorwaarde gesteld maar geen actie eraan gehangen
 
Laatst bewerkt door een moderator:
je gebruikt OF:
Code:
if a = b then
    xxx
end if
of
Code:
if a = then xxx

Overigens begrijp ik niet waarom je formule's aan het doortrekken bent met VBA op deze manier? Lijkt me niet erg efficient.
 
@wampier: kleine correctie: if a= then xxx ----> if a = b then xxx.
typ foutje ;-)
 
Als dit werkt: Cells(rij, 16).Formula = "=if(left(RC[-1],3)=""161"",1,0)"

Dan zou ik verwachten dat dit ook moet werken (in jouwe 1ste poging):
Cells(rij, 16).Formula = "=if(left(RC[-1],3)=""161"" OR left(RC[-1],3)=""261"" ,1,0)"

Tijs.
 
Dat dacht ik ook maar niets is minder waar.

Ik moet wel zeggen dat ik geen programmeur ben en dat mijn kennis vrij beperkt is.

Ambertje
 
Wampier,

Dit is code die ik niet zelf heb geschreven maar heb overgeërfd, de eigenaar van deze code werkt niet meer bij ons.
Jaren heeft dit tooltje gewerkt maar nu moet er een aanpassing gedaan worden door mij (een VBA leek).

Ik heb uw raad proberen opvolgen maar het werkt nog steeds niet, zou je mij kunnen laten zien hoe jij dit zou oplossen aub?

Grtjs,
Ambertje
 
is het een optie om de 1,0 te vervangen door een text popup om te kijken of de voorwaarde true or false is?
 
in de voetsporen van dnties:

Cells(rij, 16).Formula = "=if(left(RC[-1],3)=""161"" OR left(RC[-1],3)=""261"" , MsgBox "getal is 161 of 261" , MsgBox "ander getal")"
 
volgens mij kun je beter van het inline systeem afstappen om het makkelijker te maken
laat je do loop een sub-routine aanspreken die het uitzoeken voor je doet.

voorbeeldje:
Code:
Private Sub Worksheet_Calculate()

If Sheets("MySheet").Range("A1").Value = 261 Then
    MsgBox "de waarde is 261", vbOKOnly
End If

End Sub
of laat de do- loop ook door de sub doen en spreek meteen de sub aan.


Je hebt toch wel iets verstand van VBA of ben je helemaal groen?
 
Laatst bewerkt:
Beantwoord nog steeds mijn vraag niet: waarom VBA runnen om vervolgens een formule te plakken? waar is de meerwaarde?

Met VBA alleen kun je met een paar regels wel 100 verschillende waarden laten controleren en 0/1 plaatsen in een cel. Ik snap dat het mogelijk buiten het directe probleem ligt.

Als je toch de formule kant opgaat : eerst even uitschrijven in een cel en vervolgens die formule plaatsen in VBA
 
@wampier: helemaal over heen gelezen: goed punt.
Vorige bouwer heeft een rare constructie gebouwd.
Oplossing is de hele formule weghalen en met VBA een resultaat laten plaatsen.
 
Heb je al eens overwogen om, conform de forumsuggesties,hier een voorbeeldbestand te plaatsen ?

blijkbaar gaat erom:

als kolom D een 1 of een 2 bevat en kolom E bevat 61 dan komt in kolom P een 1 te staan.

Code:
[P1:P200]=[index(((D1:D200=1)+(D1:D200=2))*(E1:E200=61),)]
 
Laatst bewerkt:
Ik heb de raad van Wampier opgevolgd en dit is de formule in excel:

Code:
=IF(LEFT(D2;3)="161";IF(LEFT(D2;3)="261";0;1);0)
Hoe krijg ik dit nu in het stukje VBA code dat ik initieel gepost had? In bijlage een voorbeeld van het excel bestand.Bekijk bijlage StockCodes.xlsx
 
Jammer dat je geen bestand toevoegde waarin ook je macro staat, dan werden de fouten meteen duidelijk.
En als je toch vba gebruikt, zou ik via vba geen formules in cellen plaatsen, maar vba zonder die formules het werk laten doen.
 
De macro in het bestand is door anderen geschreven en het is moeilijk om deze mee te sturen omdat er via absolute paths een .txt bestand wordt ingelezen in excel.
Heel de macro bevat zulke verwijzingen met formules om de cellen te manipuleren.

Het is niet mijn bedoeling deze macro helemaal te herschrijven maar enkel dit stukje aan te passen.
Zou er iemand mij kunnen helpen dit stukje om te vormen aub?

Ambertje
 
Bladnaam in de code zonodig aanpassen.
En dat met rij 2 begonnen moet worden, zal in je macro wel reeds eerder ingesteld zijn.
En verder is het gewoon zoals hierboven door anderen reeds werd weergegeven.
Code:
With Sheets("UNLCODES2")
rij = 2
Do While .Cells(rij, 4) > 0
.Cells(rij, 15).Formula = "=+RC[-11]*100+RC[-10]"
.Cells(rij, 16).Formula = "=if(or(left(RC[-1],3)=""161"",left(RC[-1],3)=""162""),1,0)"
rij = rij + 1
Loop
End With
 
Zapatr,
duizendmaal dank, eindelijk werkt de macro zoals ik het wou.
Het verschil tussen de code die door anderen werd weergeven ligt in de positie van de 'OR', bij u komt die onmiddelijk na de IF.
Dit is dus de oplossing en het lijkt me wel een onlogische plaats maar ik ben superblij dat het eindelijk werkt.

:love:
Een welgemeende merci aan allen die hebben geholpen bij het geven van de oplossing
Ambertje
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan