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.
Skrevet ons. d. 10. juni 2009 kl. 13:04:41| #1
Der er vist ingen Dim af typen New String
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
Prøv efter loopet at sæte x til:
X = ""
Skrevet ons. d. 10. juni 2009 kl. 13:11:40| #2
--Jeg kan ikke bruge "Så sæt den til blank", --
Fra Help har jeg:
___
Dim Statement
Declares variables and allocates storage space.
Syntax
Dim [WithEvents] varname[([subscripts])] [As [New] type] [, [WithEvents] varname[([subscripts])] [As [New] type]] . . .
___
Det læser jeg som, at syntaksen ved brug af New i mit tilfælde er
Dim X as new string
Eller?
Skrevet ons. d. 10. juni 2009 kl. 14:09:38| #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?
Skrevet ons. d. 10. juni 2009 kl. 14:27:44| #4
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":
brvar.ReturKode = ""
brvar.Nace_navn = ""
osv...
Skrevet ons. d. 10. juni 2009 kl. 14:28:51| #5
ps jeg citerer fra den hjælp, der kommer, når jeg står på Dim og trykker F1.
Skrevet ons. d. 10. juni 2009 kl. 15:39:12| #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
'her slettes br(0)
br(0) = br(1)
Debug.Print br(0).KommuneKode
End Sub
2.
Omstrukturer koden så anvendelse af BrPar pakkes ind i et funktionsscope
Skrevet ons. d. 10. juni 2009 kl. 16:11:16| #7
"Jeg kan ikke se noget fejl i det du har postet "
Det er jo dét, der er problemet
"- 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?
Skrevet ons. d. 10. juni 2009 kl. 16:53:24| #8
For 3. og sidste gang:
'Dim nulstiller IKKE min variabel' er normal behavoir.
Skrevet ons. d. 10. juni 2009 kl. 17:13:39| #9
Tryk F1 på "dim" i Access:
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.
Hvad har vi misforstået her?
Skrevet ons. d. 10. juni 2009 kl. 17:26:24| #10
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.
Skrevet ons. d. 10. juni 2009 kl. 17:42:38| #11
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".
Skrevet ons. d. 10. juni 2009 kl. 17:52:06| #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.
Skrevet tor. d. 11. juni 2009 kl. 09:12:29| #13
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.
Skrevet tor. d. 11. juni 2009 kl. 09:34:40| #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.