dポイントプレゼントキャンペーン実施中!

エクセル2000です。
ワークシート上のセルの値を仮に0.5倍する場合(実際には変数で任意の倍数となりますが)

1つのセルなら

Sub TEST01()
With Sheets("入力")
.Range("E31") = Application.WorksheetFunction.Round(.Range("E31") * 0.5, 0)
End With
End Sub

でうまく行きます。
ところがTEST2のような範囲になるとエラーになってしまいます。

Sub TEST2()
With Sheets("入力")
.Range("E31:E40") = Application.WorksheetFunction.Round(.Range("E31:E40") * 0.5, 0)
End With
End Sub

For Nextなどで順繰りにやる方法はわかるのですが、いっぺんにやっちゃう方法はないのでしょうか?

A 回答 (2件)

こんにちは。

Wendy02です。

例えば、このようにして良いかと思います。

Sub TEST3R()
Dim r As Double
With Sheets("入力")
 r = .Range("F12").Value
 .Range("E31:E40").Offset(, 1).Value = _
  Evaluate("INDEX(ROUND(" & .Range("E31:E40").Address & "*" & r & ", 0),0,0)")
End With
End Sub

たた、もうここらになると、シートの補助列に数式を貼り付けて、.Value = .Value で、その場所に戻したほうが良いかもしれませんね。


例:
Sub TEST3RUsedFormula()
With Sheets("Sheet3").Range("E31:E40")
 .Offset(, 20).FormulaLocal = "=ROUND(E31*$F$12,0)"
 .Value = .Offset(, 20).Value
 .Offset(, 20).ClearContents
End With
End Sub
    • good
    • 0
この回答へのお礼

再度の回答、ありがとうございました。
Evaluate("INDEX の使い方がまだぜんぜん理解できていませんが、下記のようにしてなんとか目的を達しました。

.Range("E31:E40").Value = _
Evaluate("INDEX(ROUND(" & .Range("E31:E40").Address & "*" & r & ", 0),0,0)")

For Nextでまわすのとはぜんぜん違い、一瞬で切り替わるのは感激でした。有難うございました。

お礼日時:2006/01/25 15:03

merlionXXさん、こんばんは。

Wendy02です。

.Range("E31:E40") = Application.WorksheetFunction.Round(.Range("E31:E40") * 0.5, 0)

この中の「.Range("E31:E40")」は、範囲にはなっていますが、値が渡されます。そうすると、暗黙的には、.Range("E31:E40").Value となり、WorksheetFunction.Round に、渡そうとすると、中に、2次元配列が入っているので、型が違うというエラーが出るはずです。

ですから、そういう場合は、ワークシート側の配列数式を利用します。(ただし、これは、ワークシート関数の中で、配列を引数にできるものに限ります。それは、ワークシートで調べてみないと、誰にも分りません。)このEvaluate自体は、配列を含めることはできるのですが、配列を取り出すことが出来ません。そこで、INDEX関数を使って、配列を、配列のまま、範囲に渡してあげるようにします。

どちらかというと、裏技的な手法で、これは、マクロ関数に使用されるテクニックです。私も、時々使いますが、本格的なマクロコードには、あまり使いません。

Sub TEST2Revised()
With Sheets("入力")
'配列数式を使用します。
 .Range("E31:E40").Value = _
  Evaluate("INDEX(ROUND(" & .Range("E31:E40").Address & "* 0.5, 0),0,0)")
End With
End Sub

>エクセル2000です。

このテクニックは、Excel 2000 やそれ以下のバージョンですと、配列のエラーを想定しなければなりませんので、だいたい、5,000セルを目処にしてください。どこでエラーが出るか、試してみてもよいと思います。6,000セルまでは出来ないはずです。

また、「For Nextなどで順繰り」と、スピードを比較してみてもよいかと思います。おそらくは、こちらの方が、元の言語が違うので、速いはずです。

いろんな関数で試してみるとよいかと思います。
    • good
    • 0
この回答へのお礼

早速ありがとうございました。
さすがWendy02さん、またあたらしい呪文を教えていただきました。

上記の例では完璧でした。

しかし、質問にも書きましたが実際は0.5ではなく、倍数は変数なのです。

r = .Range("F12").Value として、*0.5を*rに変えると、セルがVALUEエラーになってしまいます。
どう対応すればいいでしょうか?

お礼日時:2006/01/25 12:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!