2017-02-07 305 views
0

我有一个帐户列表&代码,并希望使用索引匹配填充来自不同工作表的结果列。我可以使用公式:= index(rngB,match(BCode,rngM,0),55)VBA索引/匹配空白单元格

但无法将其转换为vba。我曾尝试过:

sub compare() 

Dim BudgetResult As Long 
Dim var1 As Long 
Dim rngB, rngM As Range 
Dim CompSH, ActSH, BudSH As Worksheet 
Dim BCode As Variant 

Set CompSH = Sheets.Add(After:=Sheets(Sheets.Count)) 
Set ActSH = Sheets(2) 
Set BudSH = Sheets(3) 
Set rngB = BudSH.Range("B11:BF50") 
Set rngM = BudSH.Range("B:B") 
Set BCode = CompSH.Range("A2") 

BudSH.Select 
Range("B10:E76").Select 
Selection.Copy 
CompSH.Select 
ActiveSheet.Paste 
Range("F1").Select 
ActiveCell.FormulaR1C1 = "Budget" 
Range("F2").Select 

With Application.WorksheetFunction 

var1 = .Match(BCode, rngM, 0) 
BudgetResult = .Index(rngB, var1, 55) 

End With 

我得到一个空白单元格。没有结果在表单中。 此外,我不知道如何继续下去。谁能帮忙?

+0

文中陈述范围大小你翻译Excel公式变成VBA设置?如果您已经决定使用VBA,为什么不使用它的额外功能? –

回答

0

,你是什么样后如下

Option Explicit 

Sub compare() 
    Dim rngB As Range, rngM As Range, cell As Range 
    Dim CompSH As Worksheet, ActSH As Worksheet, BudSH As Worksheet 
    Dim AW As WorksheetFunction: Set AW = Application.WorksheetFunction 

    Set CompSH = Sheets.Add(After:=Sheets(Sheets.count)) 
    Set ActSH = Sheets("ActSH") 'Sheets(2) 
    Set BudSH = Sheets("BudSH") 'Sheets(3) 

    With BudSH 
     Set rngB = .Range("B11:BF50") '<--| warning: your "index" range has 40 rows 
     Set rngM = .Range("B:B") 
     .Range("F1").Value = "Budget" 
     .Range("B10:E76").Copy CompSH.Range("A1") '<--| warning: your "copied" range has 67 rows 
    End With 

    With CompSH 
     For Each cell In .Range("A2", .Cells(.Rows.count, 1).End(xlUp)) 
      cell.Offset(, 5).Value = AW.Index(rngB, AW.Match(cell, rngM, 0), 55) '<--| this will error when trying to access from 'rngB' range 41th rows on 
     Next 
    End With 
End Sub 

,你只需要调整标<--| Warning...

+0

感谢您的回答 – akim

+0

akim,欢迎您 – user3598756