Leesbaarheid DIM

Status
Niet open voor verdere reacties.

masala09

Gebruiker
Lid geworden
6 aug 2012
Berichten
886
Zomaar een vraag.

Ik vraag mij af hoe ik het beste de DIM leesbaar kan houden. Velen zie ik hier wel eens over schrijven, maar naar mijn beleving doet niet iedereen hetzelfde. Nu schrijf ik alles wat bij DIM hoort met een tab extra. Zie onder voor een voorbeeld.

Code:
Dim NBO, TrimString 'NBO is Nummer Besteloverzicht
    NBO = Range("B3")
    TrimString = LTrim(NBO)

    On Error Resume Next
        
    'Opslaan op HDD als .pdf & .xps
    
    rMkDir "D:\Materiaal\Materiaal PDF\" & Year(Date)
    Sheets("Opzet").ExportAsFixedFormat 0, "D:\Materiaal\Materiaal PDF\" & Year(Date) & "\" & LTrim(NBO) & ".pdf"
    
    rMkDir "D:\Materiaal\Materiaal XPS\" & Year(Date)
    Sheets("Opzet").ExportAsFixedFormat 1, "D:\Materiaal\Materiaal XPS\" & Year(Date) & "\" & LTrim(NBO) & ".xps"
    
    'Wegschrijven naar Database
            
    With Me
       Application.ScreenUpdating = False


Of zijn er niet echt " regels " voor.
 
Laatst bewerkt:
Met de DIM opdracht declareer je een variabele waarbij je er tevens een datatype aan toekent. Dat zie ik in je code niet terug. Tevens valt het me op dat iedereen die blijkbaar, no offence, weinig kaas gegeten heeft van programmeren, te pas en te onpas met de opdracht On Error Resume Next strooit. Die opdracht is ervoor om te zorgen dat je foutmeldingen niet ziet. Het voorkomt echter niet dat de fouten wel degelijk gebeuren en dan dus in de code zelf moeten worden afgevangen. Ook dat zie ik in je code niet terug.
 
De code hierboven is inderdaad niet compleet en daar ging het mij eerlijk gezegd ook niet om, maar om door te gaan op jou input.

Met deze Dim wilde ik ervoor zorgen dat de verkregen voorloopspaties die in de loop van de procedure ongewild zijn toegevoegd verwijderd worden voordat het bestand wordt weggeschreven en wordt opgeslagen. Ik heb in een userform verzonken labels staan. Zodra hier gegevens in werden geplaatst, stond de eerste letter direct tegen de linkerzijkant van het label aan waardoor de eerste letter moeilijker leesbaar werd. Zodoende heb ik middels " " elders een spatie voor het gegeven geplaatst zodat de tekst makkelijker leesbaar werd. Echter die ene spatie werd telkens meegenomen in cel B3 en ook weer meegenomen in het wegschrijven naar het datablad en het opslaan als PDF. Opzicht niet zo'n probleem, maar iedere keer als dan de hoogste waarde op het datablad werd opgehaald om vervolgens met 1 te verhogen, kwam er weer een ongewilde spatie bij zodra het nummer in het label werd geplaatst. Vervolgens ging die extra spatie werd die spatie weer overal in mee genomen met uiteindelijk resultaat dat de naam van het bestand telkens met een voorloopspatie werd aangevuld. Zo ontstond er langzaam een trappetje:

Hoi
Hoi
Hoi
Hoi
Hoi

Op deze wijze heb ik het dus voor elkaar gekregen om de bestelnummers allemaal netjes onder elkaar te houden.

De on error resume next in deze code is feitelijk een exact kopie van een code die Rudi mij ooit eens heeft gegeven voor wegschrijven naar een datablad en het opslaan als PDF. Ik heb hier feitelijk nooit verder naar om gekeken. Ik plaats deze er zelf bij zodra er iets mis gaat als er bijvoorbeeld gegevens missen omdat deze er simelweg niet zijn. Bijvoorbeeld bij de VLookup en het wegschrijven van die gegevens naar labels. Als er dan voor een label geen gegevens bestaan, kwam er een foutmelding en stopte de procedure. Door deze error resume te gebruiken, ging de code gewoon door en werd de rest van de cellen waar wel gegevens in staan in de bijbehorende labels geplaatst. Hoe ik dit anders kan voorkomen. Zover ben ik nog niet.
 
Laatst bewerkt:
Om op je oorspronkelijke vraag terug te komen (hoe hou ik declaraties simpel): begin in ieder geval met het toekennen van het juiste gegevenstype, want nu gebruik je alles als variant. Zelf hou ik strings bij elkaar, en Integers bij elkaar etc. zodat ik snel kan zien of ik alle variabelen wel heb. Dus zo:
Code:
Dim NBO As String, TrimString As String
Dim i As Integer, z as Integer
Of je zet ze onder elkaar:
Code:
Dim NBO As String 'NBO is Nummer Besteloverzicht
Dim TrimString As String 'TrimString is geschoonde cel
Dim i As Integer
Dim  z as Integer
Wat je handig vindt :)
 
Je kunt ook "Option Explicit" aanzetten, dan kun je het ook niet vergeten.

Regels die ik zelf aanhoud: gegroepeerd per functie, bovenaan gedeclareerd in de scope waar ze gebruikt worden. Echter is VBA niet echt gemaakt voor makkelijk en leesbaar code schrijven.
 
Als ik option explicit gebruik dan schieten inderdaad een aantal fouten om mijn oren heen.

Bijvoorbeeld:
Code:
                For i = Range("A9000").End(xlUp).Offset(-3).End(xlUp).Row To 24 Step -1
                If Cells(i, 1) > 0 Then Rows(i).EntireRow.Delete

Deze geeft een foutmelding op i

Als ik nu het volgende er van maak:

Code:
Dim i As Long
                For i = Range("A9000").End(xlUp).Offset(-3).End(xlUp).Row To 24 Step -1
                If Cells(i, 1) > 0 Then Rows(i).EntireRow.Delete

Dan ben ik de fout weer kwijt...

Of ik het nu dan goed heb gedaan???

Ik ben nog niet zo heel lang bezig met DIM. Ik probeer hier en daar wel wat uit en volgens mij lukt het aardig.

Maar is option explicit dan zo belangrijk??

Octafisch:

Wat heb jij nu gedaan met die code?? Deze code had ik niet zelf gemaakt. Ik had deze gevonden met het zoeken naar het verwijderen van voorloopspaties. Deze vond ik uit mijn hoofd gezegd op de site van Microsoft. Inderdaad nu ik de code dieper bekijk, zijn het inderdaad een tweetal DIM's. Vreemd dat ik dit niet eerder had gezien, maar dat zal wel komen door mijn weinige ervaring. Als ik nu zo kijk bij jou heb je NBO en Trimstring apart gedeclareerd. Echter in eerste had ik bij NBO een range staan waar jij nu i heb staan en voor Trimstring had ik LTrim (NBO), waar jij nu z voor hebt staan.
 
Daarbij heb ik al gemerkt dat er verschillende DIM's zijn. Ook hier zal ik een weg door moeten banen.
 
De opdracht Option Explicit dwingt af dat je alle gebruikte variabelen verplicht moet declareren. Zo kun je er nooit een vergeten.
 
Mee eens Edmoor. Dat had ik inderdaad al gelezen, maar ben ik in post 6 dan ook echt de Dim vergeten, want ik heb daar het idee dat die helemaal niet nodig is. Immers zonder deze deed de code het ook.

En dan integer, long..... tja welke moet ik gebruiken dat is mij vaak ook nog onduidelijk. Lezende zie ik dat dit volgens mij te maken heeft met de range.
 
Laatst bewerkt:
Een variabele hoeft niet verplicht gedeclareerd te worden. Maar het is altijd verstandig dat wel te doen. Met verschillende DIM's bedoel je waarschijnlijk dat DIM op meer plaatsen voor kan komen. Dat klopt en waar je een variabele declareert (DIMmed) is afhankelijk van welk bereik je een variabele wilt geven. Dus, moet hij alleen gelden in 1 SUB of FUNCTION, in de hele module of in het complete project. Dat heet de Scope (bereik) van een variabele.

http://support.microsoft.com/kb/141693/nl
 
Laatst bewerkt:
Ik snap daar even helemaal niets van. Heeft dit te maken met integer enzo??

In hoeverre je de DIM bereikbaar maakt, was volgens mij enkel voor in de sub waar deze in staat. Kennelijk kan dat dus ook over de gehele code in alle userforms en modules alsmede bladen enzo.
 
Ik snap daar even helemaal niets van. Heeft dit te maken met integer enzo??

Met de DIM opdracht ken je een datatype aan de variabele toe. Daarmee bepaal wat voor een soort waarde een variabele kan bevatten. Je noemde al de Integer. Een variabele van het type Integer kan een geheel getal bevatten van een bepaalde minimale en maximale grootte. Met het type String geef je aan dat een variabele tekst kan bevatten. Zo zijn er nog veel meer en ze hebben allemaal te maken met geheugengebruik:

http://msdn.microsoft.com/en-us/library/47zceaw7.aspx
 
Laatst bewerkt:
Je zult het met VBA niet vaak tegenkomen dat het echt veel verschil maakt, maar in het algemeen maken je declaraties je code robuuster.

Bij niet declareren gokt de compiler wat je wil. Dit kan ongewenste/onverwachte gevolgen hebben voor je code.

In een module zonder option explicit probeer dit maar eens:

Code:
dim i as long
j = 1.3
i = 1.3
msgbox (i & "< i j> " & j)
 
Dat bedoelde ik... het was geheugengebruik. Sorry.

Oke voor even mijn eigen... het maakt dus niets uit hoe je voor de "leesbaarheid" de boel invult. Of dat nu met of zonder tabs is. Even doelend op de DIM dan. Ik kan dus gewoon alles onder elkaar zetten of hoe ik het zelf prettig vind.

Goed terug naar #3. Snap je mijn bedoeling i.v.m. de voorloopspaties?

Verder de on error resume next... Die plaats ik eigenlijk op het moment dat ik een foutmelding krijg. Ik kijk dan waar het fout gaat en of dat het erg is als de fout wordt genegeerd. In mijn voorbeeld bijvoorbeeld met het invullen van labels als de betreffende cel geen waarde bevat en dus wel gewoon kan worden overgeslagen.
 
Wampier jouw code uitgeprobeerd.

Ik krijg inderdaad eerst geen foutmelding. Zodra ik dan option explicit gebruik slaat de code vast op "j".
Als ik nu inderdaad een DIM j as long gebruik, loopt de code door.

Echter wat ik wel merk is dat er slechts 1 <ij> 1 komt te staan in het msgbox en geen 1.3 <ij> 1,3.

Maar daar komt het met wat Edmoor beschreef de variant: As String

Dan krijg ik wel 1,3 <ij> 1,3
 
Laatst bewerkt:
Sorry de datatype.... zucht al die benamingen..........scope, datatype.......
 
Niet om je in verwarring te brengen, maar Variant is ook een datatype. Als je een variabele DIMmed zonder datatype is deze van het type variant. Dat is qua geheugengebruik een "dure" en het is dus altijd verstandig om een variabele het juiste datatype toe te kennen.
 
Inderdaad. Maar het is niet "slechts" een 1. Een "long" kan geen kommagetallen bevatten. Met de DIM AS LONG weet de compiler dat dit ook niet mag en maakt er een bruikbaar getal van. In dit geval "1".

Als je geen DIM gebruikt "gokt" de compiler dat het OF een double OF een string moet zijn. Met beide zal rekening gehouden worden. Indien je in een vervolgstap echter alleen een geheel getal verwacht zal je code op een onverwachte plaats en/of manier vastslaan.
 
:shocked::confused::(

Heeft iemand een hamer voor mijn icoontje waarmee ik mij ook nog eens op de kop kan rammen......

Wampier ik snap het stukje van jou. Had ik eerlijk gezegd al een beetje zelf uitgevonden, maar kon het niet benoemen. Wel heb ik weer een stukje erbij geleerd.

Edmoor. Kon jij nog antwoord geven op #14
 
Verzonken labels met het Tahoma lettertype geven inderdaad een lastig te lezen eerste letter. Die spaties vond ik geen oplossing, al verbeterd het wel de leesbaarheid. Test eens wat andere lettertypes. Als je toch een spatie ervoor wilt, haal deze er dan af op het moment dat je iets met de labelcaption wilt doen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan