質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

929閲覧

ループ処理が遅いので配列化に出来ないでしょうか?

sankichi4301

総合スコア2

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/08/25 06:19

編集2022/08/25 08:55

セル通しを比較して下記のような処理を行っています。
セルの値を書き換えているので遅くなっているので
配列で処理する方法はないでしょうか?

イメージ説明

上画像が現データ 下画像がやりたい事です。
基準2行目のA列からG列と3行目のA列からG列を順番に比較し不一致だったらセル値を右へ一つ移動する。
基準2行目のA列からG列と4行目**のA列からG列を順番に比較し不一致だったらセル値を右へ一つ移動する。

Sub test()
Dim ws As Worksheet
Set ws = Sheets("test1")

Dim last_row, x, y As Long last_row = ws.Cells(Rows.Count, 1).End(xlUp).Row x = 3 y = 4 Dim base_str, search_str As String Do While y <= last_row For x = 3 To 17 base_str = Cells(2, x) search_str = Cells(y, x) If InStr(search_str, base_str) = 0 Then Range(ws.Cells(y, x), ws.Cells(y, 17)).Offset(0, 1).Value _ = Range(ws.Cells(y, x), ws.Cells(y, 17)).Value ws.Cells(y, x).Value = "" End If Next x y = y + 1 Loop

End Sub

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Matsumon0104

2022/08/25 06:41

「セル通しを比較して下記のような処理」の内容を詳しく記載いただけますでしょうか? before, afterのような記載が見られますが、同じデータのようで、どんな処理結果を望んでいるのかわかりません。 掲載いただいたソースを確認すれば、どういった処理をしたいのかが見えてくるとは思うのですが、わざわざプログラムの処理を回答者側で追わないと質疑内容がわからないとなると、回答もつきにくいかと思います。
sankichi4301

2022/08/25 06:59

イメージを画像に変更させていただきました。
okakemetal

2022/08/25 07:25

A列からG列の最終業までを範囲指定して、2次元配列Aへ格納 同様に、I列からO列の最終行までを範囲指定して、2次元配列Bへ格納 ループ1で行数のカウンタ、ループ2で列数のカウンタをまわして 配列Aと配列Bを比較して・・・・ 比較結果を最終的にどうしたいのか読み取れませんでしたので、ここまで
sankichi4301

2022/08/25 08:56

早速の返事ありがとうございます。 再度イメージを画像に変更させていただきました。 画像したにやりたい内容を追記しました。
sankichi4301

2022/08/26 00:20

全ては載せられなかったので、一部分を載せました。 >1.ソースをみると、For x = 3 To 17になっていて、C列からP列が対象になっています。 現状はC列からP列なのですが、A列からP列をまで行いたいです。 >2.ソースをみると、比較を開始する行は4行目からになっています。 3行目も比較します。 >3.セルを比較するときに、InStrを使用しています。 ①search_strの文字列内にbase_str の文字列が含まれないならセルを右へ移動する。 です。
sankichi4301

2022/08/26 00:22

shiketaさんへ  回答ありがとうございます。 記載していないだけで、画像更新停止処理は行っています。
sankichi4301

2022/08/26 09:09

hatena19 回答ありがとうござます。 やりたいことができ、速度も体感で10の1になりました。 末端からループの使い方も勉強になりました。
guest

回答3

0

ループ処理実行中は、画面を更新しない、とか。

マクロの速度を向上させるため、画面を更新しないようにします。 この場合、マクロの処理過程は見ることができませんが、実行速度が速くなります。

投稿2022/08/25 23:34

shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

補足要求です。

基準2行目のA列からG列と3行目のA列からG列を順番に比較し不一致だったらセル値を右へ一つ移動する。
基準2行目のA列からG列と4行目**のA列からG列を順番に比較し不一致だったらセル値を右へ一つ移動する。

とのことですが、
1.ソースをみると、For x = 3 To 17になっていて、C列からP列が対象になっています。
A列からG列が正しいのか、C列からP列が正しいのか、どちらなのでしょうか。

2.ソースをみると、比較を開始する行は4行目からになっています。
3行目は比較対象ではありません。3行目は比較するのでしょうか。それとも比較しないのでしょうか。

3.セルを比較するときに、InStrを使用しています。
これは、search_strの文字列内にbase_str の文字列がが含まれるか否かの判断です。
search_strの文字列とbase_str の文字列が一致か不一致かの判断ではありません。
①search_strの文字列内にbase_str の文字列が含まれないならセルを右へ移動する。
②search_strの文字列とbase_str の文字列が不一致ならセルを右へ移動する。
上記の①と②のどちらなのでしょうか。

投稿2022/08/25 22:07

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

シートの内容が不明なので、具体的にどのような処理なのか分かりませんが、おそらく可能だと思います。
下記のリンク先などを参考にしてください。

VBA セル範囲の配列化後の処理について

Office TANAKA - VBA高速化テクニック[配列を使う]


質問のコードを機械的に、配列を使用したものに変換しました。
シートの詳細ややりたいことの説明が不十分なので、動作確認はしてません。

vba

1Sub test() 2 Dim ws As Worksheet 3 Set ws = Sheets("test1") 4 5 Dim last_row As Long, x As Long, y As Long, z As Long 6 last_row = ws.Cells(Rows.Count, 1).End(xlUp).Row 7 x = 3 8 y = 4 9 10 Dim base_str As String, search_str As String 11 12 'セル範囲を配列に格納 13 Dim ary() As Variant 14 ary = ws.Range(ws.Cells(1, 1), ws.Cells(last_row, 17)).Value 15 16 Do While y <= last_row 17 For x = 3 To 17 18 base_str = ary(2, x) 19 search_str = ary(y, x) 20 If InStr(search_str, base_str) = 0 Then 21 'セル値を右へ一つ移動 22 For z = 16 To x Step -1 23 ary(y, z + 1) = ary(y, z) 24 Next 25 ary(y, x) = "" 26 End If 27 Next x 28 y = y + 1 29 Loop 30 '配列をセル範囲に代入 31 ws.Range(ws.Cells(1, 1), ws.Cells(last_row, 17)).Value = ary 32 33End Sub

セル範囲⇔配列(マクロVBA高速化必須テクニック)|VBA入門

投稿2022/08/25 06:41

編集2022/08/26 07:28
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問