Avatar billede hubertus Seniormester
04. oktober 2006 - 10:39 Der er 49 kommentarer og
1 løsning

problemer med at fastholde makro til menuknap

en udfordring af de drilske

et regneark, hvor jeg har oprettet en værktøjslinie og en knap, hvortil der er knyttet en makro. arket oprettes som et uge ark, hvor brugerne kan have flere uger åbne på en gang. Problemet opstår, når flere ark er åbne samtidig, så oplever vi flere gange at et tryk på menuknappen medfører en meddelelse om at makroen ikke findes (der er angivet en stil til den ønskede makro) Den makro der spørges efter, og angives i stien peger på et andet ugeark og ikke det ark som er aktivt nu. - lyder det kryptisk? men irriterende er det. Hvordan fastlåser man knap og makro til det aktuelle ark, således at brugeren kan have flere uger åben samtidig?
mvh. Hubertus
Avatar billede newts Nybegynder
04. oktober 2006 - 10:52 #1
Prøv at indsætte , skriv
    Sheets("Ark1").Select
i starten af makro'en, hvor "Ark1"  er navnet på arket.
Venlig hilsen
Niels erik Winther
Avatar billede gider_ikke_mere Nybegynder
04. oktober 2006 - 10:55 #2
Mener du regneark eller faneblad? Hvor har du pladseret makroen? Den skal pladseres i et modul for at være offentlig.
Avatar billede newts Nybegynder
04. oktober 2006 - 10:55 #3
Evt gå over og lav "knappen" i Microsoft Visual Basic.
Så kan du have en knap på hver side.
new
Avatar billede newts Nybegynder
04. oktober 2006 - 10:56 #4
Fanebled. new
Avatar billede gider_ikke_mere Nybegynder
04. oktober 2006 - 10:59 #5
newts: Der er tale om en værktøjslinie.
Avatar billede hubertus Seniormester
04. oktober 2006 - 11:04 #6
-> akyhne - jeg mener regneark, og koden er placeret i et modul. Det som undre mig er at den har en sti til en makro i et andet regneark - som ganskevist bruger samme menulinie og makro.

-> Niels Erik - den vil ikke virke, da den jo overhoved ikke kan finde den aktuelle makro.

Problemet opstår fordi en makro af samme navn, kaldes fra flere forskellige ark. Hvor gemmemer Excel oplysningen om sammenknyttningen af knap og makro? Når jeg knytter makroen til kanppen vælger jeg altid thisworkbookmakronavn - det burde jo få den til at pege på den aktuelle regneark.
Avatar billede gider_ikke_mere Nybegynder
04. oktober 2006 - 11:17 #7
Hvis værktøjslinien bliver oprettet i et .xla tilføjelsesprogram, eller via person.xls, burde makroen være offentlig for alle regneark. ellers kan du prøve at kalde makroen med regnearkets navn "mitregneark.xls!minmakro"
Avatar billede gider_ikke_mere Nybegynder
04. oktober 2006 - 11:19 #8
Ændrer evt
Sub minmacro()
'et eller andet
End Sub

til..

Public Sub minmacro()
'et eller andet
End Sub
Avatar billede hubertus Seniormester
04. oktober 2006 - 15:43 #9
-> jeg afprøver lige dit forslag - det er lidt langsomt da der er tale om produktionsark. Værktøjslinien oprettes via en makro, når arket åbnes, og lukkes automatisk, når arket afsluttes. dvs. værktøjslinien er kun aktiv, når regnearket er aktiv
mvh. Hubertus
Avatar billede hubertus Seniormester
04. oktober 2006 - 16:29 #10
-> Det ser ikke ud til at at dit forslag havde den ønskede effekt - desværre.
Avatar billede hubertus Seniormester
04. oktober 2006 - 16:55 #11
For en god ordens skyld, så er vores opsætning således at regnearkene ligger på et fælles drev (server), og er delt, således at flere kan bruge arket samtidig.
Avatar billede gider_ikke_mere Nybegynder
04. oktober 2006 - 18:04 #12
Hvis du i det øjeblik du har fejlen går ind i VBA editoren, må du kunne se hvor makroen ligger.
hubertus: Var det dig der for et stykke tid siden spurgte om deling af et .xla eller person.xls ark? Og hvis... har I det så kørende på den måde?
Avatar billede gider_ikke_mere Nybegynder
04. oktober 2006 - 18:18 #13
Lad os lige starte helt forfra - nu begynder den endelig at snurre. For det første vil jeg gerne lige vide om du har din værktøjslinie i alle ark.
For det andet. Bruger du en person.xls eller et tilføjelsesprogram. Kaldet til makroen i værktøjsbjælken bør bare kaldes ved makroens navn, såfremt den er offentlig, altså ikke noget med ThisWorkbook.
person.xls og en evt. .xla fil vil/skal altid være synlig fra alle ark.
Avatar billede hubertus Seniormester
04. oktober 2006 - 18:31 #14
Værktøjslinien findes i alle ugearkene. De oprettes og nedlægges med åbning/nedlukning af arkene. dvs. er der 2 ark (dvs. 2 uger) åben, så oprettes værktøjslinien 2 gange.
Jeg bruger ikke person.xls eller noget tilføjelsesprogram. Det er vigtigt at arkene kan distribueres via netværket, således at jeg ikke skal have fat i de enkelte klienter, når der skal ske ændringer.
makroen ligger i et modul.
Avatar billede hubertus Seniormester
04. oktober 2006 - 18:50 #15
-> 18:04:30 ja, det var mit spørgsmål, og arkene afvikles på den beskrevne måde.
Avatar billede gider_ikke_mere Nybegynder
04. oktober 2006 - 19:15 #16
Hvis du opretter værktøjslinien i hver ark kan jeg godt forstå det går galt for dig. Det kan jeg bare ikke forstå at du kan.
Avatar billede hubertus Seniormester
06. oktober 2006 - 16:44 #17
-> hvad så, strander den der, eller har ud et forslag til hvordan opgaven kan løses på anden vis?
mvh.
Hubertus
Avatar billede gider_ikke_mere Nybegynder
08. oktober 2006 - 15:25 #18
Er der noget i vejen for at værktøjslinien altid oprettes i Excel?
Avatar billede hubertus Seniormester
08. oktober 2006 - 17:53 #19
Ja, da brugerne arbejder med mange forskellige ark, hvor indholdet af værktøjslinien er forskellig. Princippet er, at der skal kun være de kanpper som anvendes i det pågældende ark.
Avatar billede gider_ikke_mere Nybegynder
13. august 2007 - 13:16 #20
Vi kom vidst fra denne her. Fandt du en løsning?
Avatar billede hubertus Seniormester
13. august 2007 - 15:13 #21
Hejsa - nej desværre - problemet spøger stadig
Avatar billede gider_ikke_mere Nybegynder
25. august 2007 - 00:54 #22
Kan du bruge noget af dette hvor værktøjslinien oprettes ved åbning af et bestemt ark, for så at blive slettet ved lukning/skift til andet regneark?

http://www.eksperten.dk/spm/792816

Altså hver værktøjslinie oprettes pr. ark, og slettes ved lukning/skift til andet ark.
Avatar billede hubertus Seniormester
25. august 2007 - 07:53 #23
Hej igen. Det er, sådan set også det jeg har lavet, men problemt er ikke at oprette og slette menulinie igen. Problemet opstår, når to forskellige regneark hver især åbner samme menulinie. Lukkes det ene regneark, så lukkes menulinien også i den anden. Samtidig ser det ud til, at når to regneark bruger samme menulinie, så oplever jeg, at arket ikke kan finde den makro som er knyttet til menupunktet.
Avatar billede gider_ikke_mere Nybegynder
27. august 2007 - 02:42 #24
Jeg lavede lige et forsøg, og her kørte det fint. Når det ene ark deaktiveres, slettes menuen, og idet det andet ark åbnes, oprettes den igen.

Prøv at putte følgende i et modul:

Public Sub OpretMinCommandobar()
Set AllmyMenuBar = CommandBars.ActiveMenuBar
For Each D In AllmyMenuBar.Controls
    If D.Caption = "Score" Then Exit Sub
Next

Set myMenuBar = CommandBars.ActiveMenuBar
Set newMenu = myMenuBar.Controls.Add(Type:=msoControlPopup, Temporary:=True)
newMenu.Caption = "Score"

Set ctrl1 = newMenu.CommandBar.Controls _
    .Add(Type:=msoControlButton, ID:=1)
With ctrl1
    .Caption = "Sletter noget"
    .TooltipText = "Slet nu"
    .Style = msoButtonCaption
    .OnAction = "Slet" 'navnet på makroen der skal afspilles

End With

Set ctrl2 = newMenu.CommandBar.Controls _
    .Add(Type:=msoControlButton, ID:=1)
With ctrl2
    .Caption = "Import"
    .TooltipText = "Import"
    .Style = msoButtonCaption
    .OnAction = "Importer" 'navnet på makroen der skal afspilles

End With

End Sub

Public Sub SletMinCommandobar()
Dim Y As Application
Set myMenuBar = CommandBars.ActiveMenuBar
For Each D In myMenuBar.Controls
    If D.Caption = "Score" Then
        D.Delete
    End If
Next
End Sub

Public Sub SkjulMinCommandobar()
Set myMenuBar = CommandBars.ActiveMenuBar
For Each D In myMenuBar.Controls
    If D.Caption = "Score" Then
        D.Visible = False
    End If
Next
End Sub

Public Sub VisMinCommandobar()
Set myMenuBar = CommandBars.ActiveMenuBar
For Each D In myMenuBar.Controls
    If D.Caption = "Score" Then
        D.Visible = True
    End If
Next
End Sub

Sub Slet()
MsgBox "Slet " & ThisWorkbook.Name
End Sub

Sub Importer()
MsgBox "Importer " & ThisWorkbook.Name
End Sub



og følgende i ThisWorkbook:

Private Sub Workbook_Activate()
OpretMinCommandobar
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
SletMinCommandobar
End Sub

Private Sub Workbook_Deactivate()
SletMinCommandobar
End Sub

Private Sub Workbook_Open()
OpretMinCommandobar
End Sub

Lav så flere kopier af arket, og start dem op. Klik på en af valgene i menuen, og se til at den msgbox der dukker op skriver det aktuelle arks navn. Prøv fra alle ark.
Avatar billede hubertus Seniormester
04. september 2007 - 16:01 #25
hejsa - lige vent tilbage fra lidt ferie
Kunne jeg få dig til at knytte nogle kommentarer til især første del af din kode?
Jeg vil nemlig gerne vide præcis, hvordan du undgår at menuen lukkes ned når en af regnearkene lukkes.
mvh. Hubertus
Avatar billede gider_ikke_mere Nybegynder
04. september 2007 - 17:34 #26
Menuen lukkes netop ned når du forlader arket, men oprettes med det samme du skifter til et andet ark med samme kode. Og derfor finder den makroerne lokalt i det nye regneark.
Avatar billede hubertus Seniormester
05. september 2007 - 15:57 #27
hej igen - det er også hvad jeg er nået frem til, men jeg ville bare gerne forstå, hvad det er som sker i koden. Specielt dette modul

Public Sub OpretMinCommandobar()
Set AllmyMenuBar = CommandBars.ActiveMenuBar
For Each D In AllmyMenuBar.Controls
    If D.Caption = "Score" Then Exit Sub
Next

Det er D, som jeg specielt er interessert i. Jeg kan godt se at menulinien checkes for om Score eksisstere, men kan ikke helt forstå D.

ActiveMenuBar er det pr. definition den menulinien med Filer, rediger osv. hvad hedder de andre menuliner? Jeg tænker her på, muligheden for at placere min menu på en af de andre menubjælker.


mvh. Hubertus
Avatar billede gider_ikke_mere Nybegynder
05. september 2007 - 16:42 #28
D kan du kalde hvad du vil. Det står vel nærmest for enhed, altså

for hver control i AllmyMenuBar.Controls

Og hvad D er, bliver netop først defineret i linien

For Each D In AllmyMenuBar.Controls

Det er lidt det samme som

Dim D 'D er nothing
D = True 'D bliver lige pludselig til en boolean
D = 1,234 ' D bliver til en double
Avatar billede gider_ikke_mere Nybegynder
05. september 2007 - 16:57 #29
Om du laver menuen på den måde du har gjort før, eller som i mit eksempel, burde være lige gyldig. Det var blot lige det eksempel jeg havde klar.
Avatar billede hubertus Seniormester
05. september 2007 - 22:09 #30
Så er jeg ved at være med i teknikken - tak for det :O) det var rigtigt dejligt. :O)
Hvad med den del vedrørende navnene på menulinierne, kan du kaste lidt lys over det?
mvh. Hubertus
Avatar billede gider_ikke_mere Nybegynder
06. september 2007 - 07:33 #31
Jeg er ikke lige klar over hvad du hentyder til, med hensyn til navne.
Avatar billede hubertus Seniormester
06. september 2007 - 08:29 #32
Jeg tænker på, hvad man kalder de forskellige menulinier, hvis jeg vil have placeret min menu i en af de andre menubjælker. Du har f.eks. en linie: Set AllmyMenuBar = CommandBars.ActiveMenuBar som placere menupunktet på den øverste menubjælke. Hvad skal der stå, hvis jeg f.eks. vil have min menu i en af de andre menubjælker?
Avatar billede gider_ikke_mere Nybegynder
06. september 2007 - 08:39 #33
Mener du på en menulinie a la "Filer", "Rediger", "Vis", eller mener du værktøjslinier a la "Billeder", "Standard", "Formatering", "Korrektur"?

Skal det være i en eksisterende, eller på en ny?
Avatar billede hubertus Seniormester
06. september 2007 - 12:41 #34
Det skal være en eksisterende.
Avatar billede gider_ikke_mere Nybegynder
06. september 2007 - 19:00 #35
I hvilken?
Avatar billede hubertus Seniormester
06. september 2007 - 21:00 #36
Det kunne f.eks. være i forlængelse af formaterings værktøjslinien.
Avatar billede gider_ikke_mere Nybegynder
07. september 2007 - 07:54 #37
I ThisWorkbook:

Private Sub Workbook_Activate()
OpretMinCommandobar
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
SletMinCommandobar
End Sub

Private Sub Workbook_Deactivate()
SletMinCommandobar
End Sub

Private Sub Workbook_Open()
OpretMinCommandobar
End Sub



I et modul:

Public Sub OpretMinCommandobar()
Set AllmyMenuBar = CommandBars.ActiveMenuBar
For Each D In AllmyMenuBar.Controls
    If D.Caption = "Forma&ter" Then
        Set ctrl1 = D.CommandBar.Controls _
        .Add(Type:=msoControlButton, ID:=1)
        With ctrl1
            .Caption = "Importerer noget"
            .TooltipText = "Importer nu"
            .Style = msoButtonCaption
            .OnAction = "Slet" 'navnet på makroen der skal afspilles
        End With
        Set ctrl2 = D.CommandBar.Controls _
        .Add(Type:=msoControlButton, ID:=1)
        With ctrl2
            .Caption = "Sletter noget"
            .TooltipText = "Slet nu"
            .Style = msoButtonCaption
            .OnAction = "Importer" 'navnet på makroen der skal afspilles
        End With
    End If
Next
End Sub

Public Sub SletMinCommandobar()
Dim Y As Application
Set myMenuBar = CommandBars.ActiveMenuBar
For Each D In myMenuBar.Controls
    If D.Caption = "Forma&ter" Then
        With D
            .Reset
        End With
    End If
Next
End Sub

Sub Slet()
MsgBox "Slet " & ThisWorkbook.Name
End Sub

Sub Importer()
MsgBox "Importer " & ThisWorkbook.Name
End Sub
Avatar billede hubertus Seniormester
07. september 2007 - 15:03 #38
Hejsa - det var ikke lige den løsning jeg havde i tankerne - en den giver nye muligheder, som jeg ikke kendte. Det jeg tænke på var at få anbragt en knap på værktøjslinien: formatering. Er det muligt at bestemme hvor på værktøjslinien knappen placeres?
Avatar billede hubertus Seniormester
07. september 2007 - 15:34 #39
Nu går din kode på menulinien, kan du få den til at virke, hvis der oprettes en brugerdefineret værktøjslinie, hvorpå der skal indsættes 2 knapper? Det var jo mit oprindelige problem.
Avatar billede gider_ikke_mere Nybegynder
07. september 2007 - 19:01 #40
Jamen, har vi ikke lavet det før i en anden tråd?
Avatar billede gider_ikke_mere Nybegynder
08. september 2007 - 04:06 #41
Yes, we did that in another afsnit: http://www.eksperten.dk/spm/730267


I ThisWorkbook:

Private Sub Workbook_Activate()
OpretSpecialknapper
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
SletSpecialknapper
End Sub

Private Sub Workbook_Deactivate()
SletSpecialknapper
End Sub


I et modul:

Sub OpretSpecialknapper()
Dim mnu As CommandBar
    For Each mnu In Application.CommandBars
        If mnu.Name = "Formatting" Then
           
            Set NewKnap = mnu.Controls _
            .Add(Type:=msoControlButton, ID:=1851)
            With NewKnap
                .Caption = "Jeg giver værdien på celle A1"
                .OnAction = "MinMakro1"
            End With
           
            Set NewKnap = mnu.Controls _
            .Add(Type:=msoControlButton, ID:=1851)
            With NewKnap
                .Caption = "Jeg giver værdien på celle A2"
                .OnAction = "MinMakro2"
            End With

        End If
    Next

End Sub

Sub SletSpecialknapper()
Dim mnu As CommandBar
    For Each mnu In Application.CommandBars
        If mnu.Name = "Formatting" Then
            With mnu
                .Reset
            End With
        End If
    Next
End Sub


Sub MinMakro1()
MsgBox "Range A1.value er: " & Range("A1").Value
End Sub

Sub MinMakro2()
MsgBox "Range A2.value er: " & Range("A2").Value
End Sub



Du kan i øvrigt se en liste med button faces med denne .xla fil: http://www.oaltd.co.uk/DLCount/DLCount.asp?file=BtnFaces.zip

Download den, dobb. klik på .xla filen for at åbne. Kør makroen ToolFaceCtrl

Andre gode sager kan findes her: http://www.oaltd.co.uk/MVP/MVPPage.asp
Avatar billede hubertus Seniormester
08. september 2007 - 08:05 #42
Ovennævnte kode var den som egentlig gav mig problemet med at fastholde knap og makro, når der arbejdes i flere ark, hvor arkene løbende åbnes/lukkes, men kombineres den med din kode fra 27/8, så ser det ud til at mit problem er løst.
Point er på vej!  Tak for hjælpen - den bragte mig videre :O)
Avatar billede gider_ikke_mere Nybegynder
08. september 2007 - 14:29 #43
Koden 08/09-2007 04:06:03, virker i sig selv alene, og lægger knapperne ind under "Formatering".
Avatar billede hubertus Seniormester
09. september 2007 - 08:22 #44
Det er korrekt, men når du skifter mellem flere ark, kan den ikke finde makroen, som hører til arket, mao. mit oprindelige problem. Din sidste kode løste imidlertid dette forhold.
Avatar billede hubertus Seniormester
10. september 2007 - 16:41 #45
Hej Akyhne - jeg sætter lige nogle flere point på højkant, hvis du kan hjælpe med følgende:
Når jeg har oprettet en værktøjslinie, hvilke muligheder har jeg så for at bestemme, hvor den bliver placeret. Jeg kender: Toolbars("Container").Position = xlTop, men den lægger blot værktøjslinien som en ny linie. Jeg vil gerne have den i forlængelse af en eksisterende. Kan jeg det?
Avatar billede gider_ikke_mere Nybegynder
10. september 2007 - 18:24 #46
Det er jeg faktisk ikke klar over. Med denne kode kan du i hvertfald se position og form af dine eksisterende toolbars.

Sub Makro2()
Set s = Application.Toolbars
For Each D In s
    If D.Visible = True Then
        MsgBox D.Name & ":" & vbLf _
        & "Venstre.. " & D.Left & vbLf _
        & "top.. " & D.Top & vbLf _
        & "højde.. " & D.Height & vbLf _
        & "bredde.. " & D.Width & vbLf _
        & ""
    End If
Next
End Sub

Ud fra de data, kan du selvfølgelig positionere dine toolbars som du vil. Men det vil så ikke passe, såfremt brugerne har forskellig skærmopløsning.
Avatar billede hubertus Seniormester
11. september 2007 - 06:50 #47
Ved du hvordan man sætter menuen fast (dockable) til en af de andre menuer?
Avatar billede gider_ikke_mere Nybegynder
11. september 2007 - 07:54 #48
Havde jeg vidst det, ville jeg sikekrt også kunne løse dit problem. Hvis der er en metode, er det sikkert noget med:
Set newMenu = myMenuBar.Controls.Add(Type:=msoControlPopup, Temporary:=True) before "noget kode".
Avatar billede gider_ikke_mere Nybegynder
11. september 2007 - 08:27 #49
Det er tilsyneladende RowIndex der bestemmer det:

Sub test2()
Set mybar = CommandBars("Standard")
With mybar
    .Position = msoBarTop 'Fortæller  at den skal ligge for oven
    .RowIndex = 1 'Rækkefølgen
End With

Set mybar = CommandBars("Formatting")
With mybar
    .Position = msoBarTop
    .RowIndex = 2 'Rækkefølgen
End With

Set mybar = CommandBars("ikoner")
With mybar
    .Position = msoBarTop
    .RowIndex = 3 'Rækkefølgen
End With
End Sub
Avatar billede hubertus Seniormester
14. september 2007 - 19:39 #50
Det er fint nok, det kan jeg godt arbejde videre med. Jeg opretter lige et spørgsmål med nogle point, som tak for hjælpen. :O)
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