Avatar billede daniel_d Nybegynder
27. januar 2005 - 23:18 Der er 19 kommentarer og
1 løsning

Flytte variabel mellem funktioner

I en private sub har jeg en variabel med navnet Filnavn
Jeg sætter i denne sub filnavn = "filnavn.ext"

i en funktion vil jeg gerne sige

Stien = EnSti + Filnavn

men jeg får ikke variablen med ned - hvordan gør jeg det?

Ved godt at ovenstående kode ikke er rigtig kode så at sige, men synes det var lettest at forklare således...
Avatar billede nih Novice
27. januar 2005 - 23:27 #1
Du skal erklære variablerne uden for din 'sub'
Option Compare Database
Option Explicit
dim filnavn as string
dim ensti as string

sub et()
filnavn = "filnavn.ext"
end sub

sub to()
ensti = "c\her\"
end sub

function
dim helestien as string
et
to
helestien = filnavn & ensti
end function

niels
Avatar billede sjap Praktikant
27. januar 2005 - 23:29 #2
Hvis du kalder funktionen fra Sub'en kan du inkludere filnavnet i funktionskaldet:

Function Gørnogetmedfil(Filnavn AS String)
...
Stien = EnSti + Filnavn
...
End Function


Og sub'en kaldes funktionen med:

Gørnogetmedfil(Filnavn)
Avatar billede nih Novice
27. januar 2005 - 23:38 #3
Jeg ville nok vælge sjap's løsning, kalde functionen fra din sub

Det du skal være opmærksom på er variablernes scobe - dvs hvornår de ikke er aktive mere.
Hvis de erklæres i en sub går de ud af scobe når sub'en afsluttes
Avatar billede daniel_d Nybegynder
27. januar 2005 - 23:38 #4
øhhh.... tror jeg er lidt forvirret lige nu...

smider lige lidt kode
Knappen der trigger en funktion:

Private Sub K1Knap_Click()
On Error GoTo Err_K1Knap_Click



    Dim Filnavn
   
    Filnavn = "Køber- indhentelse af honorar og reg. afgift.doc\"
   
    Call GetMergeFields
       


Exit_K1Knap_Click:
    Exit Sub

Err_K1Knap_Click:
    MsgBox Err.Description
    Resume Exit_K1Knap_Click
   
End Sub



Og selve funktionen:

Function GetMergeFields()
   
    Dim objword As New Word.Application
    Dim WordDoc As New Word.Document
   
    Set WordDoc = objword.Documents.Add(CurrentProject.Path & "\dokumenter\" & Filnavn)
   
            Call InsertAtBookmark(WordDoc, "Sag_nr", Me!Sag_nr)
            'jeg har en masse call's som skal anvendes på mange knapper - derfor lagt i en funktion

End function







Det er som sagt Filnavn jeg vil have ned i funktionen - den kan ikke stå i funktionen da den ændrer sig alt efter hvilken knap der er tale om...
Avatar billede nih Novice
27. januar 2005 - 23:43 #5
Private Sub K1Knap_Click()
On Error GoTo Err_K1Knap_Click



    Dim Filnavn
   
    Filnavn = "Køber- indhentelse af honorar og reg. afgift.doc\"
   
    Call GetMergeFields(FilNavn)
       


Exit_K1Knap_Click:
    Exit Sub

Err_K1Knap_Click:
    MsgBox Err.Description
    Resume Exit_K1Knap_Click
   
End Sub


Function GetMergeFields(Filnavn as string)
   
    Dim objword As New Word.Application
    Dim WordDoc As New Word.Document
   
    Set WordDoc = objword.Documents.Add(CurrentProject.Path & "\dokumenter\" & Filnavn)
   
            Call InsertAtBookmark(WordDoc, "Sag_nr", Me!Sag_nr)
            'jeg har en masse call's som skal anvendes på mange knapper - derfor lagt i en funktion

End function
Avatar billede daniel_d Nybegynder
27. januar 2005 - 23:47 #6
jeg får compile fejl med denne linie markeret: Call GetMergeFields(Filnavn)
Avatar billede daniel_d Nybegynder
27. januar 2005 - 23:49 #7
kan det være fordi at GetMergeFields indeholder et kald til en anden funktion?
Avatar billede nih Novice
27. januar 2005 - 23:51 #8
prøv at skrive
    GetMergeFields Filnavn

Uden call

du kam også erklære din variabel som string

    dim filNavn as string
Avatar billede nih Novice
27. januar 2005 - 23:52 #9
Hvad siger  fejlteksten
Avatar billede sjap Praktikant
27. januar 2005 - 23:53 #10
Hold da helt op. Man kan jo ikke blinke med øjnene, uden at der sker en hel masse. Det ser ud til at nih har godt fat i spørgsmålet, så jeg vil kaste mig over dynen ;0)
Avatar billede daniel_d Nybegynder
27. januar 2005 - 23:53 #11
fejlteksten er : Compile error: ByRef argument type mismatch
Avatar billede kjulius Novice
27. januar 2005 - 23:55 #12
Jeg tror du ville have udbytte af at køre nogle af de gratis tutorials man kan se på http://www.vtc.com/products/vbaccess2002.htm

Der er bl.a. en om variable scope, som på en pædagogisk måde forklarer disse mysterier. Der er tale om små film (som bruger Apples Quicktime, så den skal du have installeret), og de er med amerikansk tale, men ellers god hjælp til begyndere.

Hvis de tiltaler dig, kan du købe yderligere tutorials for $$...
Avatar billede nih Novice
27. januar 2005 - 23:55 #13
Det er fordi du skal erklære din variabel som string:

dim filNavn as string
Avatar billede daniel_d Nybegynder
27. januar 2005 - 23:55 #14
Hey det virker...
Dit sidste forslag skulle blot være: GetMergeFields (Filnavn)
Avatar billede nih Novice
27. januar 2005 - 23:57 #15
:)
Avatar billede daniel_d Nybegynder
27. januar 2005 - 23:58 #16
Kjulius: tak for dit link - jeg er lidt af en begynder i Visual Basic til Access men indtil videre er det gået rimelig glat - jeg er sådan rimelig inde i programmering generelt, men der er nu stadig væk lang vej endnu :o)
Avatar billede daniel_d Nybegynder
27. januar 2005 - 23:59 #17
Helt kanon...
Nogen af jer der kan svare på : http://www.eksperten.dk/spm/585432

:D

Tak for hjælpen nih
Avatar billede kjulius Novice
28. januar 2005 - 00:09 #18
Bare en generel betragtning (ved ikke lige om det har betydning her):

Call bruges normalt til at kalde en Sub

Sub bruges når der ikke skal returneres en værdi.
Function bruges når der skal returneres en værdi.

I din kode er GetMergeFields defineret som en Function, men der returneres ingen værdi, og det kaldes med en Call. Something's fishy, isn't it?
Avatar billede daniel_d Nybegynder
28. januar 2005 - 00:17 #19
GetMergeFields returnerer vel en værdi i forum af dens eget Call til InsertAtBookmark
GetMergeFields holder vel? dermed på en række værdier som bruges i K1_Knap_Click sub'en?

Men som sagt er jeg slet ikke en haj til VB og det kan sikkert gøres smartere, men det ser ud til at virke efter hensigten...
Avatar billede kjulius Novice
28. januar 2005 - 01:05 #20
Jo, måske har jeg ikke udtrykt mig helt klart. Selvfølgelig kan man sige, at hvis en medsendt parameter bliver ændret, så returnerer den også en (ændret) værdi.

Men en funktion bruges normalt til at returnere en værdi, som man under kaldet assigner til en enden værdi:

Function Brugerfunktion( Indgangsværdi as integer) as long
'Før funktionen afsluttes, skal funktionen tildeles en værdi (Funktionens navn opfattes i funktionen som en variabel med samme navn.
Brugerfunktion = Indgangsværdi ** 10
End Function

Kaldet:
X = Brugerfunktion( EnMedsendtVærdiEllerVariabel )

X vil nu være tildelt værdien af EnMedsendtVærdiEllerVariabel i 10. potens.
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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