2016-04-23 45 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