Avatar billede bambus Nybegynder
12. februar 2002 - 10:28 Der er 21 kommentarer og
2 løsninger

Problemer med kode i VBA

Jeg har et problem med indlæsning af data i mit program. Problemet opstår mår jeg indlæser  en txt-file i mit program. Stigen til denne txt-file hedder noget som C:\programmer\temp\bla bla..  når så programmet åbnes på en anden PC får jeg selvfølgelig en fejl. Denne fejl ordnes med GetOpen, hvor brugeren kan lede efter den pågældende txt-file…..
MEN næste gang brugeren åbner programmet skal denne sti gerne huskes!!! Med andre ord er det muligt runtime, at overskrive i VBAkoden??
Avatar billede puppetmaster Nybegynder
12. februar 2002 - 10:32 #1
Tja, gem stien som en nøgle i reg-databasen.
Avatar billede mr-d Nybegynder
12. februar 2002 - 10:36 #2
Nej, man kan ikke bare sådan lave selvmodiciferende kode. Gør som pupetmaster skriver, gem stien i Reg. DB.
Avatar billede lrp Nybegynder
12. februar 2002 - 10:41 #3
Brug søgeordet "registry" i Visual Basic Editoren, så kommer de relevante funktioner og metoder frem. Der er også eksempler på, hvordan de bruges.
12. februar 2002 - 10:44 #4
bambus>> kig i vba hjælpen under GetSetting og SaveSetting
Avatar billede rvm Nybegynder
12. februar 2002 - 12:10 #5
' Gemmer data i reg-databasen**********************************************
    SaveSetting "Brev.dot", "bruger", "Fornavn", txtForNavn

Noter:
"brev.dot" og "Bruger" er områder reg-databasen
"Fornavn" er variablens navn i reg-databasen
"txtForNavn" er mit objekt, hvor data hentes fra

' Henter eventuelle data fra reg-databasen
    txtForNavn = GetSetting("Brev.dot", "Bruger", "Fornavn", "")
Noter:
"brev.dot" og "Bruger" er områder reg-databasen
"Fornavn" er variablens navn i reg-databasen
"txtForNavn" er mit objekt, hvor data hentes til




Mvh

Richardt
Avatar billede rvm Nybegynder
12. februar 2002 - 12:22 #6
Dvs i dit tilfælde:
Gem
SaveSetting "Noget", "NogetAndet", "Variabel", stinavn

Hent
stinavn= GetSetting("Noget", "NogetAndet", "Variabel", "")
Avatar billede johs_j Novice
12. februar 2002 - 13:19 #7
Hvis du nu gemmer blabla.txt samme sted som dit regneark kan følgende bruges:

ThisWorkBook.Path & "\BlaBla.txt"
12. februar 2002 - 13:22 #8
Du kunne jo også skrive det stien i en celle, som er skjult for brugeren !!
Avatar billede bambus Nybegynder
12. februar 2002 - 13:45 #9
hvis jeg skal skrive til reg. databasen er jeg nok nødt til, at få lidt mere hjælp.. så som hvor finder jeg reg. databasen, og hvor dan gør jeg....
Avatar billede rvm Nybegynder
12. februar 2002 - 13:48 #10
Du behøver ikke mere end hvad jeg har givet dig. Hvis du skriver koden, så gemmer og henter den når du har lyst *S*
Avatar billede bambus Nybegynder
12. februar 2002 - 13:50 #11
okay koden kan jeg tyde.. men hvor ligger reg. databasen i win95
Avatar billede rvm Nybegynder
12. februar 2002 - 13:52 #12
Er det ikke ligegyldigt, når bare du kan gemme og hent i den ?
Avatar billede rvm Nybegynder
12. februar 2002 - 13:54 #13
Er det ikke ligegyldigt, når bare du kan gemme og hente fra den ?
12. februar 2002 - 14:04 #14
Du kan komme i kontakt med registreringsdatabasen med START-knappen "KØR" skriv REGEDIT og tryk OK. Jeg kan kun gentage rvm PLACERINGEN AF REGISTRERINGSDATABASEN ER FULDSTÆNDIG UNDERORDNET FOR DIN VBA KODE. Du bruger blot SaveSetting og GetSetting til at komme i kontakt med den. Brug eksemplerne fra hjælpen, og du er meget langt.
Avatar billede bambus Nybegynder
12. februar 2002 - 14:20 #15
okay der er nok underordnet hvor jeg finder reg. databasen, men jeg fatter kan ikke rigtig hvad det er jeg skal gøre... skal jeg lave en makro der skriver til reg. db ven Åbning af regnearket, eller skal jeg bruge

Dim FName As Variant
FName = Application.GetOpenFilename _
    (filefilter:="Text Files(*.txt),*.txt,All Files (*.*),*.*")

og selv lade brugeren finde filen, hvor efter der skrives til reg. bd.
?? i så fald hvordan "fanger" jeg så stien til filen??
Avatar billede rvm Nybegynder
12. februar 2002 - 14:26 #16
F.eks.

Sub AutoOpen()
FName = GetSetting("Noget", "NogetAndet", "Stinavn", "")
If FName = "" then
FName = Application.GetOpenFilename _
    (filefilter:="Text Files(*.txt),*.txt,All Files (*.*),*.*")
SaveSetting "Noget", "NogetAndet", "Stinavn", FName
endif

og nu resten af koden

End sub
Avatar billede bak Forsker
12. februar 2002 - 14:27 #17
Man kan da godt lave en selvmodificerende kode. Denne her er feks:
Fra start skal fil1 og Changefrom være ens. Hvis fil1 ikke findes vil koden i linie 2 blive ændret til det filnavn filnavn = Application.GetOpenFilename() returnerer med.
Sub Macro1()
fil1 = "D:\Personal\Test1.xls"
On Error GoTo fejl
Workbooks.Open Filename:=fil1
Exit Sub
fejl:
    filnavn = Application.GetOpenFilename()
    workbooks.open filename = filnavn
    selfmodify (filnavn)
End Sub

Sub selfmodify(fn)
LineToChange = 2
ChangeTo = fn
ChangeFrom = "D:\Personal\Test1.xls"
Set VBCodeMod = ThisWorkbook.VBProject.VBComponents("Module1").CodeModule
  With VBCodeMod
        TmpLine = .Lines(LineToChange, 1)
        y = InStr(1, TmpLine, ChangeFrom, vbTextCompare)
        If y > 0 Then
        NewLine = Mid(TmpLine, 1, y - 1) & ChangeTo & Mid(TmpLine, y + Len(ChangeFrom))
        .replaceline LineToChange, NewLine
        ThisWorkbook.Save
        Exit Sub
        End If
  End With
End Sub
Avatar billede bak Forsker
12. februar 2002 - 14:43 #18
LineToChange er det linienummer der skal ændres.
Når linien er udskiftet gemmes filen med koden og nu vil den altid åbne den nye fil (indtil den en dag er væk, så vil koden køre igen)
Avatar billede bambus Nybegynder
12. februar 2002 - 15:04 #19
Der er nok nemmere, at skrive til Databasen, men eftersom du jo har løst mit problem, skal takken nok tilfalde dig... dog har jeg valgt, at gå videre med rvm´s løsning, mit regneark er på 1,3MB, og det tager sin tid når man skal gemme det med ændringer.. MANGE TAK
Avatar billede bak Forsker
12. februar 2002 - 15:49 #20
Bambus> selv tak. jeg ville nok også selv have valgt den anden løsning, da den ser fin ud og er lettere, men jeg skulle jo lige prøve at lave en selvmodificerende kode.
Avatar billede rvm Nybegynder
12. februar 2002 - 15:51 #21
-> Bak: Prøv at lægge din fil på et netværk, hvor der er virusbeskyttelse. Det kan du ikke, da din kode er viruslignende og derfor vil filen blive afvist...

Men når vi nu snakker om den samme fil (hvilket min kode ikke nødvendigvis gør), hvorfor så ikke bare ændre på en af de indbyggede variable og tjekke på den. F.eks.

If ActiveWorkbook.BuiltinDocumentProperties("Keywords") = "" Then

    FName = Application.GetOpenFilename _
        (filefilter:="Text Files(*.txt),*.txt,All Files (*.*),*.*")
    ActiveWorkbook.BuiltinDocumentProperties("Keywords") = FName
    Else
    FName = ActiveWorkbook.BuiltinDocumentProperties("Keywords")

End If
Avatar billede rvm Nybegynder
12. februar 2002 - 15:56 #22
Min lille nye kode kræver selvfølgelig også at man gemmer Excel-filen, hvilket bambus jo helst ikke vil, så den tidligere kode holder stadig *S*

-> Bak: Jeg syntes også din kode er sjov :-)
Avatar billede bak Forsker
12. februar 2002 - 16:33 #23
rvm> god ide med properties, den kan sikkert bruges til mange andre formål også.
Enten er vort netværk ikke særlig godt beskyttet, eller også har vi et andet AV-program (mcafee) for jeg har ingen problemer her.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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