2016-04-23 12 views
1

以下のコードはテーブルの最初の行で機能しますが、FX_Rate関数とFX_Dateオフセット関数はエラーの原因となり、Table_Date関数とTable_Rateオフセット関数はまったく機能しませんそれ以外の場合は各通貨)。誰かが私が間違っていることを教えてもらえますか?私はちょうどコードの間違った領域にいくつかのオフセット機能を持っているような気がしますが、私は離れているかもしれません。オフセット関数作成エラー(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は、あなたが何をしようとして理解していません。 1つまたは2つの絵が助けになるかもしれない。あなたの一般的な記述に基づいて、私ははるかに簡単な解決策があると感じています。 –

+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

ありがとうございます。私はこれを交換しようとしましたが、うまくいきませんでした。あなたは 'If Table_Currency =" USD "Then'と 'Loop End Sub'の間の(そしてそれを含む)すべてを置き換えることを確認できますか?それを動作させるには、コードの他の部分を変更する必要がありますか? – 1937827

+1

はい、コードの他の部分を変更する必要があります。しかし、上記は読みやすくするはずです。私は、あなたの元のデータレイアウトについて十分に知りませんので、さらに推測しています。上記は、後続のループでオフセットを正しく得るための解決策をもって、最も目立たない不一致を(少なくとも私の目に)指摘した。 – Jeeped

+0

あなたが書いたコードは、通貨が入っているセルをチェックして、その日の正しいレートを見つけるために日付を実行します(愚かな質問を申し訳ありません)。それはまた、次のセルに移動しますか?あなたが書いたものと一致するように私が最初に定義した変数を変更する必要がありますか? – 1937827

関連する問題