VBA:如何从查找值的变量返回单元格引用?

时间:2014-02-14 19:28:32

标签: excel vba match

首先,我对VBA的经验很少。这是我的问题:

我需要每日更新一定的费率才能进行投资计算。现在,我有一个按钮,一旦点击就会自动从网站上获取当天的费率,我必须手动将费率复制并粘贴到各自的日期。我只想点击按钮,我会想要这样做,费率将自动粘贴到其日期旁边。工作表如下所示:

                                                Update Button
                                           Day's date        Day's rate
                                           03/01/2013            6%

  Date           Rate        
02/01/2013        5%
03/01/2013        6%
04/01/2013

最明显的方法是使用vlookup查找当天的日期,并将其粘贴到B列的正确位置,但问题是每次更新值时,前一天公式会导致错误。因此,最好的解决方案是使用与A列中日期相匹配的简单宏,并仅粘贴其旁边的费率值。 使用普通工作表函数执行此操作的一个好策略是=CELL("address";INDEX(B:B;MATCH($G$5;A:A;0);)),这将导致在B列中引用正确日期的单元格。问题是VBA中没有= CELL函数。 / p>

我尝试了以下脚本,但没有成功:

Sub Teste2()

Dim IndexFormula As Range

MatchFormula = WorksheetFunction.Match(Range("Today"), Range("A:A"), 0)
IndexFormula = WorksheetFunction.Index(Range("B:B"), MatchFormula, 0)

Value = IndexFormula.Address

Range("G5").Select
Selection.Copy
Value.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

End Sub

我应该使用什么代码?

提前致谢

2 个答案:

答案 0 :(得分:1)

另一个选择是使用Find功能:

Sub Teste2()
    Dim res As Range        
    Set res = Range("A:A").Find(What:=Range("Today"), Lookat:=xlWhole, MatchCase:=False)        
    If Not res Is Nothing Then
        ' res.Offset(, 1) will give you column B (1 to the right from A)
        res.Offset(, 1).Value = Range("G5").Value
    End If
End Sub

有些说明:

  • 不要使用具有特定名称Value的变量。有一次你会对意外结果感到困惑
  • 改为使用Copy/PasteSpecial xlPasteValues,您可以只使用Range("A1").Value = Range("B1").Value
  • 代码中
  • avoid using Select/Active statements

答案 1 :(得分:1)

你非常接近你的尝试只需做一些小改动,如下所示它会起作用,不需要使用一个因为它会慢一点:

Dim MatchFormula As Long
Dim IndexFormula As Range

MatchFormula = WorksheetFunction.Match(Range("Today"), Range("A:A"), 0)
Set IndexFormula = WorksheetFunction.Index(Range("B:B"), MatchFormula, 0)

IndexFormula.Value = Range("G5").Value

更多如果您希望它更快,您可以使用:

Dim MatchFormula As Long

MatchFormula = WorksheetFunction.Match(Range("Today"), Range("A:A"), 0)
Range("B" & MatchFormula).Value = Range("G5").Value

这是有效的,因为列上的匹配返回带有您的值的行,您只需引用列B中的该行就可以无需使用索引。