お世話になります。
VBA初心者です。
現在
Sub test()
Dim base As Worksheet
Set base = ThisWorkbook.Worksheets(1)
Dim checkBook As Workbook
Set checkBook = Workbooks("チェック .xlsm")
Dim checkSheet As Worksheet
checkSheet.Cells(2, 12).Value = base.Cells(8, 49).Value
checkSheet.Cells(2, 13).Value = base.Cells(8, 54).Value
checkSheet.Cells(2, 14).Value = base.Cells(8, 55).Value
checkSheet.Cells(2, 15).Value = base.Cells(8, 58).Value
checkSheet.Cells(2, 18).Value = base.Cells(10, 49).Value
(同じように値を入れるコードが続く)
End Sub
のようなプログラムを(一部簡略化してあります)を記述しています。
このように一つずる値を入れるプログラムを記述すると、Excel2013では処理が遅くなると別の質問で教えて頂きまして、やりかたを調べていたのですがよくわからず再度ご質問させて頂いております。
ご教示よろしくお願いいたします。
No.1
- 回答日時:
No.3
- 回答日時:
の回答では、解決案として2つの方法が提示されています。
方法1:
rangeオブジェクトを使う。
Range("A1:A20").Value = Range("B1:B20").Value
のようにすると、一括して代入できます。
しかしながら、今回はセルが連続していないので、これは使用できません。
データのセルの配置をrangeオブジェクトが使用しやすいように変えれば話は別ですが、
たぶん、それは無理かとおもいます。
方法2:
・一々セルを更新表示させない。
スタート前に、Application.ScreenUpdating = False を入れ、画面の更新表示を止める。
終了前にApplication.ScreenUpdating = True で戻して置く。
これが、対処可能な方法になります。
以下のようなコードになります。
-----------------------------------------------------------
Application.ScreenUpdating = False 'マクロの先頭
・・・・セルの代入
・・・・セルの代入
Application.ScreenUpdating = True 'マクロの最後
No.4
- 回答日時:
こんにちは。
>このように一つずる値を入れるプログラムを記述すると、Excel2013では処理が遅くなると別の質問で教えて頂きまして、
私は、Excel 2013ですが、顕著にそのような状況下に陥ったことはまだありませんね。
それに、オブジェクトを一つずつ処理しているわけではなく、基本的にValue to Value で、そんなに遅くなるのでしょうか。計算式でも入っているということでしょうか。トータルな時間がどのぐらい掛かっているかということですね。時々、ここの質問で、1秒2秒は長すぎる、いや、200m秒でも長過ぎるとおっしゃった質問者があります。
https://oshiete.goo.ne.jp/qa/9457146.html
に出てくる話は、ごくごく一般論ですが、別に、Value to Value に言及しているわけでもありません。Range**.Copy -> Range*.PasteSpecial との比較では、Value to Value は、値オンリーでデータ量が軽いですから、どちらが速いかは、今の状態でははっきり言えません。
>Application.ScreenUpdating = False
>Application.EnableEvents = False
>Application.Calculation = xlCalculationManual
通常、これで十分です。
もう一つ二つ、特殊なものがありますが、通常は使わないです。
>連続してないと無理なのですね・・。
Rangeのコピーと分散であってもValue to Value のコピーでは、どちらが速いかは分かりませんね。
私の場合は、一旦、配列変数に入れてしまうのですが、今回は、そういうメリットがあるのか分かりません。(配列は、癖に近いです)
VBAとしては、別な話になります。
「マクロを高速化しよう!」(読み物)
http://vbae.odyssey-com.co.jp/column2/s21401.html
MSDNのほうは、私の忘れている話が一杯あります。
「VBA マクロの高速化」
https://msdn.microsoft.com/ja-jp/library/office/ …
ここを読んでいて思い出したことですが、Range型の範囲を一旦変数に置いたほうがよいです。
たぶん、実際は、この塊が下方向にずれていくでしょうから、Offset 関数を使えばよいと思います。別に、今回に限ってで書くわけではなく、私は、だいたいこんな書き方になります。
'//
Sub Test1()
Dim Arr()
Dim c
Dim i As Long, j As Long
Dim R1 As Range, R2 As Range
Dim base As Worksheet, checkSheet As Worksheet
Set base = Worksheets("Sheet1")
Set checkSheet = Worksheets("Sheet2")
i = 0: j = 0
With base
Set R1 = .Range("AW8,BB8,BC8,BF8,AW10")
For Each c In R1
ReDim Preserve Arr(i)
Arr(i) = c.Value
i = i + 1
Next c
End With
With checkSheet
Set R2 = .Range("L2,M2,N2,O2,R2")
For Each c In R2
c.Value = Arr(j)
j = j + 1
Next c
End With
End Sub
'//
なお、
.Range("AW8,BB8,BC8,BF8,AW10")
は、マクロとテキストエディタで作りました。
No.5ベストアンサー
- 回答日時:
やはり聞いてよかったと思います。
5秒が10秒ですか、Excel2013 になった理由でマクロで、そのようなことはにならないような気がします。念のため、ファイルの肥大化はしていませんよね。
私もExcel 2013に変えた時に、若干おそいような気がしましたが、すぐに慣れました。こういう問題は、総合的な判断が必要とされますから、今のやり取りの中では、当て推量ばかりになってしまいます。
>Application.ScreenUpdating = False
>Application.EnableEvents = False
>Application.Calculation = xlCalculationManual
これで、直らない時は、マクロ自身に問題を求めるべきではないかもしれません。
MSDNの方は、こちらから紹介しましたので、後は、ご自身がどう判断されるかですが、マクロとしての解決方法は示しましたが、変わらないとしたら、他の要因を探すべきかもしれません。
例えば、
・アドインやCOMアドインなどが邪魔していないか。
・外部リンク、OLEオブジェクト・オートシェイプの残骸、名前定義の残骸(※)
・自動保存が頻繁に行われている。
・Pコードの存在(コンパイルした中間コード)。
・エアロ(Aero/ Aero Glass)がある。
・OneDrive の利用を停止してみる。(←デフォルトでは使うようになっていますが、これを使えば確実に遅くなります。)
・ネットワーク関連の問題。
※これらが直接、マクロを遅らせるということはありません。
Excelは、それぞれの機能別にメモリの割り振りがあるせいか、一定量まではなんの問題もなく、そこそこ動くのに、ある一定量を越えると、途端にブレーキが掛かってしまうということがあります。
参考
http://blog.eset-smart-security.jp/2015/07/excel …
表現があいまいですいませんでした。
ご教示いただいた方法にも当てはまるところがないようですので、このまま使ってみようと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
準・究極の選択
「年収1000万円で一生カレーライス」か 「年収180万円で毎日何でも食べ放題」 あなたはどちらを選びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
ExcelVBAで質問です。離れた二次元配列を一つにしたい
Visual Basic(VBA)
-
cellsで特定の離れた範囲を選択する方法は?
Visual Basic(VBA)
-
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
-
4
Excelのセルの色指定をVBAから配列を用いて効率的に行う方法はあり
Visual Basic(VBA)
-
5
VBAで、離れた複数の列に対して処理を施すには?
Visual Basic(VBA)
-
6
VBA 見つからなかった時の処理
Excel(エクセル)
-
7
エクセルVBA Unionはなぜ遅い?
Visual Basic(VBA)
-
8
WorkBooksをオープンさせずにシートにコピーしたい【EXCEL VBA】
Excel(エクセル)
-
9
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
10
VBA 数式を残して値をクリアについて
Excel(エクセル)
-
11
配列でデータが入っている要素を求める方法
Visual Basic(VBA)
-
12
配列をEraseしてもメモリが開放されていない?
Visual Basic(VBA)
-
13
Application.ScreenUpdating = Falseが効きません
Visual Basic(VBA)
-
14
特定の複数のシートに同じ処理をさせたい
Excel(エクセル)
-
15
EXCEL VBA マクロ 実行する度に処理速度がどんどん遅くなる原因が知りたい
Excel(エクセル)
-
16
VBAのFind関数で結合セルを検索するとヒットしない
Visual Basic(VBA)
-
17
表にフィルターをかけ、絞ったデータ(可視化セルのみ)を一次元配列として変数に入れるという動作を書きた
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
一つのTeratermのマクロで複数...
-
特定のPCだけ動作しないVBAマク...
-
Excel・Word リサーチ機能を無...
-
Excel マクロ VBA プロシー...
-
ExcelのVBA。public変数の値が...
-
メッセージボックスのOKボタ...
-
エクセルで特定の列が0表示の場...
-
エクセルに張り付けた写真のフ...
-
ダブルクリックで貼り付けた画...
-
エクセルで別のセルにあるふり...
-
EXCELマクロでのThisisWor...
-
OnTimeを使ったのですが「エラ...
-
Excel マクロでShearePoint先の...
-
エクセルVBAでNAVITIMEを使って...
-
エクセルの改ページを行ごとに...
-
ファイルが見つからない時、ス...
-
マクロ実行時、ユーザーフォー...
-
Excel VBAからAccessマクロを実...
-
マクロ実行時エラー
-
wordを起動した際に特定のペー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
ExcelのVBA。public変数の値が...
-
エクセルに張り付けた写真のフ...
-
Excel VBAからAccessマクロを実...
-
TERA TERMを隠す方法
-
Excel マクロでShearePoint先の...
-
ExcelVBAでPDFを閉じるソース
-
特定文字のある行の前に空白行...
-
マクロ実行時、ユーザーフォー...
-
wordを起動した際に特定のペー...
-
エクセルで別のセルにあるふり...
-
ソース内の行末に\\
-
マクロで空白セルを詰めて別シ...
-
【EXCEL VBA】オートシェイプを...
-
エクセルのマクロをセルの値に...
おすすめ情報
ご教示ありがとうございます。
サイトの記事を読んでみたのですが、
私の場合、”主語”が複数あるのでどうあてはめていいかわかりません・・。
ご教示ありがとうございます。
昨日、
https://oshiete.goo.ne.jp/qa/9457146.html
こういったご質問をさせていただきました。
質問の内容が異なってきたので改めてご質問させていただきました。
あらかじめ質問文に記述しておけばよかったですね、すいません。
ご教示ありがとうございます。
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
・・・・セルの代入
・・・・セルの代入
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
とすでに記述をしていたため、代入の改善策をさがしておりました。
言葉足らずですいません。
連続してないと無理なのですね・・。
おっしゃるとおり、見やすい配置にするためにあえて代入をと考えておりましたので、セルの配置も厳しいです・・。
ご教示ありがとうございます。
お礼が遅れてすいません。
Excel2013ですと処理に約10秒かかります。
Excel2007ですと約5秒で終わります。