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

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

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

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

Q&A

2回答

2994閲覧

VBA 重複項目を避けて値を取得する方法

NOVUCHANMAN

総合スコア5

VBA

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

0グッド

0クリップ

投稿2020/02/23 07:38

VBA初心者です。

エクセル2019で重複項目を避けて値を取得する方法を知りたいです。

エクセルシートのセルC4からC10にそれそれ数字が記入されています。

それぞれ
C4 = 1
C5 = 3
C6 = 3
C7 = 5
C8 = 1
C9 = 7
C10 = 9

で、C4の値から順番に値を取得し、重複しているものは値を取得せず、次の行に進みます。

この例だと「13579」と表示されないとおかしいということです。

僕のイメージとしては、最初可変長配列を2つ用意し(ここでは配列1、配列2とする)Ⅽ4の値を取得し配列1と2の最初の要素に入れる。

C5の値を取得する時に、配列1の全要素と比較し同じ値でなければ、取得するという感じで作っていたのですが、うまくいきません。

別シートに転記してからとかではなく、マクロを実行させれば1回で値を取得できるようにしたいです。

すいませんがよろしくおねがいします。

VBA

1 2Sub 試し() 3Dim a() As Long ’aという可変長配列変数宣言 4Dim b() As Long ’bという可変長配列変数宣言 5Dim ws As Worksheet 6 7Set ws = ThisWorkbook.Worksheets(1) 8Dim n As Long 9Dim k As Long 10Dim j As Long 11n = 0 12 13Dim r As Long 14For r = 4 To 10 15 16 17 If n = 0 Then 18 19 20 'aの配列はc列のすべてを取得 21 ReDim Preserve a(n) 22 a(n) = Cells(r, "C").Value 23 k = 0 'bの配列はa列と重複していないものを取得 24 ReDim Preserve b(k) 25 b(k) = a(n) 26 27 GoTo continue 28 29 ElseIf n = 1 Then 30 31 ReDim Preserve a(n) 32 a(n) = ws.Cells(r, "C").Value 33 34 35 For j = 1 To n 36 If Not a(j) = b(k) Then 37 k = k + 1 38 ReDim Preserve b(k) 39 b(k) = a(n) 40 41 Else 42 43 Exit For 44 45 End If 46 47 Next 48 49 ElseIf n >= 2 Then 50 51 ReDim Preserve a(n) 52 a(n) = ws.Cells(r, "C").Value 53 54 55 For j = 0 To n 56 If Not a(j) = b(k) Then 57 k = k + 1 58 ReDim Preserve b(k) 59 b(k) = a(n) 60 61 Else 62 63 Exit For 64 65 End If 66 67 Next 68 69 End If 70continue: 71 72Debug.Print a(n); b(k) 73 74n = n + 1 75 76Next 77 78 79End Sub

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

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

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

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

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

meg_

2020/02/23 08:07

「うまくいきません。」とは具体的にはどううまくいかなかったのですか?
dodox86

2020/02/23 08:18

重複が除ければいいのでしょうか。例えば[5,3,3,6,1,10,1]の並びであるとき、求める答えが[5,3,6,1,10]でも[10,5,6,1,3](順番は問わない)でも良いのでしょうか。
NOVUCHANMAN

2020/02/24 15:08

dodox86さん 順番通り重複せず答えを抜き出したいです。
NOVUCHANMAN

2020/02/24 15:14

meg_ざん 下記のコードを実行すると、「13351111」になり、「13579」とはならなかったという事です。
guest

回答2

0

重複排除ということなら、連想配列(Dictionary)を使うと簡単です。

vba

1Public Sub Sample2() 2 Dim a() 'データ配列 3 a() = Range("C4:C10").Value 4 5 Dim d As Object '重複排除配列(連想配列) 6 Set d = CreateObject("Scripting.Dictionary") 7 8 Dim i 9 For Each i In a 10 d(i) = i 11 Next 12 13 Debug.Print Join(WorksheetFunction.Transpose(a)) 14 Debug.Print Join(d.Keys) 15End Sub

連想配列を使わずに自分で重複チェックするなら、
重複排除配列に追加する前に、その配列に同じ値がないか確認して、なければ追加するというロジックを組めばいいでしょう。現状のコードをなるべく活かして、

vba

1Sub sample() 2 Dim a() 'aという可変長配列変数宣言 3 Dim b() 'bという可変長配列変数宣言 4 Dim ws As Worksheet 5 6 Set ws = ThisWorkbook.Worksheets(1) 7 Dim n As Long 8 Dim k As Long 9 Dim f As Boolean 10 Dim i As Variant 11 n = 0 12 k = 0 13 14 Dim r As Long 15 For r = 4 To 10 16 17 ReDim Preserve a(n) 18 a(n) = ws.Cells(r, "C").Value 19 20 If n = 0 Then 21 ReDim Preserve b(k) 22 b(k) = a(n) 23 k = k + 1 24 ElseIf n > 1 Then 25 f = False 26 For Each i In b 27 If i = a(n) Then 28 f = True '重複あり 29 Exit For 30 End If 31 Next 32 If Not f Then '重複なしのとき 33 ReDim Preserve b(k) 34 b(k) = a(n) 35 k = k + 1 36 End If 37 End If 38 n = n + 1 39 Next 40 41 Debug.Print Join(a) 42 Debug.Print Join(b) 43End Sub

投稿2020/02/23 10:18

編集2020/02/23 10:51
hatena19

総合スコア34367

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

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

0

対象の範囲内で重複した文字列を飛ばして配列に格納っていうことで良ければゴリ押しですが

追記:
このコード1行or1列しか対応できません

VBA

1Sub test() 2抽出範囲始点 = "A1" 3抽出範囲終点 = "A10" 4For i = 0 To Range(抽出範囲終点).Column 5 For j = 0 To Range(抽出範囲終点).Row 6 If Not 抽出文字列 Like "*," & Range("A1").Offset(j, 0).Value & ",*" Then 7 抽出文字列 = 抽出文字列 & "," & Range("A1").Offset(j, 0).Value 8 End If 9 Next j 10Next i 11 12抽出配列 = Split(抽出文字列, ",") 13 14MsgBox (Join(抽出配列)) 15End Sub 16

投稿2020/02/23 10:04

編集2020/02/23 10:15
abratani

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問