2016-04-23 10 views
1

Der folgende Code funktioniert für die erste Zeile der Tabelle, aber die Offset-Funktionen FX_Rate und FX_Date führen weiterhin zu Fehlern und die Offset-Funktionen Table_Date und Table_Rate funktionieren überhaupt nicht (alle jeweils) ElseIf für jede Währung). Kann mir bitte jemand sagen, was ich falsch mache? Ich habe das Gefühl, ich habe nur einige Offset-Funktionen in den falschen Bereichen des Codes, aber ich könnte weit weg sein.Fehler bei Offset-Funktionserstellung (VBA)

Der Code soll die Daten in der Tabelle übernehmen, ein Datum mit den FX-Informationen abgleichen und den Wechselkurs an diesem Tag zurückgeben, dann zum nächsten Eintrag in der Tabelle gehen, bis er eine leere Zelle erreicht.

Ich entschuldige mich, wenn das eine dumme Frage ist oder schon einmal gefragt wurde - ich konnte keine Antwort finden.

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 nicht verstehen, was Sie zu tun versuchen. Ein oder zwei Bilder könnten helfen. Aufgrund Ihrer allgemeinen Beschreibung habe ich das Gefühl, dass es eine viel einfachere Lösung gibt. –

+0

@DougGlancy https://imgur.com/xJlcimb Das Makro soll Daten von links aufnehmen und die historischen Wechselkurse auf der rechten Seite verwenden, um den Betrag zu verdecken (im Moment versuche ich nur, die Rate zu erhalten, nicht die tatsächliche mathematische Umwandlung abschließen). – 1937827

+1

Wie wäre es mit einem "SVERWEIS"? –

Antwort

1

Unter der Annahme, dass Sie durch eine Schleife, wo die erste Schleife HKD ist dann FX_Rate bereits 6 Spalten versetzt ist. Sie können das nicht als Basispunkt für einen nachfolgenden Offset verwenden, ohne den Basispunkt zurückzusetzen. Auch wäre ein Select Case statement besser als alle Ihre repetitive Code.

Dies ist eine kurze Umschreibung des Abschnitts Ihres Originals, in dem sich viel repetitiver Code befindet.

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 

einen breiteren Blick auf Ihrem Bild von Beispieldaten nehmen und was Sie versuchen, zu erreichen, scheint es, dass Ihr gesamte Prozess als so etwas wie dies geschrieben werden kann.

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 

Aber für alle Absichten und Zwecke, die auch, indem sie die folgende Formel in E12,

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

... und Füllung nach unten.

currency_lookup

+0

Danke. Ich habe versucht, dies zu tauschen, aber es hat nicht funktioniert. Können Sie bitte bestätigen, dass dies alles zwischen (einschließlich) "If Table_Currency =" USD "Then" und "Loop End Sub" ersetzt? Muss ich andere Aspekte des Codes ändern, damit er funktioniert? – 1937827

+1

Ja, wahrscheinlich werden Sie andere Teile Ihres Codes ändern müssen. Das obige sollte jedoch die Lesbarkeit verbessern. Ich fürchte, ich weiß nicht genug über Ihr ursprüngliches Datenlayout, um weiter zu spekulieren. Das oben Gesagte zeigte die gröbste Inkonsistenz (zumindest für meine Augen) mit einer Lösung, um die Offsets in nachfolgenden Schleifen korrekt zu machen. – Jeeped

+0

Also, nur um zu bestätigen (Entschuldigung für die dummen Fragen), überprüft der Code, den Sie geschrieben haben, die Zelle mit der Währung und läuft dann durch die Daten, um den richtigen Kurs an diesem Tag zu finden? Wird es sich dann auch in die nächste Zelle bewegen? Ich müsste die Variablen ändern, die ich ursprünglich definiert habe, um zu entsprechen, was Sie geschrieben haben? – 1937827