如何调用一个函数,该函数以VBA中第一个工作表以外的所有工作表为目标

如何调用一个函数,该函数以VBA中第一个工作表以外的所有工作表为目标,vba,call,worksheet,Vba,Call,Worksheet,我是VBA新手,有点迷糊了。 我基本上在Excel文件中有4个不同的工作表,第一个基本上是空的,除了一个按钮,我想链接到一个宏,该宏调用一个函数,该函数指向除第一个工作表(上面有按钮的工作表)以外的所有其他工作表,所以我想知道我该怎么做 到目前为止,我有这个,但它似乎不工作。在我调用的函数中,我还希望只针对除第一个工作表之外的每个工作表,然后有一长串我希望影响三个工作表的事情,所以我必须重复相同的代码吗?在函数调用和名为ProcessData的函数中,我都需要什么代码才能将第一个工作表以外的所有

我是VBA新手,有点迷糊了。 我基本上在Excel文件中有4个不同的工作表,第一个基本上是空的,除了一个按钮,我想链接到一个宏,该宏调用一个函数,该函数指向除第一个工作表(上面有按钮的工作表)以外的所有其他工作表,所以我想知道我该怎么做

到目前为止,我有这个,但它似乎不工作。在我调用的函数中,我还希望只针对除第一个工作表之外的每个工作表,然后有一长串我希望影响三个工作表的事情,所以我必须重复相同的代码吗?在函数调用和名为ProcessData的函数中,我都需要什么代码才能将第一个工作表以外的所有工作表都作为目标,其中包含一长串转换这些工作表上数据的内容

Sub DumpOutput()
    Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
    If WS.Name <> "Main" Then
        ProcessData WS
    End If
Next WS
End Sub

Sub ProcessData(ByRef w As Worksheet)
With w
    Range("f1:f3") = Application.Transpose(Array("1", "2", "3"))
    Debug.Print .Name
End With
End Sub
子转储输出()
将WS设置为工作表
对于此工作簿中的每个WS。工作表
如果WS.Name为“Main”,那么
ProcessData WS
如果结束
下一个WS
端接头
子流程数据(ByRef w作为工作表)
与w
Range(“f1:f3”)=Application.Transpose(数组(“1”、“2”、“3”))
Debug.Print.Name
以
端接头
子函数调用方()
将WS设置为工作表
对于此工作簿中的每个WS。工作表
如果WS.Name ThisWorkbook.Worksheets(1).Name则
调用ProcessData
如果结束
下一个WS
端接头

您需要将每个工作表对象传递到处理子过程中

Sub FunctionCaller()
    Dim WS As Worksheet
    For Each WS In ThisWorkbook.Worksheets
        If WS.Name <> "Main" Then
            ProcessData ws
        End If
    Next WS
End Sub

sub ProcessData(byref w as worksheet)
    with w
        'process the worksheet here.
        'any worksheet object members (e.g. Range, Cells, Name, etc) need to
        'be prefixed with a period (.) to be associated with the parent
        'worksheet defined in the With ... End With and passed into the
        'procedure as the parameter (e.g. .Range, .Cells, .Name, etc) 
        .Range("f1:f3") = Application.Transpose(Array(1, 2, 3))
        debug.print .name
    end with
end sub
子函数调用方()
将WS设置为工作表
对于此工作簿中的每个WS。工作表
如果WS.Name为“Main”,那么
ProcessData ws
如果结束
下一个WS
端接头
子流程数据(byref w作为工作表)
与w
'在此处处理工作表。
'任何工作表对象成员(如范围、单元格、名称等)都需要
'的前缀应为要与父级关联的句点(.)
'在中定义的工作表,带有。。。以结束并传递到
'过程作为参数(例如范围、单元格、名称等)
.Range(“f1:f3”)=应用程序转置(数组(1,2,3))
debug.print.name
以
端接头

对于此工作簿的i=2。工作表。计数
是否假设第一个工作表名为“Main”?我将第一个工作表名为“Main”Pat和omegastripes-我将在哪里添加代码?如果WS.Name为“Main”,我会删除此工作簿中每个WS.Worksheets的吗?您好,谢谢您的回复。我想知道ProcessData之后的ws是做什么的,byref w as工作表是做什么的?很抱歉加入@Jeeped,但我想鼓励@nathan走这条路来寻求他的解决方案。
WS
在顶部声明为
工作表
。因此,您正在“传递”由
为此工作簿中的每个WS选择的每个工作表。工作表
到过程
处理数据
一次一个。同样地,
ProcessData
过程中的参数
w
接收工作表,
ByRef
意味着传递给
w
的内容可以更改(而
ByVal
意味着它不能更改)。默认值为
ByRef
,但是显式指定
ByRef
并没有坏处,特别是如果您要更改它。嗨,Glenn,谢谢您提供的信息。我对上面的代码进行了编辑,只是加入了一个简单的函数,尝试向数据1、数据2和数据3添加第六列,但它似乎没有任何作用。你知道这是为什么吗?哦,事实上,我刚刚看到它只影响了第一页,按钮仍然是@GlennFromIowa。您知道如何解决此问题吗?您需要在工作表对象成员(如范围或单元格)前面加上句点(例如,
)。这会将每个.range或.cells对象与在
中定义的父工作表关联,并使用w。。。以
语句结束。感谢您的回复。我是否也需要将代码添加到ProcessData函数中?是的,这样您就可以对该工作表执行所需操作,调用ProcessData(WS),这就是为什么其他人将byref W添加为工作表的原因
Sub FunctionCaller()
    Dim WS As Worksheet
    For Each WS In ThisWorkbook.Worksheets
        If WS.Name <> "Main" Then
            ProcessData ws
        End If
    Next WS
End Sub

sub ProcessData(byref w as worksheet)
    with w
        'process the worksheet here.
        'any worksheet object members (e.g. Range, Cells, Name, etc) need to
        'be prefixed with a period (.) to be associated with the parent
        'worksheet defined in the With ... End With and passed into the
        'procedure as the parameter (e.g. .Range, .Cells, .Name, etc) 
        .Range("f1:f3") = Application.Transpose(Array(1, 2, 3))
        debug.print .name
    end with
end sub