Avatar billede Morten Nybegynder
06. oktober 2003 - 00:01 Der er 34 kommentarer og
1 løsning

Variablers levetid

Hej

Jeg har brug for at indlæse et sql-recordset i en variabel som er tilgængelig indtil jeg tømmer den - hvor indsætter jeg denne?
06. oktober 2003 - 00:03 #1
øverst i ET kode modul uden for en sub eller function

Public xxx as xxx - lever sålænge koden kører
Private xxx as xxx - lever sålænge koden kører i DET kodemodul
Avatar billede Morten Nybegynder
06. oktober 2003 - 00:26 #2
Det vil sige at Public lever til jeg lukker den..?
Avatar billede oyejo Nybegynder
06. oktober 2003 - 09:27 #3
Du kan se på prosedyrer som "bokser" med vinduer som man KUN KAN SE UT AV. Hvis du er inne i en "boks", kan du se alle variabler som er definert utenfor "boksene" (funksjonene). Da må du som flemming sier, declarere variablene øvererst i en modul, før (utenfor) alle prosedyrer. (i declarasjonsdlen ) Når programmet går ut av en prosedyre, dør alle variabler som ikke er declarert slik: Static Variabelnavn as datatype. ( bytter ut Dim med static ) Static variablene vil beholde sin verdi til neste gang programmet går inn i samme prosedyre. Men heller ikke de kan nås utenfor prosedyren.
Avatar billede Morten Nybegynder
06. oktober 2003 - 09:46 #4
Hmmmm... er ikke helt sikker på at jeg forstå... måske skulle jeg forklare hvad jeg ønsker:

Jeg henter en masse variabler hele tiden så længe min application kører - jeg har nu lagt disse over i en access database - men det bliver tungt at kører når man hele tiden åbner og kontakter databasen - så var det jeg tænkte om ikke man kunne ligge alle posterne fra databasen ind i et array som levede så længe den pågældende Workbook var åben... alternativt kunne man åbne forbindelsen til databasen så det kun var selv data.open ...... som skulle kørers igen og igen - men jeg ved ikke om det også er tungt?

Nogen forslag til dette?
06. oktober 2003 - 10:08 #5
cddk - klik på mit navn og vis brugerinfo for at få min email. Send mig en mail så skal du få et lille eksempel.
Avatar billede oyejo Nybegynder
06. oktober 2003 - 10:42 #6
Jeg kan også ha bruk for dette eksempel,
Så jeg sender også en mail:-)
06. oktober 2003 - 11:07 #7
:-) sender til alle der mailer mig.
Avatar billede Morten Nybegynder
06. oktober 2003 - 11:15 #8
Mail sendt
Avatar billede Morten Nybegynder
06. oktober 2003 - 11:30 #9
>>Flemming...

Tak for din mail -men...

Globale konstanter kender jeg - men dem kan jeg ikke tildele en værdi eller?

Jeg ønsker at indlæse tabellen i en variable når Workbooken indlæses og først slå den ned når workbooken lukkes... er det muligt...?
06. oktober 2003 - 11:31 #10
se om ikke
Public Sub DemoTwo_02()
giver mening... samme princip
Avatar billede Morten Nybegynder
06. oktober 2003 - 11:32 #11
Eller kan jeg kører min opkobling til sql og så tildele denne til min globale variabel... hmmm... tester

PS. er det slemt, hukommelsesmæssigt, at have et array med 300 poster liggende mens app. kører?
Avatar billede Morten Nybegynder
06. oktober 2003 - 11:32 #12
Ja det var også den jeg lige faldt over - tester - det burde jo virke...
Avatar billede Morten Nybegynder
06. oktober 2003 - 11:41 #13
Hmmm... jeg behøver vist lidt mere hjælp...

Her er lige mit forsøg - men den brokker sig over at den variabel jeg tildeler til glbINI skal være en konstant?

Du får lige koden - der er nok et eller andet jeg har misset:

Option Explicit
Dim IniTmpList As Variant


Public Const glbINI As Variant = IniTmpList
Private Function INI()


'****************************************************************************************
'*          Function created on 1. October 2003 by Morten Frederiksen                                                                                      *
'*          Function changed on
'*
'****************************************************************************************
'*    Værdier der skal bruges til at hente oplysning fra settings arket              *
'****************************************************************************************

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim intColIndex As Integer
Dim DBPath, DBBase, i, tmpList
DBPath = Workbooks("Best-Skema 00.xls").Sheets("status").Range("C2")
'DBBase = GetName("strMainDB")


    ' open the database
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
        DBPath & ";"
    Set rs = New ADODB.Recordset
    ' open the recordset
    rs.Open "INI", cn, adOpenStatic, adLockOptimistic, adCmdTable
   
    INI = TransposeDim(rs.GetRows)

End Function
Avatar billede Morten Nybegynder
06. oktober 2003 - 11:45 #14
der mangler selvfølelig også et kald til funktionen i ovenstående...

Men jeg kan heller ikke skrive:

Public Const glbINI as Variant=ini

Så vil den stadig have en konstant - hvilket jo er logisk nok da denne ikke kan ændre sig under kørslen... men kan jeg så det jeg vil?
06. oktober 2003 - 12:16 #15
en konstant skal have et fast defineret udtryk f.eks. - Public Const glbINI As Variant = "ini" - eller Public Const glbINI As Variant = 12

Hvis du f.eks. vil tildele - Public IniTmpList As Variant - en værdi, så gøres det via en sub.

Public Sub Tildel()
    IniTempList = INI
End Sub

Giver det meninig for dig ?
Avatar billede Morten Nybegynder
06. oktober 2003 - 12:20 #16
ja - og nej....

Den lever jo ikke gennem hele workbookens levetid.....

Er det ikke muligt at tildele en variabel en værdi ved start som slå den ned til slut.... ??????????????????????????????????

Start = Åbne Workbook (regneark)
Slut = Lukke Workbook (regneark)
Avatar billede Morten Nybegynder
06. oktober 2003 - 12:21 #17
og undervejs skal jeg ikke ændre - så den er faktisk konstant gennem hele forløbet - bare ikke ved opstarten....

Er det noget rod jeg er ude i?
06. oktober 2003 - 12:24 #18
Variablerne kører så længde der kører kode.
du har husket at deklarere variablen med PUBLIC og ikke DIM....?
Avatar billede Morten Nybegynder
06. oktober 2003 - 12:25 #19
Ja variablen kører - men indholde forsvinder da når subben forlades (Public Sub tildel())

Eller ???
06. oktober 2003 - 12:31 #20
Indholdet skulle forsvinde, når du ikke længere kører noget kode....!
Altså kan den sagtens holde en værdi imens en userform bliver vist og udfyldt, men når du vender tilbage til "almindeligt" regneark igen, så skulle den "dø"
Avatar billede bak Forsker
06. oktober 2003 - 12:35 #21
cddk, hvis du øverst i modulet under declaration skriver skriver
Public glbINI()

og i workbook-Open

Sub Workbook_open
glbINI=INI()
End Sub
Avatar billede Morten Nybegynder
06. oktober 2003 - 12:35 #22
Okay - kan vi tage den i Jørgen Clevin versionen (for dummies) ;O)

Altså jeg har min userform (UF1)

Når den loades vil jeg indlæse 300 rækker fra en MSACCESS database til et array (Ar1) via min funktion HentData

Jeg vil så igennem hele UF1´s levetid have adgang til (Ar1) (uden kald til funktionen HentData)

Hvor ligger jeg mit kald til HentData?

Undskyld min uforstålighed... den fiser bare ikke lige rent ind her ;O)
06. oktober 2003 - 12:38 #23
bak>> den dø alligevel, når koden stopper

Prøv selv dette lille eks.

Public gsTemp As String

Private Sub Workbook_Open()
    gsTemp = "bak"
End Sub

Når regnearket er åben, så gå ind i VBA's debugger og skriv ?gsTemp  (den er tom!)
06. oktober 2003 - 12:39 #24
cddk>> smid data i din Public variable via Userform_Initialize - så holder den under hele userformen's levetid.
Avatar billede bak Forsker
06. oktober 2003 - 12:41 #25
nix, ikke her.
Husk at din Public gsTemp As String  skal ligge i et alm. modul og ikke ThisWorkbook.
06. oktober 2003 - 12:43 #26
sorry - my mistake ;-)
Avatar billede bak Forsker
06. oktober 2003 - 12:47 #27
no, my mistake :-)
Ja svarede cddk, ikke flemming, det kunne misforståes
Avatar billede bak Forsker
06. oktober 2003 - 12:54 #28
cddk, jeg bruger selv nøjagtig samme system, fordi jeg ikke ønsker at genindlæse databasen. Det skal virke.
Variablen dør ikke før regnearket lukkes eller du piller ved koden i vba.
Hvis du ønsker at den skal dø sammen med formen, stiller sagen sig lidt anderledes.
Avatar billede Morten Nybegynder
06. oktober 2003 - 13:12 #29
og du har bare så evig ret... først kunne jeg ikke lige få det til at virke kiggede på variablen i Watches vinduet - men der er den tom... så lavede jeg en lille testfunktion og en knap så jeg kunne hente en given post - og det virker SQ...!! ;O) tak for hjælpen... jeg vil gerne smide nogle point efter dig som tak for hjælpen så jeg opretter lige et spørgsmål mere...
Avatar billede Morten Nybegynder
06. oktober 2003 - 13:14 #30
http://www.eksperten.dk/spm/410311 - Point til Bak....!!!!
Avatar billede Morten Nybegynder
06. oktober 2003 - 13:15 #31
PS. Skal man passe på hukkomelsen ??? Altså er det nogle max-grænser mht. tabellens størrelse... osv?
Avatar billede Morten Nybegynder
06. oktober 2003 - 13:19 #32
PSS. og ved at kalde INI() igen så får jeg vel opdateret når jeg ønsker det...?!

Det ender med at det bliver ikke kun en god app. men en suveræn god (om et par altså når jeg er blevet Bak-HAJ til det her) *LOL* ;O)
Avatar billede Morten Nybegynder
06. oktober 2003 - 13:37 #33
Bak - Gennemløber du så variablen med en For...Next løkke ?
Avatar billede bak Forsker
06. oktober 2003 - 14:53 #34
PS1:
Nej, det er så små datamængder at det ikke skulle betyde noget.
Hvis du henter en 400-500 records over taler vi måske om 50-100 kb.
Hvis du henter 10000 over skal vi måske til at regne på det :-)

PS2:
Ja, det skal gerne blive opdateret.

PS3:
Nej, jeg assigner direkte til comboboxens LIST.
Combobox1.List = gsTemp
Avatar billede Morten Nybegynder
06. oktober 2003 - 15:16 #35
Okay - men jeg skal ikke vise dataerne nogen steder blot bruge den i koden... så jeg bruger min for I = 0 to Ubound(Variabel)...

Men tak for hjælpen det var perfekt...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester