2017-01-10 3 views
0

私は、範囲の各値を2つの列から対応する値に変更するコードを記述しようとしています。たとえば、私の範囲内の値が€29.99の場合。表と列1を見て、その値と等しい値を見つけたら、その範囲のセルを列2の隣の値24.99に変更します。IF文を使用すると、出力はすべて同じ番号を返し続けますか?

私が書いたコードは、マクロが影響するすべてのセルに対して常に同じ値を返します。これは、列2の最小値(9.99ポンド)です。したがって、たとえば€59.99、29.99などの値さえも£9.99に変更されています。なぜこれが起こっているのかわからないのですか?またはそれを解決する方法?

€RRPをカラム1であり、£RRPは、カラム2

enter image description here

これは

enter image description here

すべてのヘルプは大きくなるであろう 'デジタル€' であるものの一例です感謝。

Sub EurosToPounds() 

Dim rng As Range 

If Sheets("Pricing Matrix").Range("InPounds") = "TRUE" Then 
Exit Sub 

ElseIf Sheets("Pricing Matrix").Range("InPounds") = "False" Then 

For Each rng In Worksheets("Digital €").Range("Digital") 
    If rng = Range("Euro1") Then 
     rng.Value = Range("Euro1").Offset(0, 2).Value 
    ElseIf rng = Range("Euro2") Then 
     rng.Value = Range("Euro2").Offset(0, 2).Value 
    ElseIf rng = Range("Euro3") Then 
     rng.Value = Range("Euro3").Offset(0, 2).Value 
    ElseIf rng = Range("Euro3") Then 
     rng.Value = Range("Euro3").Offset(0, 2).Value 
    ElseIf rng = Range("Euro4") Then 
     rng.Value = Range("Euro4").Offset(0, 2).Value 
    ElseIf rng = Range("Euro5") Then 
     rng.Value = Range("Euro5").Offset(0, 2).Value 
    ElseIf rng = Range("Euro6") Then 
     rng.Value = Range("Euro6").Offset(0, 2).Value 
    ElseIf rng = Range("Euro7") Then 
     rng.Value = Range("Euro7").Offset(0, 2).Value 
    ElseIf rng = Range("Euro8") Then 
     rng.Value = Range("Euro8").Offset(0, 2).Value 
    ElseIf rng = Range("Euro9") Then 
     rng.Value = Range("Euro9").Offset(0, 2).Value 
    ElseIf rng = Range("Euro10") Then 
     rng.Value = Range("Euro10").Offset(0, 2).Value 
    ElseIf rng = Range("Euro11") Then 
     rng.Value = Range("Euro11").Offset(0, 2).Value 
    ElseIf rng = Range("Euro12") Then 
     rng.Value = Range("Euro12").Offset(0, 2).Value 
    End If 
Next 

Sheets("Digital €").Select 
Sheets("Digital €").Range("Digital").Select 
Selection.NumberFormat = _ 
    "_-[$£-809]* #,##0.00_-;-[$£-809]* #,##0.00_-;_-[$£-809]* ""-""??_-;[email protected]_-" 

Sheets("Pricing Matrix").Select 
Worksheets("Pricing Matrix").Range("InEuros") = "TRUE" 

Sheets("Pricing Matrix").Select 
Worksheets("Pricing Matrix").Range("InPounds") = "FALSE" 

End If 
End Sub 

このコードは数字がに変化させ、次のように私のコードがある... enter image description here

次のように提案する別の方法がある...しかし

Sub EurosToPounds() 

Dim rng As Range 

If Sheets("Pricing Matrix").Range("InPounds") = "TRUE" Then 
Exit Sub 

ElseIf Sheets("Pricing Matrix").Range("InPounds") = "False" Then 

For Each rng In Worksheets("Digital €").Range("Digital") 
Dim foundRange As Range 
Set foundRange = Range("EuroRange").Find(rng.Value) ' EuroRange should contain (
'              Euro1, Euro2,.. etc). 
If Not foundRange Is Nothing Then rng.Value = foundRange.Offset(0, 2).Value 
Next 

Sheets("Digital €").Select 
Sheets("Digital €").Range("Digital").Select 
Selection.NumberFormat = _ 
    "_-[$£-809]* #,##0.00_-;-[$£-809]* #,##0.00_-;_-[$£-809]* ""-""??_-;[email protected]_-" 

Sheets("Pricing Matrix").Select 
Worksheets("Pricing Matrix").Range("InEuros") = "TRUE" 

Sheets("Pricing Matrix").Select 
Worksheets("Pricing Matrix").Range("InPounds") = "FALSE" 

End If 
End Sub 

この中に結果は、 ...

enter image description here

私は、2番目の方法が "Digital€"のセルの一部に数式を含んでいるので、2番目の方法が機能しない可能性があると感じています。数式を含むセルを無視する方法はありますか、それはそれを解決するかもしれません。何度もお世話になりました!

+0

はあなたが変数の値を監視するためにF8キーを使用してコードをステップ実行しようとしたことがあり助けていますか? – SJR

+0

これは、名前付き範囲が何を参照しているかを知らなければ、答えにくいです。ワークシート "Digital€"の注釈付きスクリーンショットは、大いに役立ちます。 – Comintern

+0

ありがとう、申し訳ありませんが、イメージを追加するのがいかに簡単か分かりませんでした。効果的に私がマクロを実行しているときに起きていることは、「Digital€」の数字の大半が9.99になるということです。 –

答えて

0

rngが範囲として宣言されています。だからあなたはその価値を比較しなければなりません。

同様:

If rng = Range("Euro1") Then 

しかし、この方法であなたはRNGの値を比較します。

If rng.value = Range("Euro1").value Then ... 
+0

私は '.Value'を付け加えましたが、違いはありませんでした。私は印象に残っていた.Valueがデフォルトだったので、何も置いていないのは同じである(VBAについては比較的新しいかもしれない) –

+0

確かに、Rangeのデフォルトプロパティは値なので省略することができます。 – z32a7ul

0

私は、この行でOPが2つの変数が同じ範囲を参照するかどうかを判断したいと思いますとRange( "Euro1")、おそらく最初のセルのものだけです。したがって、rngがEuro2を参照するが、Euro1とEuro2の最初のセルに同じ値が含まれている場合、Euro2の代わりにEuro1の2番目のセルが使用されます。

ソリューション:あるか、そのアドレスを使用して範囲を比較:

まあ
If rng Is Range("Euro1") Then ' Version A 
If rng.Address = Range("Euro1").Address Then ' Version B - assuming that all cells in question are on the same sheet 
+0

その行では、 'Digital€'の最初のセルが€RRP列の最初のセルと同じであるかどうかを確認しようとしています。それが「Digital」の最初のセルの値を変更した場合£RRP列の最初のセルの値に「€」を加算します。私はちょうど両方のバージョンにコードを変更しようとしましたが、数字はまったく変更されません。 –

+0

Ifの隣にブレークポイント(F9)を置き、コードを実行します。それがブレークポイントに当たったら、イミディエイトウィンドウ(Ctrl + G)に次のように入力します:Print rng.Address [Enter] Print Range( "Euro1")アドレス[Enter] – z32a7ul

0

を、あなたはValueオブジェクトRangeのデフォルトのメンバーで、コメントで言ったように。したがって:

はい、あなたが代わりにRange.ValueRangeを使用することができますし、あなたが値ををチェックしているとき、それが問題になることはありません。しかし、を範囲の値のに変更するときは、値を設定するために使用する変数のタイプに注意する必要があります。詳細については、this answerを確認してください。

rng = Range("YourRange").Offset(0, 2).Valueを使用すると、変数(rng)が範囲であるため、実際に範囲(セル)の値を変更していないことになります。あなたが使用する必要があり、実際にセル/範囲の値を変更するには、:したがって

rng.Value = Range("YourRange").Offset(0, 2).Value ' The second ".Value" is optional 
'             while the first one is mandatory. 

を、あなたの現在の方法を使用してコードは、次のようになります。

For Each Rng In Worksheets("Digital €").Range("Digital") 
    If Rng = Range("Euro1") Then 
     Rng.Value = Range("Euro1").Offset(0, 2).Value 
    ElseIf Rng = Range("Euro2") Then 
     Rng.Value = Range("Euro2").Offset(0, 2).Value 
    ' Your remaining cases 
    ' 
    End If 
Next 

しかし、If.. Then.. ElseIfにを使用してすべての12の場合を確認するのは良い方法ではありません。代わりに、Range.Findを使用して、指定された範囲内の一致する値を検索する必要があります。以下のような何かはあなたが必要なものすべてです:

For Each Rng In Worksheets("Digital €").Range("Digital") 
    Dim foundRange As Range 
    Set foundRange = Range("EuroRange").Find(Rng.Value) ' EuroRange should contain (
    '              Euro1, Euro2,.. etc). 
    If Not foundRange Is Nothing Then Rng.Value = foundRange.Offset(0, 2).Value 
Next 

希望:)

+0

こんにちはAhmed、答え。あなたが私がそれを実行するときに提案したトップメソッド、それは2番目のrng.Valueで無効なプロパティエラーを返しますか? –

+0

@ R.Patrick-White質問に記載されたすべての情報が正確であれば、どちらの方法もうまくいくはずです。どちらの方法を使いましたか?あなたのコードが上記の方法のいずれかとまったく同じであることを確認してください(*私は2番目をお勧めします*)。または、質問を編集して、更新されたコードを追加してください。 –

+0

@ R.Patrick-White、両方のメソッドをテストするライブサンプルがあります:http://g.recordit.co/27zepmcraL.gif –

関連する問題