Avatar billede fojensen Nybegynder
03. juni 2015 - 17:33 Der er 5 kommentarer og
1 løsning

hjælp til at loope alle knapper i et sheet igennem med For Each-løkke

Jeg skal lige have noget hjælp til at styre nogle kommandoknapper som jeg har placeret direkte i et regnskabs-sheet
Hver måned genereres der et nyt sheet efter en skabelon hvor jeg har de samme knapper liggende.
Jeg har bare en fornemmelse af at disse knapper ikke altid bevarer deres navn efter kopiering af skabelon-sheet til en ny måneds-sheet.

For at få oplyst navn på mine kanpper i arket, har jeg indspillet en makro, for at se hvordan jeg tilgår disse knapper:
første forsøg kom til at se således ud:
Sub Makro5()
'
    ActiveSheet.Shapes.Range(Array("Button 5")).Select
    ActiveSheet.Shapes.Range(Array("Button 2")).Select
    ActiveSheet.Shapes.Range(Array("Button 4")).Select
    ActiveSheet.Shapes.Range(Array("Button 3")).Select
End Sub


samme forsøg som jeg indspillede 10 min senere, kom til at se således ud (nu har knapperne åbenbart allerede fået nye navne):

Sub Makro6()
'
    ActiveSheet.Shapes.Range(Array("Button 7")).Select
    ActiveSheet.Shapes.Range(Array("Button 4")).Select
    ActiveSheet.Shapes.Range(Array("Button 6")).Select
    ActiveSheet.Shapes.Range(Array("Button 5")).Select
End Sub


Jeg kunne godt tænke mig at lave en for each-løkke hvor jeg løber mine kanpper igennem, undersøger hvilken tekst der står i knappen, og tildeler makro derefter.
Er der en "ekspert" der kan hjælpe mig med ar opstille en For Each-løkke i min VBA-procedure,der løber alle mine knapper igennem?

så vil jeg for hver knap der findes trække text
If    Selection.Characters.Text = "Indtægter"
    ' tildel makro der åbner indtægt-fuseform...
End if

Jeg har selv laver nedenstående lille forsøg, men det fejler allerede i if-sætningen på at Shape.Characters.Text er ukendt egenskab.
Det ser altså ud til at For Each-løkken kører, men if-sætningen fejler
det object jeg bruger "Shape", skal det evt. erklæres først?

Public Sub tstbuttom()
'loop alle knapper og tildel makro...
For Each Shape In ActiveSheet.Shapes
    If Shape.Characters.Text = "Indtægter" Then
    ' tildel makro der åbner indtægt-fuseform...
        Shape.OnAction = "RegIndtaegt" ' RegIndtaegt

    End If
    If Shape.Characters.Text = "Udgifter" Then
  ' tildel makro der åbner indtægt-fuseform...
        Shape.OnAction = "RegUdgifter" ' RegUdgifter

    End If
Next Shape

End Sub
Avatar billede supertekst Ekspert
03. juni 2015 - 17:38 #1
Avatar billede fojensen Nybegynder
03. juni 2015 - 19:13 #2
@supertekst:
din For-løkke looper fint igennem mine shapes, men jeg mangler hjælp til hvordan jeg tilgår knappens tekst...

jeg har kogt min kode ned så jeg kun tester ganske simpelt i hvert loop...
MsgBox ActiveSheet.Shapes(Counter).Characters.Text

men den fejler stadig på egenskaber...
Jeg har forsøgt både med Characters.Text, Characters, Caption og Text, men den vil ha' noget andet

Hjælp mig hvem der kan...
Avatar billede fojensen Nybegynder
03. juni 2015 - 19:23 #3
Nu skrev du jo ikke en færdig kode til mig, men lod mig inspirere af din måde at gennemløbe knapperne på, og den synes jeg er rigtig genial... (gal eller genial) - genialt at du tæller baglæns. Det har jeg ikke brugt så tit.

Jeg poster lige min procedure, som er inspireret af den du henviste til:
så kan du tjekke at jeg har omskrevet det rigtigt - jeg har dog udkommenteret alle mine if-sætninger (for at gøre det enkelt...
Sub LoopButtons()

If ActiveSheet.Shapes.Count > 0 Then
    For Counter = ActiveSheet.Shapes.Count To 1 Step -1
    MsgBox ActiveSheet.Shapes(Counter).Characters.Text
   
'        If ActiveSheet.Shapes(Counter).Characters = "Se regnskab" Then
'        ActiveSheet.Shapes(Counter).OnAction = "OpenThisMonth" ' skift til regnskabs-sheet
'        End If
'        If ActiveSheet.Shapes(Counter).Characters.Text = "Indtægter" Then
'        ActiveSheet.Shapes(Counter).OnAction = "RegIndtaegt" ' Udgifter
'        End If
'        If ActiveSheet.Shapes(Counter).Characters.Text = "Se bank" Then
'        ActiveSheet.Shapes(Counter).OnAction = "OpenThisMonthBank" ' skift til bank
'        End If
'        If ActiveSheet.Shapes(Counter).Characters.Text = "Indtægter" Then
'        ActiveSheet.Shapes(Counter).OnAction = "RegUdgifter" ' indtægter
'        End If
'        If ActiveSheet.Shapes(Counter).Characters.Text = "Gem og luk" Then
'        ActiveSheet.Shapes(Counter).OnAction = "SaveAndClose " ' luk
'        End If
    Next
End If

End Sub
Avatar billede fojensen Nybegynder
03. juni 2015 - 21:22 #4
Jeg kan supplere med at en indspillet makro hvormed jeg ændrer en knaps tekst, kom til at se således ud:
Sub Makro7()

    ActiveSheet.Shapes.Range(Array("Button 7")).Select
    Selection.Characters.Text = "Indtægter"
    With Selection.Characters(Start:=1, Length:=9).Font
        .Name = "Lucida Grande"
        .FontStyle = "Fed"
        .Size = 10
        .StrikeThrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
End Sub
Avatar billede fojensen Nybegynder
04. juni 2015 - 16:23 #5
Ha, ha...
Så fandt jeg selv løsningen.
Selvom den meldte fejl med forkerte egenskaber, så var det muligt at tilgå egenskaben via en lille omvej.
Ved først at selecte objectet, og så bruge Selection.Characters.Text, så blev det muligt at tilgå knappens tekst i min if-sætning.
Dog ville den IKKE have nøjes med Selection, da jeg ville ændre egenskaben OnAction .

min procedure kom derefter at se således ud:
Sub LoopButtons()

If ActiveSheet.Shapes.Count > 0 Then
    For Counter = ActiveSheet.Shapes.Count To 1 Step -1
    ActiveSheet.Shapes(Counter).Select
   
      If Selection.Characters.Text = "Se regnskab" Then
      ActiveSheet.Shapes(Counter).OnAction = "OpenThisMonth" ' skift til regnskabs-sheet
      End If
        If Selection.Characters.Text = "Indtægter" Then
            ActiveSheet.Shapes(Counter).OnAction = "RegIndtaegt" ' Udgifter
        End If
        If Selection.Characters.Text = "Se bank" Then
            ActiveSheet.Shapes(Counter).OnAction = "OpenThisMonthBank" ' skift til bank
        End If
        If Selection.Characters.Text = "Udgifter" Then
            ActiveSheet.Shapes(Counter).OnAction = "RegUdgifter" ' indtægter
        End If
        If Selection.Characters.Text = "Gem og luk" Then
            ActiveSheet.Shapes(Counter).OnAction = "SaveAndClose" ' luk
        End If
    Next
End If

End Sub


@supertekst:
Jeg vil gerne have dig til at smide et svar, da du skal have nogle points for at lede mig den rigtige vej med at gennemløbe alle mine knapper. Det var en væsentlig hjælp, som jeg takker for...
Avatar billede supertekst Ekspert
04. juni 2015 - 17:45 #6
fint det lykkedes og selv tak
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