如何将单元格vlookup转换为VBA

时间:2013-02-19 00:48:18

标签: excel vba excel-vba lookup-tables vlookup

目前,我的单元格中有一个公式:

=IFERROR(VLOOKUP(A:A,'Daily Report'!A:Z,2,FALSE),"")

=IFERROR(VLOOKUP(A:A,'Daily Report'!A:Y,7,FALSE)&", "&VLOOKUP(A:A,'Daily Report'!A:Y,8,FALSE)&", #"&VLOOKUP(A:A,'Daily Report'!A:Y,9,FALSE)&"-"&VLOOKUP(A:A,'Daily Report'!A:Y,10,FALSE)&", Singapore "&VLOOKUP(A:A,'Daily Report'!A:Y,11,FALSE),"")

如何将其转换为VBA,以便使用此公式加密整个列?

我的公式总是被使用我的Excel工作表的人所取代。

我正在避免锁定单元格,因此查看VBA来执行此操作。

编辑:

MACRO

Sub vlookup()
Dim LR As Long
LR = Cells(Rows.Count, "A").End(xlUp).Row
    Range("D2").Select
    ActiveCell.FormulaR1C1 = _
        "=IFERROR(VLOOKUP(C[-3],'Daily Report'!C[-3]:C[22],2,FALSE),"""")"
    Selection.AutoFill Destination:=Range("D2:D" & LR), Type:=xlFillDefault
End Sub

现在如何制作数据,例如09-02-18022013-03383-A当进入A栏时,它将运行宏来输入正确的数据。

1 个答案:

答案 0 :(得分:2)

如果必须使用VBA,最简单的方法是在受影响的单元格中重写公式:

首先,将其放在Worksheet的模块中。每当对A列进行更改时,这将导致宏触发。

Private Sub Worksheet_Change(ByVal Target as Range)
If Not Intersect(Target,Me.Range("A:A")) Is Nothing Then
Application.EnableEvents = False   'to disable infinite loop
    InsertFormula
Application.EnableEvents = True
End If
End Sub

然后,将其放在普通的代码模块中:

Sub InsertFormula()
Dim rng as Range   'this will set the range in which you want this formula to appear
Dim cl as Range    'cell iterator within rng variable
Dim strFormula1 as String  `string to hold the formula text

set rng = Range("B2:B39")   'Change this range to the desired range
strFormula = "=IfError(Vlookup(A:A,'Daily Report'!A:Z,2,False),"")"

For Each cl in rng
    cl.Formula = strFormula
Next

End Sub

因此,以编程方式插入普通公式非常容易。

那么问题就变成你经常强迫/覆盖这些细胞的频率?您可以将此宏绑定到“事件”,例如,每当打开工作簿文件时,或者当工作表上的值发生更改时,或者有人手动更改您不希望它们更改的单元格时等等​​。

你的第二个公式可以用它做同样的事情,只需添加另一个Range变量(例如Dim rng2 as Range)和另一个字符串变量来保存公式文本(例如strFormula2)。

或者,你可以纯粹在vba中“重写公式”。将cl.Formula = strFormula替换为cl.Value = MyLookupFormula,并将此函数添加到包含上述子例程的代码模块中:

Function MyLookupFormula() as Variant
'Performs equivlanet to worksheet function
If Not IsError(Application.WorksheetFunction.Vlookup(Range("A:A"),Sheets("Daily Report").Range("A:Z"),2,False)) Then

myLookupFormula = (Application.WorksheetFunction.Vlookup(Range("A:A"),Sheets("Daily Report").Range("A:Z"),2,False))

Else: myLookupFormula = vbNullString
End Function

但是这需要更多地了解触发此宏的频率/事件的频率,因为单元格将不具有任何公式(仅当用户请求或事件触发器时,公式/计算才在内存中执行)。