使用动态参考将Excel公式转换为VBA代码

时间:2017-11-12 09:32:43

标签: excel vba excel-vba

我在名为MyCol的代码变量中获取了在userform中选择的每月的列数。例如,十月在列U中,十一月在列V.我有一个我记录的公式,选择的月份是它的一部分,但它是一个问题,因为RC格式具有特定的引用,我的变量是一个整数。

我希望公式是动态的。

这是公式(列U表示选择的月份):

  

= IFNA(IF(VLOOKUP(AA2,工作表Sheet F:!女,1,0)= AA2,U2,0),0)

这是代码的相关部分:

Dim MonthName As String
Dim myCol As Integer

MonthName = ListMonth.Value

With MainWB.Worksheets("sheet2")
    .Activate
    .Range("L1:W1").Find(MonthName, , xlValues, xlWhole).Activate
End With
ActiveCell.Select
myCol = Selection.Column
Range("AB2").Select
ActiveCell.FormulaR1C1 = _
    "=IFNA(IF(VLOOKUP(RC[-1],sheet1!C[-22],1,0)=RC[-1],RC[" & myCol & "],0),0)"
Range("AB2").AutoFill Destination:=Range("AB2:AB" & MLR), Type:=xlFillDefault

1 个答案:

答案 0 :(得分:3)

替换你的:

Range("AB2").Select
ActiveCell.FormulaR1C1 = _
    "=IFNA(IF(VLOOKUP(RC[-1],sheet1!C[-22],1,0)=RC[-1],RC[" & myCol & "],0),0)"

使用:

Range("AB2").FormulaR1C1 = _
            "=IFNA(IF(VLOOKUP(RC[-1],sheet1!C[-22],1,0)=RC[-1],RC[-" & Range("AB2").Column - myCol & "],0),0)"

但是,如果您希望让代码更快地运行,并且还要避免所有不必要的ActivateActiveCellSelect,请尝试以下代码:

Dim FindRng As Range

MonthName = ListMonth.Value

With MainWB.Worksheets("sheet2")
    Set FindRng = .Range("L1:W1").Find(MonthName, , xlValues, xlWhole)
End With

If Not FindRng Is Nothing Then
    myCol = FindRng.Column
Else ' find was not successful finding the month name
    MsgBox "Unable to find " & MonthName, vbCritical
    Exit Sub
End If

Range("AB2").FormulaR1C1 = _
            "=IFNA(IF(VLOOKUP(RC[-1],sheet1!C[-22],1,0)=RC[-1],RC[-" & Range("AB2").Column - myCol & "],0),0)"