Vraag


Acties:
  • 0 Henk 'm!

  • sph1980
  • Registratie: Januari 2014
  • Laatst online: 25-01 20:25
Tweede Excel vraag vandaag.
Ditmaal over VBA.

In voorbeelden wordt vaak DIM gebruikt om strings / arrays vast te leggen als getal, tekst etc.

Het werkt ook zonder DIM, waar merk je het wel gebruiken van DIM in?

Gaat de macro dan sneller, wordt het bestand kleiner oid?

Beste antwoord (via sph1980 op 27-11-2023 21:22)


  • dixet
  • Registratie: Februari 2010
  • Laatst online: 00:23
sph1980 schreef op maandag 27 november 2023 @ 19:50:
Tweede Excel vraag vandaag.
Ditmaal over VBA.

In voorbeelden wordt vaak DIM gebruikt om strings / arrays vast te leggen als getal, tekst etc.

Het werkt ook zonder DIM, waar merk je het wel gebruiken van DIM in?

Gaat de macro dan sneller, wordt het bestand kleiner oid?
Om je eerste vraag te beantwoorden (want dat is hierboven nog niet gebeurd volgens mij).
Zonder DIM zal VBA al je variabelen aanmaken met het type "Variant". Dat is een heel geheugenintensief datatype omdat alles er in past. Dus zowel tekst als getallen (met of zonder decimaal en zelfs objecten en arrays. Met DIM vertel je expliciet wat het datatypes is, wat geheugen bespaart en je programma sneller kan maken. Bij kleine VBA programma's zal je geen verschil merken.

Het is wel goed gebruikelijk om "Option Explicit" boven je code te zetten. Daarmee wordt je gedwongen alle variabelen te declareren. Voordeel is dat je geen tikfoutjes kan maken. Zonder "Option Explicit" zal een tikfout in een variabelenaam een nieuwe variabele opleveren, met onverwacht gedrag tot gevolg.
code:
1
Range("L1").Value = Range(k & r).Value
Hier plak je met de & operator twee getallen aan elkaar. Zoals je al opmerkt zijn in VBA rijen en kolommen een getal. Als je hier op cel E4 stond wordt je code dus uitgevoerd als:

code:
1
Range("L1").Value = Range(54).Value

(E4 = rij 5,kolom 4. 5&4 wordt 54).

De functie Range verwacht een celverwijzing in A1 formaat. Je kan in VBA ook de functie Cells gebruiken. Die verwacht een rij en kollomnummer. Deze code werkt wel:

code:
1
Range("L1").Value = Cells(r, k).Value

Alle reacties


Acties:
  • 0 Henk 'm!

  • Will_M
  • Registratie: Maart 2004
  • Niet online

Will_M

Intentionally Left Blank

sph1980 schreef op maandag 27 november 2023 @ 19:50:
Tweede Excel vraag vandaag.
Ditmaal over VBA.

In voorbeelden wordt vaak DIM gebruikt om strings / arrays vast te leggen als getal, tekst etc.

Het werkt ook zonder DIM, waar merk je het wel gebruiken van DIM in?

Gaat de macro dan sneller, wordt het bestand kleiner oid?
Is dit misschien HuisWerk??? :P

Plaats voor de grap onderstaande eens boven in je macro

code:
1
2
Option Explicit
On Error Resume Next


Alles wat je NIET correct 'Dimensioneerd' wordt gewoon NIET uitgevoerd en dankzij de 'On Error Resume Next' ook genegeerd zodat je Macro wel volledig blijft doen wat 'ie moet doen zónder errors.

Boldly going forward, 'cause we can't find reverse


Acties:
  • +1 Henk 'm!

  • ByteDelight
  • Registratie: Januari 2005
  • Laatst online: 02:48

ByteDelight

Retro computing is alive!

Will_M schreef op maandag 27 november 2023 @ 19:56:
[...]
Is dit misschien HuisWerk??? :P
Eens!
Googlen voordat je zoiets vraagt ;)

That being said: het gebruik van 'Option Explicit' is een manier om af te dwingen dat je juist omgaat met variabelen.
Ikzelf gebruik het niet (maar schrijf wel enorm veel VBA).
Vind het persoonlijk beetje kniesorenrij - gewoon goed opletten wat je doet, dan is het veelal niet noodzakelijk.

Retro Computer hardware: http://bytedelight.com


Acties:
  • 0 Henk 'm!

  • sph1980
  • Registratie: Januari 2014
  • Laatst online: 25-01 20:25
Geen huiswerk, daar ben ik wat te oud voor.
Ik weet waar het voor dient, wat de functie is van Google.
Maar.. Wanneer ik DIM niet gebruik werken mijn macro`s ook gewoon...
Wat is dan het grote voordeel van wel gebruiken van DIM?

Acties:
  • 0 Henk 'm!

  • Will_M
  • Registratie: Maart 2004
  • Niet online

Will_M

Intentionally Left Blank

sph1980 schreef op maandag 27 november 2023 @ 20:01:
Geen huiswerk, daar ben ik wat te oud voor.
Ik weet waar het voor dient, wat de functie is van Google.
Maar.. Wanneer ik DIM niet gebruik werken mijn macro`s ook gewoon...
Wat is dan het grote voordeel van wel gebruiken van DIM?
Nét (leren) coderen en correct omgaan met variabelen.

Boldly going forward, 'cause we can't find reverse


Acties:
  • 0 Henk 'm!

  • DVX73
  • Registratie: November 2012
  • Nu online
Even snel gegoogled en dit gevonden.
By declaring a variable, the user provides information to the VBA compiler about the variable data type and other information such as the level. The data type can either be an integer, text, decimal, Boolean, etc., whereas the variable level can be either procedure level, module-level, or public scoop. Variables should be declared using Dim, Private, Public, or Static statements.

When declaring variables to hold an integer using the Dim statement, use the code “Dim rowNumber as Integer.” The term “Dim” should appear at the preceding part of a variable. If the data type is not specified when declaring the variable or the variable is not declared at all, the variable will default to the variable data type that can accommodate any data type. By declaring a variable, the user is essentially telling the computer to reserve memory space for later use, allowing the VBA code to run smoothly.
bron: https://corporatefinancei...excel/vba-variable-types/

Acties:
  • 0 Henk 'm!

  • hackint0sh
  • Registratie: Mei 2019
  • Laatst online: 15-06-2024
Omdat het wel 2 seconden werk is: hier

Acties:
  • 0 Henk 'm!

  • sph1980
  • Registratie: Januari 2014
  • Laatst online: 25-01 20:25
Ja, sorry mijn Duits is niet zo goed...

Acties:
  • 0 Henk 'm!

  • sph1980
  • Registratie: Januari 2014
  • Laatst online: 25-01 20:25
Wat ik bv ook niet begrijp met DIM...
Als je een rij hebt gaat het over een nummer. Dit wordt een long.
Wanneer je het over een kolom hebt, dan gaat het ook over een nummer (ondankts A, B, C etc).

DIT GAAT WEL GOED
Dim r As Long
r = ActiveCell.Row
If r > 2 Then
Range("L1").Value = Range("A" & r).Value
Worksheets("VKF").Buttons("Knop 3").Text = Range("M1").Value & " MAP OPENEN"

Else

Range("L1").Value = ""
Worksheets("VKF").Buttons("Knop 3").Text = ""

End If
DIT GAAT NIET GOED
Dim r As Long
Dim k As Long
r = ActiveCell.Row
k = ActiveCell.Column
If r > 2 Then
Range("L1").Value = Range(k & r).Value
Worksheets("VKF").Buttons("Knop 3").Text = Range("M1").Value & " MAP OPENEN"

Else

Range("L1").Value = ""
Worksheets("VKF").Buttons("Knop 3").Text = ""

End If

Acties:
  • 0 Henk 'm!

  • Will_M
  • Registratie: Maart 2004
  • Niet online

Will_M

Intentionally Left Blank

sph1980 schreef op maandag 27 november 2023 @ 20:25:
Wat ik bv ook niet begrijp met DIM...
Als je een rij hebt gaat het over een nummer. Dit wordt een long.
Wanneer je het over een kolom hebt, dan gaat het ook over een nummer (ondankts A, B, C etc).

DIT GAAT WEL GOED

[...]


DIT GAAT NIET GOED

[...]
Je 'Set' 2 variabelen naar de gelijke Value (Long)? :9

Boldly going forward, 'cause we can't find reverse


Acties:
  • 0 Henk 'm!

  • sph1980
  • Registratie: Januari 2014
  • Laatst online: 25-01 20:25
r = ActiveCell.Row
k = ActiveCell.Column

Dan 'set' ik toch twee aparte variabelen naar elk hun eigen Value.

Dat bedoel ik dus met DIM.
Googlen is leuk, maar zulke specifieke dingen kan ik er niet uit halen.

[ Voor 31% gewijzigd door sph1980 op 27-11-2023 20:32 ]


Acties:
  • +1 Henk 'm!

  • biomass
  • Registratie: Augustus 2004
  • Laatst online: 02-10 18:51
Will_M schreef op maandag 27 november 2023 @ 19:56:
[...]

Alles wat je NIET correct 'Dimensioneerd' wordt gewoon NIET uitgevoerd en dankzij de 'On Error Resume Next' ook genegeerd zodat je Macro wel volledig blijft doen wat 'ie moet doen zónder errors.
subtieler, bij alles wat je declareert gaan de automatische conversies van variabelen waarschijnlijk doen wat je verwacht. Als de compiler concludeert dat je een conversie probeert die die niet kan uitvoeren, krijg je een compile error.
ByteDelight schreef op maandag 27 november 2023 @ 19:59:
[...]
Vind het persoonlijk beetje kniesorenrij - gewoon goed opletten wat je doet, dan is het veelal niet noodzakelijk.
Zodra iemand anders je code moet aanpassen is het prettig als het aanstaat, dat scheelt aannames met vreemde initialisatie en/of variable scope issues.

De grootste draak van een operator binnen VBA, de & operator met al zijn automatische operand conversies, zorgt hier voor de verwarring in het gegeven voorbeeld.
@TS, druk binnen de VBA editor op F2 en bekijk de eigenschappen van het Range object eens. De eigenschappen Column en Row zijn van het type Long.
In je eerste voorbeeld code vraag je een van de waarden onder A2 op, in het tweede voorbeeld probeer je een Range object te krijgen op basis van de som van 'kolom' +'rij'. Ik vermoed dat dat niet de bedoeling is.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • dixet
  • Registratie: Februari 2010
  • Laatst online: 00:23
sph1980 schreef op maandag 27 november 2023 @ 19:50:
Tweede Excel vraag vandaag.
Ditmaal over VBA.

In voorbeelden wordt vaak DIM gebruikt om strings / arrays vast te leggen als getal, tekst etc.

Het werkt ook zonder DIM, waar merk je het wel gebruiken van DIM in?

Gaat de macro dan sneller, wordt het bestand kleiner oid?
Om je eerste vraag te beantwoorden (want dat is hierboven nog niet gebeurd volgens mij).
Zonder DIM zal VBA al je variabelen aanmaken met het type "Variant". Dat is een heel geheugenintensief datatype omdat alles er in past. Dus zowel tekst als getallen (met of zonder decimaal en zelfs objecten en arrays. Met DIM vertel je expliciet wat het datatypes is, wat geheugen bespaart en je programma sneller kan maken. Bij kleine VBA programma's zal je geen verschil merken.

Het is wel goed gebruikelijk om "Option Explicit" boven je code te zetten. Daarmee wordt je gedwongen alle variabelen te declareren. Voordeel is dat je geen tikfoutjes kan maken. Zonder "Option Explicit" zal een tikfout in een variabelenaam een nieuwe variabele opleveren, met onverwacht gedrag tot gevolg.
code:
1
Range("L1").Value = Range(k & r).Value
Hier plak je met de & operator twee getallen aan elkaar. Zoals je al opmerkt zijn in VBA rijen en kolommen een getal. Als je hier op cel E4 stond wordt je code dus uitgevoerd als:

code:
1
Range("L1").Value = Range(54).Value

(E4 = rij 5,kolom 4. 5&4 wordt 54).

De functie Range verwacht een celverwijzing in A1 formaat. Je kan in VBA ook de functie Cells gebruiken. Die verwacht een rij en kollomnummer. Deze code werkt wel:

code:
1
Range("L1").Value = Cells(r, k).Value

Acties:
  • 0 Henk 'm!

  • sph1980
  • Registratie: Januari 2014
  • Laatst online: 25-01 20:25
VOORGANGER HEEFT AL GEREAGEERD, DE & MOET EEN , ZIJN.
DUIDELIJK, GEEN DECLARATIEFOUT DUS...

Ik probeerde hetzelfde te bereiken als met

IK HEB IN CEL D4 STAAN "TEST"
IK HEB CEL D4 GESELECTEERD
Range("L1").Value = Target.Value
L1 wordt dan "TEST"

IK HEB IN CEL D4 STAAN "TEST"
IK HEB CEL D4 GESELECTEERD
r = ActiveCell.Row
k = ActiveCell.Column

Range("L1").Value = Range(k & r).Value >>> DIT GAAT FOUT
Range("L1").Value = Range("D" & r).Value >> DIT GAAT GOED, MAAR ZO GAAT HET NIET PER KOLOM

[ Voor 10% gewijzigd door sph1980 op 27-11-2023 21:22 ]

Pagina: 1