2015-06-18 94 views
0

我已經使用此代碼通過VBA應用VLOOKUP。如何在VLOOKUP中用絕對地址替換相對地址?

Sub lookup() 
Sheets("Sheet16").Select 
Cells(1, 10).Select 
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2], Sheet17!RC[-8]:R[20]C[-7], 2, FALSE)" 
Selection.AutoFill Destination:=Range(Cells(1, 10), Cells(10, 10)), Type:=xlFillDefault 
End Sub 

但我想我對細胞的動態範圍的輸出,所以,我怎麼可以使用Range()功能絕對地址替換ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2], Sheet17!RC[-8]:R[20]C[-7], 2, FALSE)"

+1

檢查[這個答案](http://stackoverflow.com/a/21977655/2143262)關於如何爲我們'R1C1語法'的相對和絕對引用。 –

+0

也許你可以放在桌子上來解決查找的動態範圍。該表是通過'Insert'創建>'table' –

+0

傳遞的公式僅僅是一個字符串參數,所以範圍地址附加到它:'.Formula =「= SUM(」&範圍(將細胞(1,3),將細胞(1,7))。地址& 「)」' –

回答

2

=VLOOKUP(...)公式的生成放置在函數接受範圍中作爲參數,並返回公式字符串,例如,

Function GenLookupFormula(Arg As Range, LTab As Range, ColPar As Integer, _ 
          Optional AdrAbsolute As Boolean = True) As String 

    GenLookupFormula = "=VLOOKUP(" & Arg.Address(AdrAbsolute, AdrAbsolute) & "," & _ 
            LTab.Address(AdrAbsolute, AdrAbsolute) & "," & _ 
            ColPar & ",FALSE)" 
End Function 

從你的主程序調用這個函數,不管是(未)選擇/活動範圍的組合。

Sub TestGenLookup() 

    ' Sheet1 active, cell A1 selected/active, relative addressing 
    Selection.Formula = GenLookupFormula([A1], [A3:B5], 1, False) 

    ' cell B1 in active sheet, absolute addressing - omit parameter 
    ' result still in active sheet, VLOOKUP arguments in other sheets 
    [B1].Formula = GenLookupFormula(Sheets(2).[A1], Sheets(3).[B3:C12], 2) 

    ' any cell in any other (not active) sheet - absolute addressing using parameter 
    ' mix & mingle ... all is possible 
    Sheets(3).Range("D1").Formula = GenLookupFormula(Sheets(2).[A1], Sheets(1).[B3:C12], 2, True) 

End Sub 

您可以通過發電機是否返回「A1」或「$ A $ 1」的最後一個參數選擇......你可以建立這一點,接受2布爾爲行$和col $ seperately,等等等等。

通過使用範圍,您不需要Select/Activate任何東西。

+0

我稱爲'GenLookupFormula'使用下面的語句,但得到'1004'誤差'工作表( 「Sheet16」)。範圍( 「L1」)。式= GenLookupFormula(工作表(」 Sheet16 「)。範圍(」 L1 「),工作表(」 Sheet17" )。範圍(將細胞(1,2),將細胞(21,3))。值,2,假)' –

+0

從刪除'.Value'第二個參數,你必須爲該函數提供一個'Range'對象。 – MikeD