excel - 在 VBA 中将工作表作为变量从一个子过程传递到另一个子过程

标签 excel vba

这是我在 stackoverflow 上的第一篇文章。我在 Excel VBA 中有两个子程序。第一个称为 Sub IAR_part_2(),旨在将两个工作表(按索引位置)分配给名为sheetname1 和sheetname2 的两个变量。分配变量后,我尝试将它们传递给第二个子过程(称为 IAR_macro)进行处理。这两个工作表相互依赖,因此工作表 4 和工作表 8 通过 IAR 宏、工作表 5 和工作表 9、工作表 6 和工作表 10 等运行。我的问题是我无法弄清楚如何将工作表名称变量从 IAR_part_2 传递到IAR_宏。我做错了什么?

Sub IAR_part_2()

    sheetname1 = Worksheets(4)
    sheetname2 = Worksheets(8)

    Call IAR_macro

End Sub

Sub IAR_macro(sheetname1 As Worksheet, sheetname2 As Worksheet)

    Dim h As Long
    Dim i As Long
    Dim l As Long
    Dim j As Long
    Dim k As Long
    Dim lr As Long

    Worksheets(sheetname1).Activate

    ' Find the number of the last cell with data in column A and subtract 1 to populate variable i
    On Error GoTo Canceled
    i = (Range("B1").End(xlDown).Row) - 1

    'Switch over to the Code sheet
    Worksheets(sheetname2).Activate

    'While the number of loops is less than variable i minus 1, copy the contents of cells A2 through A29 over and over down the worksheet
    Do While l < (i - 1)

        Range("A2:A29").Select
        Selection.Copy
        lr = Cells(Rows.Count, "A").End(xlUp).Row
        Range("A" & lr + 1).Select
        ActiveSheet.Paste

        l = l + 1

        'rest of macro follows from here...

最佳答案

如何将工作表对象传递到不同子对象的简单示例:

Sub Macro1()

    'Declare variables
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet

    'Assign variables to worksheet objects
    Set ws1 = Worksheets(4)
    Set ws2 = Worksheets(8)

    'Call the second sub and pass the worksheet variables to it
    Call Macro2(ws1, ws2)

End Sub

Sub Macro2(ByVal arg_ws1 As Worksheet, ByVal arg_ws2 As Worksheet)

    'Reference the accepted arguments (in this case worksheet variables) directly:
    MsgBox arg_ws1.Name
    MsgBox arg_ws2.Name

    'This will result in an error because you're using the passed argument incorrectly:
    MsgBox ActiveWorkbook.Sheets(arg_ws1).Name    '<-- Results in error

End Sub

必须直接引用传递的参数。如果您想使用代码中显示的结构,则传递的参数需要是字符串(但不推荐此方法):

Sub Macro1()

    'Declare variables
    Dim sSheet1 As String
    Dim sSheet2 As String

    'Assign variables to worksheet objects
    sSheet1 = Worksheets(4).Name
    sSheet2 = Worksheets(8).Name

    'Call the second sub and pass the worksheet variables to it
    Call Macro2(sSheet1, sSheet2)

End Sub

Sub Macro2(ByVal arg_sSheetName1 As String, ByVal arg_sSheetName2 As String)

    'Because the arguments are strings, you can reference the worksheets this way
    'This method is NOT recommended
    MsgBox Worksheets(arg_sSheetName1).Name
    MsgBox Worksheets(arg_sSheetName2).Name

End Sub

关于excel - 在 VBA 中将工作表作为变量从一个子过程传递到另一个子过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53103855/

相关文章:

asp.net-mvc - Excel 不想打开通过 ASP 输出下载的 XLSX 文件

c# - Microsoft OLEDB 错误外部表不是预期的格式

excel - 在数据透视表之前插入excel数据

excel - 如果两列相同,则查找并替换

excel - 将 Excel 中的单元格内容粘贴到记事本中?

vba - vba excel中TextBox中的每个字符都有不同的颜色

excel - 如何在谷歌脚本(宏excel)中查找数组中存在的元素数

excel - 打开工作簿时 Worksheet_Activate 不触发

VBA循环遍历所有图表中的所有系列

vba - Excel VBA 保存屏幕截图