运行 按钮下的子程序 -
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
在你上面的代码中,我不得不注释掉你没有包含的所有子程序,只是为了让它编译调试。
- 要使宏按钮或 "Assign Macro..." 可以访问子程序,您必须将其设置为 Public
- 另外,为了使 sub 可访问,它不能有任何传递参数。
- 因此您必须从 Public Sub APFormRun() 定义中删除传递的参数
- 因此您将不得不重写 APFormRun 的初始部分...目前您的 APFormRun 依赖于获取您选择的单元格的传递参数 (Target) -点击。当您按下一个按钮时,没有您右键单击的单元格。它不是细胞识别 Excel 事件。您将必须通过 Selection excel 对象获取选定的单元格。 Whosebug 上有很多关于如何做到这一点的答案。
我有这个 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
在你上面的代码中,我不得不注释掉你没有包含的所有子程序,只是为了让它编译调试。
- 要使宏按钮或 "Assign Macro..." 可以访问子程序,您必须将其设置为 Public
- 另外,为了使 sub 可访问,它不能有任何传递参数。
- 因此您必须从 Public Sub APFormRun() 定义中删除传递的参数
- 因此您将不得不重写 APFormRun 的初始部分...目前您的 APFormRun 依赖于获取您选择的单元格的传递参数 (Target) -点击。当您按下一个按钮时,没有您右键单击的单元格。它不是细胞识别 Excel 事件。您将必须通过 Selection excel 对象获取选定的单元格。 Whosebug 上有很多关于如何做到这一点的答案。