Avatar billede goglov Seniormester
02. maj 2015 - 12:59 Der er 21 kommentarer og
1 løsning

Hvordan kan jeg bruge procedure i flere projekter?

Efter grundige studier af internettet og med skelnen imellem Visual Basic studio og Visual Basic Exel er jeg nået frem til at noget i retning af:

Projekt1 (hedder hjælpefil)
Her indeholder modul2 flg:

Sub datahjælp()
Call TjekHJÆLP
End Sub

Projekt2 (hedder Teknikdata)
Her indeholder modul1 flg.:

Public Sub TjekHJÆLP()
    Range("F3").Select
    ActiveCell.FormulaR1C1 = "Her indsættes tekst"
  End Sub

Jeg har forsøgt at koble projekt1 sammen med projekt2 ved at benytte Tools/referances, og fluebene VBA projekt under udvikler og finde mit projekt 2 ved at søge. Selv om jeg vælger projekt2 (teknikdata) så får jeg en fejl:

"Name conflicts with exixing module, project, or object libary"

Det virker med andre ord ikke.
Nogen forslag
Avatar billede store-morten Ekspert
02. maj 2015 - 13:05 #1
Er det på den samme pc. du arbejder på?
Avatar billede goglov Seniormester
02. maj 2015 - 15:14 #2
Ja
Avatar billede store-morten Ekspert
02. maj 2015 - 16:03 #3
Så tænkte jeg om det var en løsning at lægge dine makroer i den personlige mappe.

Så ligger makroer på den pc. de er oprette på, men tilgængelige i alle Projektmapper.
Avatar billede goglov Seniormester
02. maj 2015 - 16:33 #4
Jeg forstår ikke helt svaret: Hvad er en personlig mappe?
Pt. Ligger begge projekter i den samme mappe og jeg kan se dem begge to fra Editoren når de begge er aktiveret.
Avatar billede store-morten Ekspert
02. maj 2015 - 16:48 #5
En Mappe er det sted du har Excel filerne.
En Excel fil er også kaldet Projektmappe.
Og inden i Projektmappen er der Ark.

Er det rigtigt forstået du vil kalde en Makro i Excel fil-2 fra Excel fil-1.

"Hvad er en personlig mappe?"
Det er en Personlig Projektmappe der ligge/gemmes på Pc'en.
Makroer der bliver gemt her, vil være tilgængelige i alle Projektmapper, der åbnes på denne pc.
Avatar billede store-morten Ekspert
02. maj 2015 - 16:52 #6
Du kan ikke se VBAProject(PERSONAL.XLSB) i Editoren, i nu ;-)
Avatar billede goglov Seniormester
02. maj 2015 - 17:03 #7
Ja. Jeg vil kalde en Makro i Excel fil-2 fra Excel fil-1.
Jeg kan ikke se VBAProject(PERSONAL.XLSB) i Editoren, i nu ;-)
Der er ikke adgang til en fil med det navn.
Avatar billede store-morten Ekspert
02. maj 2015 - 17:09 #8
Kan du "Indspille" en Makro?
Avatar billede store-morten Ekspert
02. maj 2015 - 17:46 #9
Oprette VBAProject(PERSONAL.XLSB):
Udvikler --> Kode --> Indspil makro
I boksen der kommer frem
Gem makro i: "Denne projektmappe" vælg med pil til: Personlig makroprojektmappe --> OK
Tast: "test" i en celle
Udvikler --> Kode --> Stop indspildning

Sæt tilbage:
Udvikler --> Kode --> Indspil makro
I boksen der kommer frem
Gem makro i: "Personlig makroprojektmappe" vælg med pil til: Denne projektmappe --> OK
Slet: "test" i cellen
Udvikler --> Kode --> Stop indspildning

Nu kan du se VBAProject(PERSONAL.XLSB) i Editoren
Og der vil være Modul1 i Modules

Når du lukker Excel, husk at sige "Gem", til: Vil du gemme ændringer i den personlig makroprojektmappe.....
Avatar billede goglov Seniormester
02. maj 2015 - 17:44 #10
ja. Det var opsigelig sådan jeg lavede min Public Sub TjekHJÆLP()
Avatar billede goglov Seniormester
03. maj 2015 - 00:54 #11
Jeg har oprettet en ny makro: makro1 i VBAProject(PERSONAL.XLSB) (som beskrevet under oprette WBAProject...)
Den skriver "test..." i projekt "Hjælpefil" når den køres direkte.
Men jeg kan ikke kalde makro1 fra en makro hverken i projekt1 eller projekt2. når jeg forsøger får jeg fejlmeddelelsen:
Compile error Sub or Function not definid.

Der er altså noget jeg ikke har forstået? Suk ;-(
Avatar billede store-morten Ekspert
03. maj 2015 - 03:10 #12
Nej, du kan køre makro1 fra projekt1 og projekt2 direkte.
Avatar billede bvirk Guru
03. maj 2015 - 12:04 #13
Byder lige ind med noget der ligger i forlængelse af #1. Jeg er ikke helt med på hvad du mener med projektX, men her er en opskrift, testet i excel97 - test selv om det virker i 2013. Løsningen på din navnekonflikt skulle gerne fremgå af nedenstående.
Ser iøvrigt du bruger specielle nationale tegn - kan man det nu? - jeg ville holde mig fra æ,ø,å i alt hvad der har med kode at gøre - men måske er jeg gammeldags.

Det kan godt lade sig gøre at udfærdige sit eget 'library' med vba funktioner og procedurer man genbruger (uden at forfalde til klippebords-amøbe). Det giver nogle problemmer ved distribution - enten skal alle computere have disse libraries, eller excel-filen skal ompakkes før distibution.

1. Excel åbnes - ny fil som endnu ikke er saved.
2. tast <alt><f11> for at åbnes vba editoren.
3. lav et nyt modul gennem højreklik på noget i projektexplorer vinduet.
https://drive.google.com/file/d/0B7nnvgTdhUrbdUsxQmlNb2p1TzA/view?usp=sharing
4. Modulet kom nok til hedde : modul1 eller andet fjollet, det kan vi IKKE bruge - modulets navn skal være karakteristisk for det vi putter i det. Med tiden får vi måske 1000 vis af funktioner og procedurer og hvordan skulle vi kunne finde rundt uden sigende navne. Et library her består af et eller flere moduler, hver med en eller flere funktioner/procedurer. Her vælges navnet test
5. Egenskabsvinduet skal være slået til - 'modul1' omdøbes til 'test' - bemærk lille forbogstav 'Test' ville have været et klassemodul (blot min smag, ikke noget programbundet!)
6. VBAProject ikonet øverst i projectexplorer vinduet markers og omdøs i egenskabsvinduet til, lad os sige 'My1Lib'
7. Vi skal finde ud af hvor det ville smart at gemme excel filen som indeholder My1Lib. Hvis det skal distribueres til andre computerere, må det gerne være mere office end bruger specifikt. I menulinien->funktioner->referencer markeres 'visual basic for applications'  og stinavnet aflures (måske C:\Programmer\Fælles filer\Microsoft Shared\VBA) - filen gemmes nu som C:\Programmer\Fælles filer\Microsoft Shared\VBA\My1Lib.xsl
8. Følgende testkode puttes i programkode vinduet - det testes efterfølgende for syntaxfejl med menulinie->fejlfinding->kompiler
Function foo()
    foo = "Jeg er funktionen foo."
End Function

Sub bar()
    MsgBox "Jeg er procedure bar"
End Sub
9. Der gemmes og excel afsluttes.
10. excel åbnes igen med en ny fil.
11. I vba editoren: menulinie->funktioner->referencer->gennemse->alle file vælges My1lib.xsl
12. I en celle i en worksheet fane, skriv: =foo()
That's it!
Avatar billede goglov Seniormester
03. maj 2015 - 18:45 #14
Tak til bvirk. Du har helt ret i at det er en rigtig god ide at omdøbe moduler til noget man kan forstå :-)
Jeg kan også oplyse at nationale tegn ikke er et problem her i v.2013.

Jeg har nu for overskuelighedens skyld lavet 2 nye projekter Ahjælp.xlsm og Bhaelp.xlsm.
Jeg har lagt mærke til at når man laver makroerne AhjælpMacro fra Ahjælp.xlsm og BhjælpMacro fra Bhjaelp.xlsm og begge anbringes i "Personlig mappe" så dannes begge makroer i det samme modul2 (jeg har et modul1 fra et forrigt forsøg). Det viser sig også at når jeg kalder Run til den ene macro så afvikles den i det vindue der er åbent, altså har jeg projekt Bhjaelp.xlsm åbent så afvikles den her.
Er det muligt at specificere at makroen (funktion) kun afvikles i et ønsket vindue (ark et eller andet )i et bestemt projekt (f.eks Ahjælp.xlsmi )
Avatar billede store-morten Ekspert
03. maj 2015 - 22:48 #15
Det er korrekt at der oprettes i nyt modul når du indspiller på ny.

Idén med at lægge makro i personlig mappe er at de er tilgængelige fra alle projektmapper, og makro køres fra den projektmappe hvor de skal bruges.

"Er det muligt at specificere at makroen (funktion) kun afvikles i et ønsket vindue (ark et eller andet )i et bestemt projekt (f.eks Ahjælp.xlsm )"

Windows("Ahjælp.xlsm").Range("F3").FormulaR1C1 = "Her indsættes tekst"

Kræver at Ahjælp.xlsm er åben.
Avatar billede bvirk Guru
03. maj 2015 - 23:14 #16
Det er også muligt at selectere på Active??

' i modul i personlig mappe
Sub showActive()
    Select Case ActiveWorkbook.Name
        Case "t1.xlsm"
            ' køres kun fra filen t1.xslm
            Worksheets("Ark1").Range("A1").FormulaR1C1 = "project t1"
        Case "t2.xlsm"
            ' køres kun fra filem t1.xslm
            Worksheets("Ark1").Range("A1").FormulaR1C1 = "project t2"
    End Select
End Sub
Avatar billede goglov Seniormester
03. maj 2015 - 23:51 #17
Undskyld jeg udtrykte mig vist uklart. Min situation er den at jeg har en masse data, nok til at gøre projektet sløvt så det næsten går i stå. Disse data skal hentes med en makro (function) i projekt Ahjælp (jeg skal have adgang til andre makroer i Ahjælp og bearbejdes med en makro(funktion) i projekt Bhjælp hvor jeg også skal have adgang til andre makroer.
Meningen er altså at jeg fordeler byrden imellem de 2 projekter.
Avatar billede goglov Seniormester
04. maj 2015 - 02:14 #18
Jeg tror jeg kan klare mit problem hvis jeg kan hente dataene fra et ark i projekt Ahjælp, behandle dem i "personlig mappe" og aflevere dem på et ark i Bhjælp.
Avatar billede goglov Seniormester
05. maj 2015 - 03:31 #19
Jeg er blevet klar over at jeg helt har misforstået mit behov.
Jeg var helt overbevist om at mit problem skyldtes begrænsninger i selve projektetfilen.
Det viser sig at begrænsningen ligger i selve Ark størrelsen, ikke i projektfilen som sådan.
Jeg kan altså løse mit problem ved at fordele meget store datamængder over en hel masse Ark som jeg, på vanlig måde, kan bearbejde inden for projektets rammer.
Derfor beklager jeg at jeg ikke har fundet ud af dette noget før og har ulejliget jer unødigt.
Jeg foreslår derfor at i begge, store-morten og bvirk, skriver et svar så jeg kan dele pointene imellem jer.
Tak for denne gang.
Avatar billede store-morten Ekspert
05. maj 2015 - 14:47 #20
Springer over ;-)
Avatar billede bvirk Guru
05. maj 2015 - 18:08 #21
En skam du ikke giver os lejlighed til at se de makroer elller andet hvor der skal ske noget med store datamængder eller invier os i hvad der skal ske med disse data - også selv om de 'ikke kan være i ark'
Er heller ikke interesseret i point.
Avatar billede goglov Seniormester
05. juni 2015 - 16:37 #22
Tak til alle. Jeg lukker nu tråden
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

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