エクセル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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Visual Basic(VBA) 前回質問の続きになりますが、下記マクロでシート1からシート2の抽出項目セルB3「りんご」とセルC2「 2 2022/12/02 17:37
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) EXCELのVBAについて 2 2023/07/05 17:17
- Excel(エクセル) vba userformで漢字を全角カタカナに 2 2022/07/24 15:38
- Excel(エクセル) VBAのoffsetの動き方について教えてください 3 2022/11/25 23:36
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのクイックアクセスツ...
-
エクセルでCtrl+Tでテーブルの...
-
DATE関数で現在の年齢を出した...
-
Excelで表を作ったところに文字...
-
エクセルのクイックアクセスツ...
-
在庫管理表に使うエクセルの関...
-
ユーザー定義関数をアドイン登...
-
職場の人から聞かれており、こ...
-
REGEXREPLACE関数について、
-
エクセルでバーコード作成し使...
-
下記マクロでMsgBox "空白です...
-
Excel関数-文字列で自動作成さ...
-
エクセルで表
-
【マクロ】for next構文について
-
エクセルの関数について教えて...
-
Excelデータをコピペして、ペー...
-
エクセルで特定の範囲内から小...
-
PDFの請求明細をエクセルにしたい
-
Excelで50個のセルに同じ文字を...
-
エクセルで会社の従業員のデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA、別ブックへ転記す...
-
エクセルでの作業計算方法について
-
時間によってファイル名が変わ...
-
【関数】適切な文字数の数字を...
-
Excelについて教えてください
-
エクセル初心者です 関数の入れ...
-
【マクロ】ファイル名の変更に...
-
UNIQUE関数が使えないバージョ...
-
エクセルの計算
-
【関数】先頭だけにある、半角...
-
Excelで、決まった行を繰り返し...
-
Excelでセルの値が同じか...
-
LOOKUP関数を使えばいいのでし...
-
Excel
-
はがきについて。
-
エクセルの条件付き書式につい...
-
エクセルのデーターが2か月前の...
-
エクセル②
-
エクセルで「-0.0」と表示さ...
-
Microsoft1Officeの互換ソフト...
おすすめ情報