2016-04-23 92 views
1

下面的代码适用于表的第一行,但FX_Rate和FX_Date偏移函数保持导致错误,并且Table_Date和Table_Rate偏移函数完全不工作(全部在每个ElseIf为每种货币)。有人可以告诉我我做错了什么吗?我有这样的感觉,我只是在代码的错误区域有一些偏移功能,但我可能会离开。偏移函数创建错误(VBA)

该代码旨在获取表格中的数据,将日期与FX信息进行匹配并返回当天的汇率,然后移动到表格中的下一个条目,直至到达空白单元格。

我很抱歉,如果这是一个愚蠢的问题或之前已被问过 - 我找不到答案。

Sub Convert() 

Dim Table_Date As Range 
Set Table_Date = Range("B12") 

Dim FX_Date As Range 
Set FX_Date = Range("L11") 

Dim Table_Rate As Range 
Set Table_Rate = Range("E12") 

Dim FX_Rate As Range 
Set FX_Rate = Range("M11") 

Dim Table_Currency As Range 
Set Table_Currency = Range("D12") 

Dim x As Integer 
Dim y As Integer 
x = 2 
y = 2 

Do While x > 1 
    If Table_Date = "" Then 
     x = -1 
    Else 
     If Table_Currency = "USD" Then 
      Do While y > 1 
       If Table_Date = FX_Date Then 
        Table_Rate = FX_Rate 
        y = -1 
        x = -1 
       Else 
        Set FX_Date = FX_Date.Offset(1, 0) 
        Set FX_Rate = FX_Rate.Offset(1, 0) 
       End If 
      Loop 
      Set Table_Date = Table_Date.Offset(1, 0) 
      Set Table_Rate = Table_Rate.Offset(1, 0) 
     ElseIf Table_Currency = "EUR" Then 
      Set FX_Rate = FX_Rate.Offset(0, 2) 
      Do While y > 1 
       If Table_Date = FX_Date Then 
        Table_Rate = FX_Rate 
        y = -1 
        x = -1 
       Else 
        Set FX_Date = FX_Date.Offset(1, 0) 
        Set FX_Rate = FX_Rate.Offset(1, 0) 
       End If 
      Loop 
      Set Table_Date = Table_Date.Offset(1, 0) 
      Set Table_Rate = Table_Rate.Offset(1, 0) 
     ElseIf Table_Currency = "JPY" Then 
      Set FX_Rate = FX_Rate.Offset(0, 1) 
      Do While y > 1 
       If Table_Date = FX_Date Then 
        Table_Rate = FX_Rate 
        y = -1 
        x = -1 
       Else 
        Set FX_Date = FX_Date.Offset(1, 0) 
        Set FX_Rate = FX_Rate.Offset(1, 0) 
       End If 
      Loop 
      Set Table_Date = Table_Date.Offset(1, 0) 
      Set Table_Rate = Table_Rate.Offset(1, 0) 
     ElseIf Table_Currency = "SGD" Then 
      Set FX_Rate = FX_Rate.Offset(0, 4) 
      Do While y > 1 
       If Table_Date = FX_Date Then 
        Table_Rate = FX_Rate 
        y = -1 
        x = -1 
       Else 
        Set FX_Date = FX_Date.Offset(1, 0) 
        Set FX_Rate = FX_Rate.Offset(1, 0) 
       End If 
      Loop 
      Set Table_Date = Table_Date.Offset(1, 0) 
      Set Table_Rate = Table_Rate.Offset(1, 0) 
     ElseIf Table_Currency = "HKD" Then 
      Set FX_Rate = FX_Rate.Offset(0, 6) 
      Do While y > 1 
       If Table_Date = FX_Date Then 
        Table_Rate = FX_Rate 
        y = -1 
        x = -1 
       Else 
        Set FX_Date = FX_Date.Offset(1, 0) 
        Set FX_Rate = FX_Rate.Offset(1, 0) 
       End If 
     Loop 
     Set Table_Date = Table_Date.Offset(1, 0) 
     Set Table_Rate = Table_Rate.Offset(1, 0) 
    ElseIf Table_Currency = "NZD" Then 
     Set FX_Rate = FX_Rate.Offset(0, 5) 
     Do While y > 1 
      If Table_Date = FX_Date Then 
       Table_Rate = FX_Rate 
       y = -1 
       x = -1 
      Else 
       Set FX_Date = FX_Date.Offset(1, 0) 
       Set FX_Rate = FX_Rate.Offset(1, 0) 
      End If 
     Loop 
     Set Table_Date = Table_Date.Offset(1, 0) 
     Set Table_Rate = Table_Rate.Offset(1, 0) 
    Else 
     Table_Rate = "Not a valid currency" 
     y = -1 
     x = -1 
    End If 
End If 
Loop 

End Sub 
+1

ITI不明白你想要做什么。一两张图片可能会有所帮助。根据你的一般描述,我觉得有一个更简单的解决方案。 –

+0

@DougGlancy https://imgur.com/xJlcimb宏是为了从左侧获取数据,并使用右侧的历史汇率来转换金额(此刻,我只是试图获得利率,没有完成实际的数学转换)。 – 1937827

+1

“VLOOKUP”如何? –

回答

1

假设您经历了一个循环,其中第一个循环是HKD,那么FX_Rate已经偏移了6列。如果不重置基点,则不能将其用作后续偏移的基点。另外,Select Case statement会比所有重复的代码更好。

这是对很多重复代码所在的原始部分的简短重写。

Select Case LCase(Table_Currency) 
     Case "usd" 
      Set FX_Rate = Cells(FX_Rate.Row, "M") 'no offset from base point 
     Case "eur" 
      Set FX_Rate = Cells(FX_Rate.Row, "O") 'offset(0, 2) 
     Case "jpy" 
      Set FX_Rate = Cells(FX_Rate.Row, "N") 'offset(0, 1) 
     Case "sgd" 
      Set FX_Rate = Cells(FX_Rate.Row, "Q") 'offset(0, 4) 
     Case "hkd" 
      Set FX_Rate = Cells(FX_Rate.Row, "S") 'offset(0, 6) 
     Case "nzd" 
      Set FX_Rate = Cells(FX_Rate.Row, "R") 'offset(0, 5) 
     Case Else 
      Set FX_Rate = Nothing 
    End Select 

    If Not FX_Rate Is Nothing Then 
     Do While y > 1 
      If Table_Date = FX_Date Then 
       Table_Rate = FX_Rate 
       y = -1 
       x = -1 
      Else 
       Set FX_Date = FX_Date.Offset(1, 0) 
       Set FX_Rate = FX_Rate.Offset(1, 0) 
      End If 
     Loop 
     Set Table_Date = Table_Date.Offset(1, 0) 
     Set Table_Rate = Table_Rate.Offset(1, 0) 
    Else 
     Table_Rate = "Not a valid currency" 
     y = -1 
     x = -1 
    End If 

以你的样本数据,你试图完成什么的图像更广泛的样子,似乎你的整个过程可以写成这样的事情。

Sub currencyConversionRates() 
    Dim rw As Long, x As Variant, y As Variant 

    With Worksheets("Sheet3") 
     For rw = 12 To .Cells(Rows.Count, "B").End(xlUp).Row 
      x = Application.Match(.Cells(rw, "D").Value2, .Rows(5), 0) 
      y = Application.Match(.Cells(rw, "B").Value2, .Columns(12), 0) 
      If Not (IsError(x) Or IsError(y)) Then 
       .Cells(rw, "E") = .Cells(y, x).Value2 
      Else 
       .Cells(rw, "E") = "Not a valid currency" 
      End If 
     Next rw 
    End With 
End Sub 

但对于所有意图和目的,这也可以通过将下列公式E12减少,

=IF(AND(LEN(D12), B12>=$L$11), VLOOKUP(B12,L:R, MATCH(D12, L$5:R$5, 0), FALSE), "Not a valid currency") 

...和充绒。

currency_lookup

+0

谢谢。我试着换了一下,但没有奏效。你能否确认这个代替了(包括)如果Table_Currency =“USD”然后'和'Loop End Sub'之间的所有内容?我是否需要更改代码的其他方面以使其工作? – 1937827

+1

是的,您可能需要更改代码的其他部分。以上内容应该有助于理解。恐怕我对原始数据布局不够了解,无法进一步推测。上面指出了最明显的不一致(至少对我来说),以便在后续循环中获得正确的偏移量。 – Jeeped

+0

所以,只是为了确认(对于愚蠢的问题抱歉),您编写的代码检查包含货币的单元格,然后遍历日期以找出当天的正确汇率?它也会移动到下一个单元吗?我需要修改最初定义的变量来匹配你写的内容。 – 1937827