• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

vba hulp

Status
Niet open voor verdere reacties.

MJONK

Gebruiker
Lid geworden
14 dec 2008
Berichten
238
Hallo, ik ben bezig met een zelfstudie VBA vanuit een boek, nu zit ik echter zonder het boek iets heel erg simpels te proberen maar het wil me niet lukken. waarschijnlijk vergeet ik iets makkelijks;

Ik heb onderstaande code, wat ik wil is dat hij voor iedere waarde in het bereik controleert of de waarde 1 is, zoja moet hij ernaast 10 invoeren, als het geen één is, dan moet er 30 komen te staan. mijn code tot nu toe is dit:

Sub Macro1()
'
' Macro1 Macro
'

'


For Each n In Sheets(1).Range("A1:A40")

If n.Value = 1 Then
Cells(n).Offset(0, 1) = 10
Else
Cells(n).Offset(0, 1) = 30
End If

Next



End Sub

Hopelijk is er iemand die mij kan uitleggen wat er mis is.
 
Probeer dit, je zult aan de code waarschijnlijk zelf wel zien wat je fout hebt gedaan.
Code:
Sub Macro1()
dim n as range
For Each n In Sheets(1).Range("A1:A40")
If n.Value = 1 Then
n.Offset(0, 1) = 10
Else
n.Offset(0, 1) = 30
End If
Next
End Sub
 
ik snap hem!

top, bedankt voor de assistentie.

Nu is mijn vraag, is die eerste regel noodzakelijk? want volgens mij werkt het zonder die eerste regel ook. Of is dit voor de snelheid of iets dergelijks???

met vriendelijke groet
 
Kan eventueel nog iets korter (maar is niet per se nodig) aldus:
Code:
Sub macro2()
Dim n As Range
For Each n In Sheets(1).Range("A1:A40")
n.Offset(0, 1) = 30
If n.Value = 1 Then n.Offset(0, 1) = 10
Next
End Sub
 
Nu is mijn vraag, is die eerste regel noodzakelijk? want volgens mij werkt het zonder die eerste regel ook. Of is dit voor de snelheid of iets dergelijks???
Nee, die is niet noodzakelijk.
Maar het wordt beschouwd als "netjes" programmeren, als je variabelen wél declareert.
Bovendien is het zo, dat als je een variabele niet declareert, die wordt beschouwd als een variant en die neemt in het geheugen 8 keer zoveel plaats in als bv. een integer. Maar je zult begrijpen: met de geheugens van tegenwoordig en met zo'n erg kleine macro, maakt dat niet veel uit.
 
duidelijk! wel gebruiken dus.

bedankt voor de hulp (les)
 
Bovendien is het zo, dat als je een variabele niet declareert, die wordt beschouwd als een variant en die neemt in het geheugen 8 keer zoveel plaats in als bv. een integer.
De eerste stelling in deze zin is onjuist.
test maar met

Code:
c0="zomaar wat tekst"
c1=vartype(c0)

Ik zou jouw macro zo maken
Code:
Sub macro2()
  For Each cl In [Blad1!A1:A40]
    cl.Offset(, 1) = iif(cl=1,10,30)
  Next
End Sub

of

Code:
Sub macro2()
  sq=[Blad1!A1:A40]
  For j=1 to ubound(sq) 
    sq(j,1) = iif(sq(j,1)=1,10,30)
  Next
  [Blad1!B1:B40]=sq
End Sub

toelichting: hoe meer je verwerkt in het geheugen en hoe minder schrijfakties in het werkblad hoe sneller de code (want bijvoorbeeld geen recalculate en screenupdating)
 
Laatst bewerkt:
Hallo snb,

Jouw eerste voorbeeld kan ik nog begrijpen, het tweede lukt me niet helemaal nog.

MIsschien komt dat in de toekomst ook nog goed.

bedankt voor de aanvulling
 
snb, n.a.v. je opmerking m.b.t. (het declareren van) variabelen:

1. Als je in een macro een variabele wel declareert, maar er niet bij vermeldt als wát je die declareert, bv.
Dim n
dan wordt hij (denk ik toch) beschouwd als een variant.

2. Als we in de macro die ik voor MJONK postte:
Code:
Sub macro2()
Dim n As Range
For Each n In Sheets(1).Range("A1:A40")
n.Offset(0, 1) = 30
If n.Value = 1 Then n.Offset(0, 1) = 10
Next
End Sub
het vartype van n opvragen, dan krijgen we logischerwijs als resultaat: 9 (een range is immers een object).
Laten we de dim-opdracht weg, dan krijgen we als resultaat: 0 (vbempty, een niet-geïnitialiseerde constante).
En daarvan zegt deze webpagina van MS:
http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.constants.vbempty.aspx

"Indicates the type of a variant object, returned by the VarType function".

Zie ik iets over het hoofd ?
'

snb zei:
hoe meer je verwerkt in het geheugen en hoe minder schrijfakties in het werkblad hoe sneller de code (want bijvoorbeeld geen recalculate en screenupdating)
Dat ben ik met je eens.
Maar als je zo weinig mogelijk beroep wil doen op het geheugen, dan begrijp
ik niet goed dat je de variabelen in je macro's hierboven niet declareert,
daarmee spaar je toch geheugenruimte?
 
@zapatr

Doe eens:

Code:
Sub macro2()
[COLOR="Green"]'   Dim cl As Range[/COLOR]
   For Each cl In Sheets(1).Range("A1:A40")
[COLOR="Blue"]     c4 = VarType(cl)[/COLOR]
     cl.Offset(0, 1) = 30
     If cl.Value = 1 Then cl.Offset(0, 1) = 10
   Next
End Sub

Haal vervolgens de apostrof weg en constateer dat het vartype met en zonder dim (ondanks de toevoeging) niet verschilt.

De snelheidswinst bij het voorkomen van calculate en screenupdating is vele malen groter dan bij het declareren van variabelen (if any). Bij het werken in het geheugen gaat het er niet om zo min mogelijk geheugenruimte te gebruiken (wat de achtergrond bij het declareren is), maar om onnodige bewerkingen te voorkomen.
 
Laatst bewerkt:
Haal de apostrof weg en constateer dat het vartype met en zonder dim (ondanks de toevoeging) niet verschilt.
Klopt. Waar ligt dat dan aan dat in het ene geval het onderscheid wel
wordt gemaakt en in het andere geval niet?

In elk geval: Microsoft zegt dat die variable een variant is...
 
En VBA toont wat anders. Consistentie is niet de sterkste kant van MS.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan