Excel 在函数中使用for循环变量

Excel 在函数中使用for循环变量,excel,vba,Excel,Vba,问题:是否可以在函数中使用for循环变量 我有以下代码: For Each hcell In hRng '(something irrelevant happens) For Each tCell In tRng If tCell = "Name1" Then RowNum = tWb.Sheets("Sheet_" & hcell).Cells(Rows.

问题:是否可以在函数中使用for循环变量

我有以下代码:

For Each hcell In hRng
    '(something irrelevant happens)
    
    For Each tCell In tRng
        If tCell = "Name1" Then
            
            RowNum = tWb.Sheets("Sheet_" & hcell).Cells(Rows.Count, 2).End(xlUp).Row
            EmpCol = 1 + tWb.Sheets("Sheet_" & hcell).Cells(1, 1).End(xlToRight).Column
            
            tWb.Sheets("Sheet_" & hcell).Cells(1, EmpCol) = "Name1"

                For i = 2 To RowNum
                    tWb.Sheets("Sheet_" & hcell).Cells(i, EmpCol) = Application.IfNa(Application.VLookup(hcell & tWb.Sheets("Sheet_" & hcell).Cells(i, 2), _
                        sheetDiWs.Range("A2:I" & sheetDiWs.Cells(Rows.Count, 1).End(xlUp).Row), 3, False), "")
                Next i
        
        ElseIf tCell = "Name2" Then
            '(same process as above, but different name, different lookup column)
                
        ElseIf tCell = "Nam3" Then
            '(same process: different name, different lookup column)
        
        End If
    Next tCell
Next hCell
这是代码中不断重复的部分,我在考虑使用函数,而不是多次使用相同的代码:

RowNum = tWb.Sheets("Sheet_" & hcell).Cells(Rows.Count, 2).End(xlUp).Row
EmpCol = 1 + tWb.Sheets("Sheet_" & hcell).Cells(1, 1).End(xlToRight).Column

tWb.Sheets("Sheet_" & hcell).Cells(1, EmpCol) = "Name1"

    For i = 2 To RowNum
        tWb.Sheets("Sheet_" & hcell).Cells(i, EmpCol) = Application.IfNa(Application.VLookup(hcell & tWb.Sheets("Sheet_" & hcell).Cells(i, 2), _
            sheetDiWs.Range("A2:I" & sheetDiWs.Cells(Rows.Count, 1).End(xlUp).Row), 3, False), "")
    Next i
这里的问题是变量hcell值来自第一个FOR循环


有什么方法可以在我的(公共)函数中使用当前的hcell值吗?

实际上,您更愿意创建一个过程(sub)而不是函数,并将所需的变量作为参数提交

Option Explicit

Sub test()
    For Each hCell In hRng
        '(something irrelevant happens)
        
        For Each tCell In tRng
            If tCell = "Name1" Then
                
                DoRepeatingJob tCell, hCell.Value, tWb, sheetDiWs
            
            ElseIf tCell = "Name2" Then
                '(same process as above, but different name, different lookup column)
                    
            ElseIf tCell = "Nam3" Then
                '(same process: different name, different lookup column)
            
            End If
        Next tCell
    Next hCell
End Sub

Public Sub DoRepeatingJob(ByVal tCell As String, ByVal hCell As String, ByVal tWb As Workbook, sheetDiWs As Worksheet)
    Dim RowNum As Long
    RowNum = tWb.Sheets("Sheet_" & hCell).Cells(tWb.Rows.Count, 2).End(xlUp).Row
    
    Dim EmpCol As Long
    EmpCol = 1 + tWb.Sheets("Sheet_" & hCell).Cells(1, 1).End(xlToRight).Column
                
    tWb.Sheets("Sheet_" & hCell).Cells(1, EmpCol) = tCell
    
    Dim i As Long
    For i = 2 To RowNum
        tWb.Sheets("Sheet_" & hCell).Cells(i, EmpCol) = Application.IfNa(Application.VLookup(hCell & tWb.Sheets("Sheet_" & hCell).Cells(i, 2), _
        sheetDiWs.Range("A2:I" & sheetDiWs.Cells(Rows.Count, 1).End(xlUp).Row), 3, False), "")
    Next i
End Sub

但实际上,如果代码是您发布的代码,您不需要这些
ElesIfs
,只需要调整这一行
tWb.Sheets(“Sheet_”&hCell.Cells(1,EmpCol)=tCell
,因此它需要变量
tCell

Sub test()
    For Each hCell In hRng
        '(something irrelevant happens)
        
        For Each tCell In tRng
            If tCell = "Name1" Or tCell = "Name2" Or tCell = "Name3" Then
                Dim RowNum As Long
                RowNum = tWb.Sheets("Sheet_" & hCell).Cells(tWb.Rows.Count, 2).End(xlUp).Row
                
                Dim EmpCol As Long
                EmpCol = 1 + tWb.Sheets("Sheet_" & hCell).Cells(1, 1).End(xlToRight).Column
                            
                tWb.Sheets("Sheet_" & hCell).Cells(1, EmpCol) = tCell
                
                Dim i As Long
                For i = 2 To RowNum
                    tWb.Sheets("Sheet_" & hCell).Cells(i, EmpCol) = Application.IfNa(Application.VLookup(hCell & tWb.Sheets("Sheet_" & hCell).Cells(i, 2), _
                    sheetDiWs.Range("A2:I" & sheetDiWs.Cells(Rows.Count, 1).End(xlUp).Row), 3, False), "")
                Next i
            End If
        Next tCell
    Next hCell
End Sub

有点不清楚,但可以创建一个函数,将
hcell
变量传递给它,让它使用。。。这就是你要问的吗?实际上你要创建一个子函数而不是函数。