Avatar billede mr.handstand Novice
28. juni 2004 - 07:29 Der er 6 kommentarer og
1 løsning

Add button via VBA til excelsheet

Hej,
jeg ønsker at kunne oprette en knap automatisk på et almindeligt excel-ark, og bestemme hvor på arket knappen placeres.

Kontekst:
Jeg har lavet et input-ark med en manuelt oprettet button. Input-arket indeholder en mængde data (300+ parametre), og resulterer i en analyse med et output-sheet som resultat. Jeg ønsker, når analysen har kørt, at kopiere input-arket, omdøbe det, og tilføje en række på et input-summary-sheet, hvor overskriften fra input-arket står, sammen med to knapper: én der kører analysen igen, og en toggleknap, der viser/skjuler det specifikke inputark. Derved kan man opdatere sine masterdata, og efterfølgende gentage alle analyserne (evt. ved et kald, der løber igennem den "collection" af knapper, der efterhånden er oprettet på input-summary-sheet.) Det er ikke noget problem at kopiere input-arket, men hvordan skaber jeg mine knapper, sådan jeg jeg indsætter dem på en ny række hver gang jeg kører et nyt input-sheet?

Jeg sidder og leder efter svar i mine VBA-reference bøger, men mon ikke svaret ligger lige på tungen hos en af jer...

På forhånd tak ! :-)
Avatar billede mr.handstand Novice
28. juni 2004 - 09:06 #1
er selv igang med at kigge på
http://www.eksperten.dk/spm/342573

hvor Bak omtaler VBIDE, da det skal bruges i processen, og der garanteret er noget i spørgsmålets kommentarer, der kan hjælpe mig videre...
Avatar billede stefanfuglsang Juniormester
28. juni 2004 - 10:12 #2
Noget i retning af
Sub Makro1()
    Application.CommandBars("Control Toolbox").Visible = True
    ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
        , DisplayAsIcon:=False, Left:=161.25, Top:=100.5, Width:=72, Height:= _
        24).Select
    Selection.ShapeRange.Left = Range("b7").Left
    Selection.ShapeRange.Top = Range("b7").Top
    Selection.ShapeRange.width= Range("b7").Width
    Selection.ShapeRange.height= Range("b7").height

End Sub

Knappen lægger sig i B7
Avatar billede stefanfuglsang Juniormester
28. juni 2004 - 10:18 #3
Linien
    Application.CommandBars("Control Toolbox").Visible = True
kan udelades, den kom med da jeg indspillede makroen
Tilføj
Selection.ShapeRange.Name = "Test" ' eller et andet navn

Jeg er lidt i tvivl om hvordan du får tilknyttet den rigtige procedure til din knap, men følgende procedure på den relevante ark bliver kaldt

Private Sub Test_Click()
    MsgBox "Hej"
End Sub
Avatar billede stefanfuglsang Juniormester
28. juni 2004 - 10:21 #4
Baks kode kan sikkert bruges, men husk at bruge "Shaperange"-object og ikke "Forms", da du skal have knappen liggende i en celle
Avatar billede mr.handstand Novice
28. juni 2004 - 10:22 #5
Hej og tak Stefanfuglsang,
Lige før jeg giver pointene - jeg ved godt at det er lidt ud over det oprindelige spm, men har du også lige et forslag til, hvordan jeg så bruger knappen til at kalde en public sub med fx A7 som input?
Avatar billede mr.handstand Novice
28. juni 2004 - 10:38 #6
Jeg kan godt følge dig, Stefan, men jeg vil gerne forsøge at undgå "selection", hvilket vil sige at jeg anvender dit input vedr. placeringen, men opretter det som brynil indleder spm http://www.eksperten.dk/spm/342573

Men du får pointene for at lede mig i den rigtige retning! :-)

Jeg må nok hellere oprette et andet spm til problemstillingen med at håndtere det bagvedliggende procedurekald, som er mere i stil med VBIDE...
Avatar billede bak Forsker
28. juni 2004 - 14:28 #7
Denne opretter en knap på det aktive ark i kolonne B i samme række som den aktive celle og den tilhørende kode, som så refererer til samme rækkes kolonne A.
Dvs at den kalder en public sub Testing med kolonne A's adresse.

Sub AddProcedure()

Dim VBCodeMod As CodeModule
Dim Line As Long, t As Single, l As Single
Dim SheetName As String, SheetCodeName As String
Dim Knap As OLEObject

Application.ScreenUpdating = False

SheetName = "Ark1"
SheetCodeName = Sheets(SheetName).CodeName
t = ActiveCell.Top
l = Columns(2).Left
Set Knap = ThisWorkbook.Sheets(SheetName).OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
        , DisplayAsIcon:=False, Left:=l, Top:=t, Width:=131.25, Height _
        :=27.75)
Knap.Name = "cmdGemNavn" & CStr(ActiveCell.Row)
Knap.Object.Caption = "Vis noget"

Set VBCodeMod = ThisWorkbook.VBProject.VBComponents(SheetCodeName).CodeModule

With VBCodeMod
    Line = .CreateEventProc("Click", Knap.Name)
    .InsertLines Line + 2, "call testing(""" & Cells(ActiveCell.Row, 1).Address & """)"
End With
Application.VBE.MainWindow.Visible = False

Application.ScreenUpdating = True
End Sub

Sub testing(t As String)
MsgBox t
End Sub
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