10. juni 2009 - 12:58Der er
13 kommentarer og 1 løsning
Dim nulstiller IKKE min variabel
Jeg har en procedure med erklæringen
Dim X as string
Den nulstiller IKKE x, hvis f.eks. proceduren kaldes i et loop, men beholder f.eks. værdien fra sidste loop.
Dette sker både i 2003 og 2007.
Når jeg ser hjælpen for Dim foranlediges jeg til at tro, at jeg så skal bruge "New":
Dim X as New String
Men så får jeg "Identifier expectet"
Hvad skal der til for at X er "" med statsgaranti lige efter erklæringen? Jeg kan ikke bruge "Så sæt den til blank", for det gælder også komplekse typer, hvor jeg ikke har lyst til at gå igennem dem allesammen for at nulstille dem.
Dim er jo en forkortelse af Dimension, altså hvilekn dimension kan variablen indeholde:
Dim As String > Både alfasnumerisk og numeriske værdier Dim as Byte > Kun numeriske værdier op til en vis størrelse. Her er også Long og Double Dim as Variant > Alt muligt Og jeg har sikkert glemt nogle
Det læser jeg som, at syntaksen ved brug af New i mit tilfælde er
Dim X as new string
Eller?
Synes godt om
Slettet bruger
10. juni 2009 - 14:09#3
Eller?
Ellers godt forsøgt - du spotter noget du lige mangler ;)
Men ...
'as new' går på objekter - følgende er synonyme:
1. Dim C as new Collection
2. Dim c as Collection Set c=new Collection
de simple typer som string er ikke en klasse der kan instantieres objekter fra, så new kan ikke bruges her.
Iøvrigt er ordet dim, der har været med os siden de første basic versioner sidst i 70'erne, stort set intetsigende - det giver højst lidt mening når det drejer sig arrays.
Det du siterer fra, er det noget Microsoft info? Måske allokeres der space (i nogle tilfælder), men det giver også et fejlagtigt indtryk af at der 'sker noget' i en dim statement.
Første gang en variable BRUGES ELLER REFERERES initialiseres den.
Hvorfor er det for komplekst selv at tildele værdi- har du noget kode vi må se?
Type BrPar ReturKode As String OrgNo As String KommuneKode As String Kommune_navn As String Sektor As String Sektor_navn As String Sektor_VPS As String Nace As String Nace_navn As String OrgNavn As String Isin As String LangtOrgNavn As String LangtVpNavn As String TimeStampDato As Date TransMode As Integer End Type
'' og i koden:
Dim brvar As BrPar Dim OrgNoMsg As String If OrgNoMsg <> "" Then MsgBox "What" 'Her stopper den <<--- brvar.Nace_navn = "" ' mystiks fejl. Denne (og de andre) er IKKE blanke, selvom de netop er erklæret!
___
Det vil være lidt tungt at skulle nulstille alle disse variable før jeg gik i gang med programmeringen - også med "with":
ps jeg citerer fra den hjælp, der kommer, når jeg står på Dim og trykker F1.
Synes godt om
Slettet bruger
10. juni 2009 - 15:39#6
Jeg kan ikke se noget fejl i det du har postet - der må have været noget kode før der har tildelt værdi til BrPar.
Sub verifyThatDimDontInitaliseAnything() Do Dim br As BrPar br.KommuneKode = br.KommuneKode & "-komkode-" Loop Until Len(br.KommuneKode) > 80 Debug.Print br.KommuneKode End Sub
På overfladen er vba et røvsygt sprog - først når man dykker ned i disse detaljer bliver det interessant.
To workarounds for at kunne genbruge en BrPar
1. Sub testtypestuff()
Dim br(2) As BrPar 'br(0) er den der bruges br(0).KommuneKode = "komkode" Debug.Print br(0).KommuneKode
"- der må have været noget kode før der har tildelt værdi til BrPar"
Nope, det sker i starten af proceduren.
Din verify kunne gøres simplere som så:
for i=1 to 2 Dim br As BrPar if br.kommunekode<>"" msgbox"Ups" br.kommunekode="Manamana" next
Men det er ikke dét, der er problemet! Problemet kommer, når jeg kalder proceduren inde i et loop, jf. spørgsmålet:
"Den nulstiller IKKE x, hvis f.eks. proceduren kaldes i et loop, men beholder f.eks. værdien fra sidste loop"
Jeg har UDEN HELD prøvet at genskabe med noget simplere kode:
Function ThisDrivesMeMad()
Dim X As String Dim I As Integer
For I = 1 To 2 X = "Whoops" & Str(I) Mad Next
End Function
Private Static Function Mad2() Dim X As String If X <> "" Then MsgBox "Ups" End Function Private Static Function Mad() Dim X As String If X <> "" Then MsgBox "Ups" Mad2 End Function
mugs - har du nogen idé om det?
Synes godt om
Slettet bruger
10. juni 2009 - 16:53#8
For 3. og sidste gang: 'Dim nulstiller IKKE min variabel' er normal behavoir.
When variables are initialized, a numeric variable is initialized to 0, a variable-length string is initialized to a zero-length string (""), and a fixed-length string is filled with zeros. Variant variables are initialized to Empty. Each element of a user-defined type variable is initialized as if it were a separate variable.
I er inde i den højere VBA-teori,som jeg ikke har meget forstand på.
Men det kunne være interessant at følge variablerne brvar og BrPar fra kodestart og se, hvornår de får en værdi og i givet fald hvilken for at sammenligne med andre variabler's indhold.
Jeg kan IKKE lave et tilsvarende program helt fra startet, så jeg er sikker på, at her er en fejl... enten i programmet eller i dokumentationen.
Problemet ligger faktisk ikke i brvar/brpar - det er bare her, at det er besværligt at skulle nulstille dem hvergang jeg erklærer dem med Dim
Jeg har netop isoleret tildelingen således, hvor proceduren er kogt HELT ned til kun Dim og Set:
... for i = 1 to 2 A next i ...
Function A(....)
Dim OrgNoMsg as string OrgNoMsg="Sat" '<--- her sætter jeg stop for at se indholdet.
End function.
Første gang A bliver kaldt, er OrgNoMsg blank umiddelbart efter "Dim", anden gang jeg kalder A er den "Sat".
Synes godt om
Slettet bruger
10. juni 2009 - 17:52#12
'Hvad har vi misforstået her?'
At det har noget med Dim at gøre.
Det står der sådan set heller ikke at det har, det fortæller bare noget helt korrekt om initialisering af variabler.
Ud fra sammestillingen i hjælpen, kunne man så antage at denne initialisering fandt sted i en dim statement - men det har du jo så lige eftervist ikke er tilfældet. 1-0 til emperisk erkendelse ;)
Det forhold at Dim kun er en 'programmeringshjælp' - afslører stavefejl - kan undlades med mindre 'option explicit' forekommer, understreger også at det forholder sig sådan.
Altså, det er ikke sandt, hvad der står i dokumentationen:
When variables are initialized, a variable-length string is initialized to a zero-length string ("").
Læg et svar ællebælle. Selvom du ikke har bidraget til forståelsen har jeg anvendt dit workaround med
Dim IamNew as BrPar Dim IamToBeUsed as BrPar
IamToBeUsed=IamNew ...
--men det virker megasygt på mig -- og lad det samtidig være en advarsel til alle Access programmører.
og som andre programmører må jeg lade mig distrahere af virkeligheden.
Synes godt om
Slettet bruger
11. juni 2009 - 09:34#14
Hej igen staticdata
Ingen flere Dim kommentarer herfra - men det må være træls at noget så grundlæggende som variablers scope pludselig opfører sig mærkeligt - at f.eks OrgNoMsg opfører sig som var den global eller static.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.