[Excel] Via macro opdracht aan commandbutton toewijzen

Pagina: 1
Acties:
  • 1.243 views sinds 30-01-2008
  • Reageer

  • awenger
  • Registratie: Februari 2006
  • Laatst online: 14-12 17:02
Ik ben in Excel bezig met een programmatje te schrijven.
Ik heb het nu zo ver dat door 1 druk op de knop een nieuw werkblad wordt aangemaakt waar de benodigde informatie in wordt gezet. Ook wordt er via VB een Commandbutton aangemaakt in dat nieuwe werkblad. Het enige wat me maar niet wil lukken is het automatisch toewijzen van een sub aan die commandbutton. Hoe kan ik dit voor elkaar krijgen?

[ Voor 5% gewijzigd door awenger op 01-06-2006 19:53 ]


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Zoiets?:
Visual Basic:
1
2
3
4
5
6
7
Private Sub CommandButton1_Click()
    Test
End Sub

Sub Test()
    MsgBox "Testje"
End Sub


[edit]
Waarschijnlijk heb ik het verkeerd gelezen. Je wilt waarschijnlijk dynamisch code toevoegen.

Tegenwoordig kan je niet meer zomaar code toevoegen. Je moet allemaal beveiligingen uitzetten. Vroeger waren er veel macrovirussen die hier misbruik van maakten. Ik zal er even eentje zoeken...

[edit2]
Ik had er al eentje in dit topic gezet:
[rml][ VBA] Excel eventhandler tijdens runtime toewijzen[/rml]

[ Voor 72% gewijzigd door Daos op 01-06-2006 20:32 ]


  • awenger
  • Registratie: Februari 2006
  • Laatst online: 14-12 17:02
Bedankt voor je respons, maar dat is niet wat ik bedoel.
ik heb mijn sheet zover dat er automatisch een commandbutton1 wordt aangemaakt.
Alleen als deze knop wordt aangemaakt, heeft deze nog geen opdracht. Deze opdracht heb ik al wel klaar staan in een sub.
Alleen hoe zorg ik er voor dat die knop wordt gekoppeld aan de sub die ik al klaar heb staan?

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Je kan volgens mij ook iets doen met WithEvents.

[edit]
Voorbeeldje in VB5/6 (lijkt op VBA).

[ Voor 55% gewijzigd door Daos op 01-06-2006 20:48 ]


  • awenger
  • Registratie: Februari 2006
  • Laatst online: 14-12 17:02
hoe zou ik dat moeten doen dan? Mijn kennis van VB is miniem en wat ik wil lijkt zo simpel. Ik wil gewoon dat ik automatisch een knop aanmaak die iets kan. Wat die knop moet kunnen heb ik al geprogrammeerd, alleen moet ik het nu nog koppelen via VB en ik zou niet weten hoe.

  • awenger
  • Registratie: Februari 2006
  • Laatst online: 14-12 17:02
bedankt voor je linkje, maar veel wijs wordt ik er niet uit (door mijn beperkte VB kennis). Ik zal de code hier eens posten:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Sub New_react()
    Rows("8:8").Select
    Selection.Insert Shift:=xlDown
    Selection.Insert Shift:=xlDown
    Sheets("Bron").Select
    Range("A1:I2").Select
    Selection.Copy
    Sheets("Administratieve problemen").Select
    Range("A8").Select
    ActiveSheet.Paste
End Sub
Sub nieuw_topic()
Dim nieuwblad As Worksheet
Dim oudblad As Worksheet
Dim nieuwbladnaam As String
nieuwbladnaam = Application.InputBox(prompt:="Naam van het nieuwe onderwerp, begin met T voor technische onderwerpen of met A voor administratieve onderwerpen. Gebruik geen leestekens of haakjes.", Type:=2)
'foutcontrole
For Each oudblad In ActiveWorkbook.Worksheets
    If oudblad.Name = nieuwbladnaam Then
        MsgBox "Onderwerp bestaat al, verzin een nieuw onderwerp"
        Exit Sub
    End If
Next oudblad
Set nieuwblad = ActiveWorkbook.Worksheets.Add
nieuwblad.Name = nieuwbladnaam
Sheets(nieuwbladnaam).Select
Sheets("Bron").Select
Range("A4:I8").Select
Selection.Copy
Sheets(nieuwbladnaam).Select
Range("A3").Select
Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
ActiveSheet.Paste
Range("A1").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = nieuwbladnaam
Selection.Font.Bold = True
    With Selection.Font
        .Name = "Arial"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With
    Sheets(nieuwbladnaam).Select
    Sheets(nieuwbladnaam).Move Before:=Sheets(3)
    Application.CommandBars("Control Toolbox").Visible = True
    ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
        , DisplayAsIcon:=False, Left:=592, Top:=54, Width:=72, Height:=28) _
        .Select
    Selection.Verb Verb:=xlPrimary
    Range("K11").Select
    ActiveSheet.OLEObjects("CommandButton1").Object.Caption = "Reageer!"
End Sub


Zoals je ziet bestaat de code uit twee subs. Aan het eind van de tweede sub maak ik een knop aan. Deze moet de opdracht uitvoeren die in de eerste sub vermeld staat.

Het uiteindelijke doel van de Excel sheet is om een soort forum op te zetten.

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Wat voegt al die code toe?


Ik heb maar even een voorbeeldje gemaakt:
In een nieuwe Class Module met de naam myButtonType zet je:
Visual Basic:
1
2
3
4
5
6
7
8
9
Dim WithEvents myButton As MSForms.CommandButton

Private Sub myButton_Click()
    MsgBox "hi"
End Sub

Public Property Set Button(cmdButton As MSForms.CommandButton)
    Set myButton = cmdButton
End Property


In een gewone module (of in de sheet) zet je:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Option Explicit

Dim myButtons As New Collection

Sub AddButton(sh As Worksheet)
    Dim ole As OLEObject
    Set ole = sh.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
                    Link:=False, DisplayAsIcon:=False, Left:=40, Top:=40, _
                    Width:=150, Height:=80)
    With ole
        .Name = "cmdButton"
    End With
                    
    Dim cmdButton As MSForms.CommandButton
    Set cmdButton = ole.Object
    With cmdButton
        .Caption = "Klik hier"
    End With
    
    Dim myButton As New myButtonType
    Set myButton.Button = cmdButton
    myButtons.Add myButton
End Sub

Sub MaakNieuweSheetMetKnopje()
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Sheets.Add
    AddButton sh
End Sub

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 18-12 10:45
Excel kent een flnik aantal knoppen. Ze zien er gelijk uit, maar zijn "onder water" compleet verschillend.
Je kan eventueel de knop uit de Forms collectie proberen, die is wat handiger om te besturen is mijn impressie.
Vervang je knopverhaal in nieuw_topic door:
code:
1
2
3
Set knop = nieuwblad.Shapes.AddFormControl(xlButtonControl, 592, 54, 72, 28)
knop.OnAction = "New_react"
knop.TextFrame.Characters.Text = "Reageer!"

en alles zou moeten werken.

  • awenger
  • Registratie: Februari 2006
  • Laatst online: 14-12 17:02
Hartstikke bedankt iedereen. Ik heb inmiddels via de tip van onkl de knop zoals ik hem hebben wil.
Pagina: 1