
エクセル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などで順繰りにやる方法はわかるのですが、いっぺんにやっちゃう方法はないのでしょうか?
No.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
再度の回答、ありがとうございました。
Evaluate("INDEX の使い方がまだぜんぜん理解できていませんが、下記のようにしてなんとか目的を達しました。
.Range("E31:E40").Value = _
Evaluate("INDEX(ROUND(" & .Range("E31:E40").Address & "*" & r & ", 0),0,0)")
For Nextでまわすのとはぜんぜん違い、一瞬で切り替わるのは感激でした。有難うございました。
No.1
- 回答日時:
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などで順繰り」と、スピードを比較してみてもよいかと思います。おそらくは、こちらの方が、元の言語が違うので、速いはずです。
いろんな関数で試してみるとよいかと思います。
早速ありがとうございました。
さすがWendy02さん、またあたらしい呪文を教えていただきました。
上記の例では完璧でした。
しかし、質問にも書きましたが実際は0.5ではなく、倍数は変数なのです。
r = .Range("F12").Value として、*0.5を*rに変えると、セルがVALUEエラーになってしまいます。
どう対応すればいいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】実行時エラー '424':...
-
他のシートの検索
-
vba テキストボックスとリフト...
-
【画像あり】オートフィルター...
-
Office2021のエクセルで米国株...
-
エクセルのVBAで集計をしたい
-
【マクロ】【配列】3つのシー...
-
【マクロ】【相談】Excelブック...
-
エクセルに写真が貼れない(フ...
-
エクセルのライセンスが分かり...
-
【マクロ】元データと同じお客...
-
エクセルシートの見出しの文字...
-
【マクロ】excelファイルを開く...
-
LibreOffice Clalc(またはエク...
-
【マクロ】【画像あり】❶ブック...
-
【関数】3つのセルの中で最新...
-
【関数】=EXACT(a1,b1) a1とb1...
-
セルにぴったし写真を挿入
-
Excelに貼ったXのURLのリンク...
-
【マクロ】【画像あり】4つの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【マクロ】元データと同じお客...
-
エクセルの関数について
-
【画像あり】オートフィルター...
-
エクセルのVBAで集計をしたい
-
エクセルのリストについて
-
【マクロ】数式を入力したい。...
-
【マクロ】【相談】Excelブック...
-
Office2021のエクセルで米国株...
-
【マクロ】実行時エラー '424':...
-
他のシートの検索
-
エクセルの複雑なシフト表から...
-
【マクロ】【配列】3つのシー...
-
vba テキストボックスとリフト...
-
【マクロ】左のブックと右のブ...
-
【マクロ】変数に入れるコード...
-
エクセルシートの見出しの文字...
-
【マクロ】別ファイルへマクロ...
-
【関数】同じ関数なのに、エラ...
-
Amazonでマイクロソフトオフィ...
-
ページが変なふうに切れる
おすすめ情報