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

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

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

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

Q&A

解決済

1回答

1868閲覧

VBAのvariant型の配列で抽出すると2回目以降重複が出る

Izumo1101

総合スコア49

VBA

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

0グッド

0クリップ

投稿2020/03/23 09:22

vbaの配列に関する質問です。
シートにある2500行10列程度のデータを配列に入れて、条件で抽出をかけて書き出しをしています。ところが抽出2回目以降、表示されるデータが重複してしまいます。
例えば「卒業」という語句が含まれている行をすべて抽出したいと思った時に、1回目が3件抽出されると、2回目は同じものが下に表示され合計6件、3回目は9件という感じです。

配列の中でヒットしたら、同じ配列の先頭に差し替える、という流れの記述をしています。

vba

1Sub 抽出() 2 Dim i As Long, n As Long, m As Long 3 Dim buf As Variant 4 Dim x As String, y As String, z As String 5 Dim cnt As Long: cnt = 1 6 Dim num As Long 7 8 x = Range("j2") 9 10 Range("a2:h100").ClearContents 11 12 Set buf = Sheets("data").Range("a2:h3000") 13 14 If x <> "" Then 15 For i = 1 To 3000 16 If buf(i, 2) Like "*" & x & "*" Then 17 For n = 1 To 8 18 buf(cnt, n) = buf(i, n) 19 Next n 20 cnt = cnt + 1 21 End If 22 Next i 23 End If 24 25 For m = 1 To cnt - 1 26 For n = 1 To 8 27 Cells(m + 1, n) = buf(m, n) 28 Next n 29 Next m 30 31End Sub

原因と解決策をご教示いただけないでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

シートにある2500行10列程度のデータを配列に入れて、

まず、この認識が間違っています。

vba

1 Set buf = Sheets("data").Range("a2:h3000")

これでbufには配列が格納されると思っているのかもしれませんが、
bufにはRange(セル範囲)が格納されます。
Setを使うとオブジェクトの代入になりますので。
その後のループ内で、Range(セル範囲)を先頭から一致したデータで上書きしています。

vba

1 For n = 1 To 8 2 buf(cnt, n) = buf(i, n) 3 Next n

次にこの処理を実行すると上書きした一致データも抽出してしまうので、繰り返すと重複してしまいます。

buf(cnt, n) = buf(i, n)は一見配列への代入に見えますが、
buf.Cells(cnt, n).Value = buf.Cells(i, n).Valueの省略形です。
つまりSheets("data")のセルへの上書きになります。

bufへ配列として格納するコードは下記になります。

vba

1 buf = Sheets("data").Range("a2:h3000").Value

Setは使用しない。
.Valueを付ける。

最初のコードをこれに変更すると重複せずに抽出できると思います。

投稿2020/03/23 09:57

編集2020/03/23 10:01
hatena19

総合スコア34075

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

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

Izumo1101

2020/03/23 10:08

大変助かりました。 いつからかsetを付けて違和感なくやっていましたが、言われてみれば確かに。。。 本当に勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問