Excel - 如何在Workbook_Open事件上创建按钮

时间:2015-06-15 21:35:11

标签: excel vba excel-vba button excel-2013

我正在尝试制作一个Excel加载项,以便在打开任何工作簿时创建一个简单的按钮,但我正在

  

对象变量或With Block变量未设置

我认为这种情况正在发生,因为从技术上来说还没有'ActiveWorkbook'。

我要做的第一件事是删除工作表上当前的任何按钮。然后我想放一个按钮。

任何人都知道如何实现这一目标?

代码

Private Sub Test_Press()

然后我有一个{{1}}来显示一个MsgBox。但是没有创建按钮。

2 个答案:

答案 0 :(得分:1)

信用转到http://www.jkp-ads.com/Articles/FixLinks2UDF.asp

注意:我有另一个模块,我没有发布在下面,其中包含宏 Project_Count 我绑在我放在工作簿上的按钮上只有工作簿名称为TT_GO_ExceptionReport

我还有一个下载加载项的VBScript,将其放在用户的addin文件夹中,然后安装它。如果您想知道如何操作,请发表评论。

解决问题的加载项代码:

<强>的ThisWorkbook

Option Explicit
    Private Sub Workbook_Open()
    ' Purpose   : Code run at opening of workbook
    '-------------------------------------------------------------------------    
    'Initialise the application
    InitApp
    modProcessWBOpen.TimesLooped = 0

    Application.OnTime Now + TimeValue("00:00:03"), "CheckIfBookOpened"
End Sub

模块1 名为 modInit     选项明确

'Create a module level object variable that will keep the instance of the
'event listener in memory (and hence alive)
Dim moAppEventHandler As cAppEvents

    Sub InitApp()
        'Create a new instance of cAppEvents class
        Set moAppEventHandler = New cAppEvents
        With moAppEventHandler
            'Tell it to listen to Excel's events
            Set .App = Application
        End With
    End Sub

模块2 名为 modProcessWBOpen     选项明确

'Counter to keep track of how many workbooks are open
Dim mlBookCount As Long

'Counter to check how many times we've looped
Private mlTimesLooped As Long

' Purpose   : When a new workbook is opened, this sub will be run.
' Called from: clsAppEvents.App_Workbook_Open and ThisWorkbook.Workbook_Open
'-------------------------------------------------------------------------
Sub ProcessNewBookOpened(oBk As Workbook)

    If oBk Is Nothing Then Exit Sub
    If oBk Is ThisWorkbook Then Exit Sub
    If oBk.IsInplace Then Exit Sub

    CountBooks

    'This checks to make sure the name of the new book matches what I 
    'want to place the button on
    If oBk.Name = "TT_GO_ExceptionReport.xlsm" Then
        Dim CommandButton As Button
        Set CommandButton = Workbooks("TT_GO_ExceptionReport.xlsm").Sheets(1).Buttons.Add(1200, 100, 200, 75)
        With CommandButton
            .OnAction = "Project_Count"
            .Caption = "Press for Simplified Overview"
            .Name = "Simplified Overview"
        End With
    End If
End Sub

Sub CountBooks()
    mlBookCount = Workbooks.Count
End Sub

Function BookAdded() As Boolean
    If mlBookCount <> Workbooks.Count Then
        BookAdded = True
        CountBooks
    End If
End Function

' Purpose   : Checks if a new workbook has been opened 
' (repeatedly until activeworkbook is not nothing)
'-------------------------------------------------------------------------
Sub CheckIfBookOpened()

    If BookAdded Then
        If ActiveWorkbook Is Nothing Then
            mlBookCount = 0
            TimesLooped = TimesLooped + 1
            'May be needed if Excel is opened from Internet explorer
            Application.Visible = True
            If TimesLooped < 20 Then
                Application.OnTime Now + TimeValue("00:00:01"), "CheckIfBookOpened"
            Else
                TimesLooped = 0
            End If
        Else
            ProcessNewBookOpened ActiveWorkbook
        End If
    End If
End Sub

Public Property Get TimesLooped() As Long
    TimesLooped = mlTimesLooped
End Property

Public Property Let TimesLooped(ByVal lTimesLooped As Long)
    mlTimesLooped = lTimesLooped
End Property

类模块名为 cAppEvents

' Purpose   : Handles Excel Application events
'-------------------------------------------------------------------------
Option Explicit

'This object variable will hold the object who's events we want to respond to
Public WithEvents App As Application

Private Sub App_WorkbookOpen(ByVal Wb As Workbook)

    'Make sure newly opened book is valid
    ProcessNewBookOpened Wb
End Sub

Private Sub Class_Terminate()
    Set App = Nothing
End Sub

答案 1 :(得分:0)

这样的事情?

Option Explicit
Sub Button()
    Dim cButton As Button
    Dim rng As Range
    Dim i As Long

    ActiveSheet.Buttons.Delete

    For i = 2 To 3 Step 2
        Set rng = ActiveSheet.Range(Cells(i, 2), Cells(i, 2))
        Set cButton = ActiveSheet.Buttons.Add(rng.Left, rng.Top, rng.Width, rng.Height)
        With cButton
            .OnAction = "Test_Press"
            .Caption = "Press for Test " & i
            .Name = "Test" & i
        End With
    Next i
End Sub

参见示例here