运行 按钮下的子程序 -

Run subprocedure under button -

我有这个 sub/macro 如果我 运行 它作为 BeforeRightClick 就可以工作。但是,我想对其进行更改,以便我实际上可以使用我的右键单击并将宏放在按钮上。

所以我尝试将名称从 BeforeRightClick.
更改为 我已经尝试过使用普通表单按钮和 ActiveX。
所有这些 + 一些更多代码发布在 Sheet1 下而不是模块

Dim tabA As Variant, tabM As Variant
Dim adrA As String, adrM As String

' Set columns (MDS tabel) where data should be copied to (APFtabel)
                'Post to
                'P1-6 divisions     ' Name adress, etc
Const APFtabel = "P1;P2;P3;P4;P5;P6;E9;E10;E13;E14;E23;N9;N10;N11;N12;N20"
                'Load data from
Const MDStabel = "N;O;P;Q;R;S;H;Y;Z;AB;W;AF;T;D;AA;V;"
Dim APF As Workbook
' APFilNavn is the name of the AP form
Const APFilNavn = "APForm_macro_pdf - test.xlsm"
' Const APFsti As String = ActiveWorkbook.Path
Const APFarkNavn = "Disposition of new supplier"
' APsti is the path of the folder
Dim sysXls As Object, APFSti As String

Dim ræk As Integer

Private Sub CommandButton1_Click()
APFormRun
End Sub

' Here I changed it from BeforeRightClick
Private Sub APFormRun(ByVal Target As Range, Cancel As Boolean)
Dim cc As Object
If Target.Column = 8 Then
APFSti = ActiveWorkbook.Path & "\"
    If Target.Address <> "" Then
        For Each cc In Selection.Rows
            Cancel = True
            ræk = cc.Row
            Set sysXls = ActiveWorkbook
            åbnAPF
            overførData
            opretFiler

            APF.Save
            APF.Close
            Set APF = Nothing

            Set sysXls = Nothing
        Next cc
    End If
End If
End Sub

Private Sub overførData()
Dim ix As Integer
    tabA = Split(APFtabel, ";")
    tabM = Split(MDStabel, ";")

    Application.ScreenUpdating = False

    For ix = 0 To UBound(tabM) - 1
        If Trim(tabM(ix)) <> "" Then
            adrM = tabM(ix) & ræk

            If tabA(ix) <> "" Then
                adrA = tabA(ix)
            End If

            With APF.ActiveSheet
                .Range(adrA).Value = sysXls.Sheets(1).Range(adrM).Value
            End With
        End If
    Next ix
End Sub

Private Sub opretFiler()
' Here I run some other macro exporting the files to Excel and PDF
    btnExcel
    btnExportPDF
End Sub

如果您将此代码放在 Sheet1 中,则要从按钮访问它,您需要将其名称(在按钮中)定义为 Sheet1.APFormRun(我认为您需要将其设为 Public).

如果将 sub 及其调用的所有内容移动到模块(在执行插入-> 模块之后),则不需要 Excel 对象名称前缀。

下面的 link 中有一篇关于范围界定的非常详细的文章。向下滚动到 "Placement of Macros/ Sub procedures in appropriate Modules" 部分:http://www.globaliconnect.com/excel/index.php?option=com_content&view=article&id=162:excel-vba-calling-sub-procedures-a-functions-placement-in-modules&catid=79&Itemid=475

在你上面的代码中,我不得不注释掉你没有包含的所有子程序,只是为了让它编译调试。

  1. 要使宏按钮或 "Assign Macro..." 可以访问子程序,您必须将其设置为 Public
  2. 另外,为了使 sub 可访问,它不能有任何传递参数。
  3. 因此您必须从 Public Sub APFormRun() 定义中删除传递的参数
  4. 因此您将不得不重写 APFormRun 的初始部分...目前您的 APFormRun 依赖于获取您选择的单元格的传递参数 (Target) -点击。当您按下一个按钮时,没有您右键单击的单元格。它不是细胞识别 Excel 事件。您将必须通过 Selection excel 对象获取选定的单元格。 Whosebug 上有很多关于如何做到这一点的答案。