- ベストアンサー
VBAループ文で文字の入力と消去を行う方法
- VBAでループ文を使用して1000行×1000列のセルに文字を入力する方法を学習しています。また、入力した文字を全て消去する方法についても知りたいです。
- 文字の入力には時間がかかる可能性があるので、それは仕方のないことですか?お手数ですが、ご教授お願いします。
- VBAのループ文を使用して1000行×1000列のセルに文字を入力し、その文字を全て消去する方法について教えてください。また、入力に時間がかかる場合があるかどうかも教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>文字消しはあくまで、do 文で記載したいと思っているのですが サイズが1000行、1000列と決まっているのだから Sub 文字入力消し4() Dim i As Long Dim t As Long Dim v As Variant v = Range("A1").Resize(1000, 1000).Value i = 1 t = 1 Do Until i = 1000 i = i + 1 Do Until t = 1000 t = t + 1 v(i, t) = "" Loop t = 0 Loop Range("A1").Resize(1000, 1000).Value = v End Sub
その他の回答 (5)
- HohoPapa
- ベストアンサー率65% (455/693)
>この構文を生かして時間短縮等はできないものでしょうか? 構文の学習とチューニングや高速化は分けて考える必要がありましょう。 チューニングや高速化の解は、作業の特徴や要求仕様に依存します。 そもそも今回の課題 (単に1000×1000のセルに同じ値を埋め、まとめて消す課題) では提示のコードで行う必要はありませんし、 通常は、他の方のコメントのように、 セル範囲を対象にまとめて行うものと思います。
お礼
ご回答ありがとうございます。自分も色々やってみましたが、配列を使った方が、全然効率的であると思いました。これまで、サポートしていただきありがとうございます。
- imogasi
- ベストアンサー率27% (4737/17069)
VBAでの繰り返し処理は (1)For For Each (2)Do~While文 Do While 条件式 処理 Loop Do 処理 Loop While 条件式 (3)Do~Until文 Do Until 条件 処理 Loop https://tonari-it.com/excel-vba-loop-3situation/ http://officetanaka.net/excel/vba/statement/DoLoop.htm などを読めばよい。 ーー 見かけが違うものとして While...Wend http://officetanaka.net/excel/vba/statement/WhileWend.htm === 処理時間短縮 (1)ScreenUpdating=Falseを処理の最初に入れる。 Application.ScreenUpdating = False https://thom.hateblo.jp/entry/2015/08/31/063500 (2)配列にデータを一旦入れて、まとめてセルのデータとして代入する。 (3)不必要な、入出力や通信処理を入れない。 (4)繰り返し法(総なめ法)しかないか、問題に応じて学習する。 (5)事前に、それが早く見つかるようなデータ(Index的なもの)を、その時は時間を費消するが、用意しておく。 (6)適当なアルゴリズムを勉強する。初心者向けに必ずあるものではないから思い煩うな。 プログラムを、学び始めて数日の段階から、処理速度を速めることなど考えるなと言いたい。 昔は総なめ法などプログラマーとしては、軽蔑されたと思うが、ハード的な 処理速度が向上して、優先順位が低くなっていると思う。
お礼
リンク先大変参考になりました。 また、With Application .ScreenUpdating = False .EnableEvents = False .Calculation = xlCalculationManual End Withを積極的に使っていこうと思います。ありがとうございました。
- HohoPapa
- ベストアンサー率65% (455/693)
No.3の訂正 提示された Sub 文字入力消し() のコードは、 Cells(i, t) = "" このコードが1000回繰り返し その後、 t = t + 1 このコードが実行されますので tの値は1001になります。 <==ここを誤記してました。 そのため、 Loop Until Cells(i, t) = "" この条件にヒットし、 外側のループからも抜けてしまいます。
補足
やりたかったのはこの構文ですが、大変時間がかかります。この構文を生かして時間短縮等はできないものでしょうか?お手数おかけして大変申し訳ありません。
- HohoPapa
- ベストアンサー率65% (455/693)
提示された Sub 文字入力消し() のコードは、 Cells(i, t) = "" このコードが1000回繰り返し その後、 t = t + 1 このコードが実行されますので tの値は10001になります。 そのため、 Loop Until Cells(i, t) = "" この条件にヒットし、 外側のループからも抜けてしまいます。 提示のコードを生かすのであれば つぎのような記述になります。 Sub 文字入力消し() Dim i As Long Dim t As Long i = 1 t = 1 Do Do Cells(i, t) = "" t = t + 1 Loop Until Cells(i, t) = "" i = i + 1 t = 1 Loop Until Cells(i, t) = "" End Sub
- watabe007
- ベストアンサー率62% (476/760)
個別にセルに書き込みには時間がかかりますので一旦、配列に格納して 一気に書き込めば時間を短縮できるでしょう Sub 文字入力2() Dim i As Long Dim t As Long Dim v(1 To 1000, 1 To 1000) For i = 1 To 1000 For t = 1 To 1000 v(i, t) = "wooo" Next t Next i Range("A1").Resize(1000, 1000).Value = v End Sub Sub 文字入力3() Range("A1", Cells(1000, 1000)).Value = "wooo" End Sub Sub 文字入力消し2() Dim i As Long Dim t As Long Dim v As Variant v = Range("A1").Resize(1000, 1000).Value For i = 1 To 1000 For t = 1 To 1000 If v(i, t) <> "" Then v(i, t) = "" Next t Next i Range("A1").Resize(1000, 1000).Value = v End Sub Sub 文字入力消し3() Range("A1").Resize(1000, 1000).ClearContents End Sub
補足
Watabe007様 早速の回答ありがとうございます。文字消しはあくまで、do 文で記載したいと思っているのですが、(do と for文を使いこなせるようになるため)do 文で記載した場合どのように なるのでしょうか?
お礼
配列を使うという考え方をこれから勉強していきたいと思います。 大変お世話になりました。
補足
Sub 文字入力消し3() Dim i As Long Dim t As Long Dim v As Variant v = Range("A1").Resize(1000, 1000).Value i = 1 t = 1 Do Until i = 1000 i = i + 1 Do Until t = 1000 t = t + 1 v(i, t) = "" Loop t = 0 Loop Range("A1").Resize(1000, 1000).Value = v Range("A1").Resize(1000, 1000).ClearContents End Sub この構文で問題なく、早く処理できました。後で、色々勉強したいと思います。 大変勉強になりました。