Excel 循环在数组中声明变量?

Excel 循环在数组中声明变量?,excel,vba,Excel,Vba,第一部分这里没问题 Sub Get_Data_BYN() ' // Set Data Workplaces ' / Set Data WorkBooks Dim SourceBook As Workbook Set SourceBook = GetWork

第一部分这里没问题

    Sub Get_Data_BYN()
    
    
            ' // Set Data Workplaces
                
                
                ' /  Set Data WorkBooks
            
                Dim SourceBook As Workbook
                Set SourceBook = GetWorkbook(Source)
                
                Dim TargetBook As Workbook
                Set TargetBook = ThisWorkbook
                
                
                ' /  Set Data WorkSheets
            
                Dim SourceSheet As Worksheet
                Set SourceSheet = SourceBook.Worksheets("Data")
                
                Dim TargetSheet As Worksheet
                Set TargetSheet = TargetBook.Worksheets("Sheet2")
                
                
                ' /  Set Data Ranges
                
                Dim SourceLastRow As Long
                SourceLastRow = SourceSheet.Cells(Rows.Count, 1).End(xlUp).Row
                
                Dim TargetLastRow As Long
                TargetLastRow = TargetSheet.Cells(Rows.Count, 1).End(xlUp).Row
                

    
                Dim Primary_Key As Variant '[SourceSheet Array Store]: LAVA ID
                Primary_Key = WorksheetFunction.Transpose(SourceSheet.Range("A2:A" & SourceLastRow).Value)
                
                Dim Foreign_Key As Variant '[TargetSheet Range Store]: LAVA ID
                Foreign_Key = TargetSheet.Range("G2:G" & TargetLastRow).Value
    
    
第二部分-代码的其余部分我需要循环遍历变量(对于I=1到x),而不是(每次都将“变量”变为变量),我需要完整的语法,因为我不熟悉这个主题。。。你可以看到下面

这意味着我想循环遍历变量本身,这样就不用多次编写同一个过程,而是循环遍历同一个过程

                ' /  Set Data Fields
    
                    Dim Primary_Field_1 As Variant '[SourceSheet Array Store]: Bayan ID
                    Primary_Field_1 = WorksheetFunction.Transpose(SourceSheet.Range("B2:B" & SourceLastRow).Value)
                    
                    Dim Primary_Field_2 As Variant '[SourceSheet Array Store]: Bayan ID
                    Primary_Field_2 = WorksheetFunction.Transpose(SourceSheet.Range("C2:C" & SourceLastRow).Value)
                    
                    Dim Primary_Field_3 As Variant '[SourceSheet Array Store]: Bayan ID
                    Primary_Field_3 = WorksheetFunction.Transpose(SourceSheet.Range("D2:D" & SourceLastRow).Value)
                    
                    Dim Primary_Field_4 As Variant '[SourceSheet Array Store]: Bayan ID
                    Primary_Field_4 = WorksheetFunction.Transpose(SourceSheet.Range("E2:E" & SourceLastRow).Value)
                    
          
                    Dim Foreign_Field_1 As Variant
                  ReDim Foreign_Field_1(LBound(Foreign_Key, 1) To UBound(Foreign_Key, 1), _
                                        LBound(Foreign_Key, 2) To UBound(Foreign_Key, 2))
                 
                    Dim Foreign_Field_2 As Variant
                  ReDim Foreign_Field_2(LBound(Foreign_Key, 1) To UBound(Foreign_Key, 1), _
                                        LBound(Foreign_Key, 2) To UBound(Foreign_Key, 2))
                                        
                    Dim Foreign_Field_3 As Variant
                  ReDim Foreign_Field_3(LBound(Foreign_Key, 1) To UBound(Foreign_Key, 1), _
                                        LBound(Foreign_Key, 2) To UBound(Foreign_Key, 2))

                    Dim Foreign_Field_4 As Variant
                  ReDim Foreign_Field_4(LBound(Foreign_Key, 1) To UBound(Foreign_Key, 1), _
                                        LBound(Foreign_Key, 2) To UBound(Foreign_Key, 2))
                                        
                                        
                                        
                    ' / Write (Keys-IndexMatch) in Array offset Foreign_Field_1
                    
                    Dim i As Long
                    
                    For i = LBound(Foreign_Key, 1) To UBound(Foreign_Key, 1)
                    
                    
                    Foreign_Field_1(i, 1) = Primary_Field_1( _
                    WorksheetFunction.Match(Foreign_Key(i, 1), Primary_Key, 0))
                    
                    Foreign_Field_2(i, 1) = Primary_Field_2( _
                    WorksheetFunction.Match(Foreign_Key(i, 1), Primary_Key, 0))

                    Foreign_Field_3(i, 1) = Primary_Field_3( _
                    WorksheetFunction.Match(Foreign_Key(i, 1), Primary_Key, 0))
                    
                    Foreign_Field_4(i, 1) = Primary_Field_4( _
                    WorksheetFunction.Match(Foreign_Key(i, 1), Primary_Key, 0))
                    
                    Next i
    
    
                ' / Write (Keys-IndexMatch) in Range offset Foreign_Field_1 2
                    
                    ThisWorkbook.Worksheets("Sheet2").Range("H2:H" & TargetLastRow).Value = Foreign_Field_1
                    
                    ThisWorkbook.Worksheets("Sheet2").Range("i2:i" & TargetLastRow).Value = Foreign_Field_2
    
                    ThisWorkbook.Worksheets("Sheet2").Range("J2:J" & TargetLastRow).Value = Foreign_Field_3
    
                    ThisWorkbook.Worksheets("Sheet2").Range("K2:K" & TargetLastRow).Value = Foreign_Field_3
    
    End Sub

未经测试,但请尝试以下方法:

Sub Get_Data_BYN()
Const NUM_DATA_COLS作为Long=4
将源工作表设置为工作表,将目标工作表设置为工作表
Dim rngPrimary_键作为范围“[SourceSheet数组存储]:LAVA ID
变暗外键作为变量“[TargetSheet Range Store]:LAVA ID
调暗SourceLastRow的长度,TargetLastRow的长度
调暗主字段(1到NUM数据列),外部字段(1到NUM数据列),n等长
暗i与长v,m相同
Set SourceSheet=get工作簿(源)。工作表(“数据”)
Set TargetSheet=此工作簿。工作表(“Sheet2”)
SourceLastRow=SourceSheet.Cells(Rows.Count,1).End(xlUp).Row
TargetLastRow=TargetSheet.Cells(Rows.Count,1).End(xlUp).Row
“对工作表上的范围进行匹配要比对数组进行匹配快得多
设置rngPrimary\u Key=SourceSheet.Range(“A2:A”和SourceLastRow)
外键=TargetSheet.Range(“G2:G”和targetAstrow).Value
对于n=1到NUM\u DATA\u COLS
主字段(n)=SourceSheet.Range(“B2:B”和SourceLastRow).Offset(0,n-1).值
外部_字段(n)=清空复制(外部_键)'结果的空数组
下一个
'获取匹配行并将值复制到数组
对于i=LBound(外键,1)到UBound(外键,1)
v=外键(i,1)
m=应用程序.Match(v,rngPrimary_键,0)
如果不是IsError(m),则“检查是否匹配”
对于n=1到NUM\u DATA\u COLS
外部_字段(n)(i,1)=主_字段(n)(m,1)
下一个
如果结束
接下来我
'/Write(Keys IndexMatch)在范围偏移量外部字段中\u 1 2
Place2DArray TargetSheet.Range(“H2”),外部字段(1)
Place2DArray TargetSheet.Range(“i2”),外部字段(2)
Place2DArray TargetSheet.Range(“J2”),外部字段(3)
Place2DArray TargetSheet.Range(“K2”),外部字段(4)
端接头
'返回与'arr'维度相同的空数组'
函数空拷贝(arr)
昏暗的房车
重拨rv(LBound(arr,1)至UBound(arr,1),LBound(arr,2)至UBound(arr,2))
清空副本=rv
端函数
'从单元格'c'开始,将基于1的二维数组'arr'复制到工作表'
子位置2阵列(c As范围,arr)
c、 调整大小(UBound(arr,1),UBound(arr,2))。值=arr
端接头

除非您有大量数据,否则这将比循环中的vlookup简单得多。阵列有时速度更快,但为了简单起见,还有很多话要说。

未经测试,但请尝试以下方法:

Sub Get_Data_BYN()
Const NUM_DATA_COLS作为Long=4
将源工作表设置为工作表,将目标工作表设置为工作表
Dim rngPrimary_键作为范围“[SourceSheet数组存储]:LAVA ID
变暗外键作为变量“[TargetSheet Range Store]:LAVA ID
调暗SourceLastRow的长度,TargetLastRow的长度
调暗主字段(1到NUM数据列),外部字段(1到NUM数据列),n等长
暗i与长v,m相同
Set SourceSheet=get工作簿(源)。工作表(“数据”)
Set TargetSheet=此工作簿。工作表(“Sheet2”)
SourceLastRow=SourceSheet.Cells(Rows.Count,1).End(xlUp).Row
TargetLastRow=TargetSheet.Cells(Rows.Count,1).End(xlUp).Row
“对工作表上的范围进行匹配要比对数组进行匹配快得多
设置rngPrimary\u Key=SourceSheet.Range(“A2:A”和SourceLastRow)
外键=TargetSheet.Range(“G2:G”和targetAstrow).Value
对于n=1到NUM\u DATA\u COLS
主字段(n)=SourceSheet.Range(“B2:B”和SourceLastRow).Offset(0,n-1).值
外部_字段(n)=清空复制(外部_键)'结果的空数组
下一个
'获取匹配行并将值复制到数组
对于i=LBound(外键,1)到UBound(外键,1)
v=外键(i,1)
m=应用程序.Match(v,rngPrimary_键,0)
如果不是IsError(m),则“检查是否匹配”
对于n=1到NUM\u DATA\u COLS
外部_字段(n)(i,1)=主_字段(n)(m,1)
下一个
如果结束
接下来我
'/Write(Keys IndexMatch)在范围偏移量外部字段中\u 1 2
Place2DArray TargetSheet.Range(“H2”),外部字段(1)
Place2DArray TargetSheet.Range(“i2”),外部字段(2)
Place2DArray TargetSheet.Range(“J2”),外部字段(3)
Place2DArray TargetSheet.Range(“K2”),外部字段(4)
端接头
'返回与'arr'维度相同的空数组'
函数空拷贝(arr)
昏暗的房车
重拨rv(LBound(arr,1)至UBound(arr,1),LBound(arr,2)至UBound(arr,2))
清空副本=rv
端函数
'从单元格'c'开始,将基于1的二维数组'arr'复制到工作表'
子位置2阵列(c As范围,arr)
c、 调整大小(UBound(arr,1),UBound(arr,2))。值=arr
端接头
除非您有大量数据,否则这将比循环中的vlookup简单得多。数组有时速度更快,但为了简单起见,还有很多要说的。

外部_字段(n)(i,1)=主要_字段(n)(m,1)错误-我刚刚将函数ReDim rv(LBound(arr,1)改为UBound(arr,1),LBound(arr,2)改为UBound(arr,2))而不是ReDim rv(LBound(arr,1)改为UBound(arr,2),LBound(arr,2))外部_字段(n) (i,1)=主要_字段(n)(m,1)错误-我刚刚将函数ReDim rv(LBound(arr,1)更改为UBound(arr,1),LBound(arr,2)更改为UBound(arr,2)),而不是ReDim rv(LBound(arr,1)更改为UBound(arr,2),LBound(arr,2)更改为UBound(arr,2))