Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2747 / 13646 ツリー ←次へ | 前へ→

【66229】他の変数内と同じものを探す 亜矢 10/8/11(水) 7:50 質問[未読]
【66232】Re:他の変数内と同じものを探す neptune 10/8/11(水) 14:12 発言[未読]
【66233】Re:他の変数内と同じものを探す Yuki 10/8/11(水) 14:35 発言[未読]
【66234】Re:他の変数内と同じものを探す kanabun 10/8/11(水) 15:14 発言[未読]
【66235】Re:他の変数内と同じものを探す kanabun 10/8/11(水) 15:49 発言[未読]
【66238】Re:他の変数内と同じものを探す 亜矢 10/8/11(水) 16:18 お礼[未読]
【66239】Re:他の変数内と同じものを探す kanabun 10/8/11(水) 16:46 発言[未読]
【66247】Re:他の変数内と同じものを探す 亜矢 10/8/12(木) 5:04 発言[未読]
【66248】Re:他の変数内と同じものを探す kanabun 10/8/12(木) 10:01 発言[未読]
【66249】Re:他の変数内と同じものを探す 亜矢 10/8/12(木) 11:03 お礼[未読]

【66229】他の変数内と同じものを探す
質問  亜矢  - 10/8/11(水) 7:50 -

引用なし
パスワード
   よろしくお願いします。
今変数 AA,BBがあります。
 AA(1)=りんご    BB(1)=すいか    CC(1)=すいか
 AA(2)=みかん    BB(2)=とまと    CC(2)=みかん
 AA(3)=すいか    BB(3)=みかん →
 AA(4)=すもも    BB(4)=なし 
 AA(5)=かき     BB(5)=くり 
CCの変数値になるように、二つの変数から串刺し的に共通のものを探す方法をおしえていただきたいと思います。
 AA,BBの変数は最大で150位あり、
 それぞれの変数量の最大は3000ヶ位あります。

【66232】Re:他の変数内と同じものを探す
発言  neptune  - 10/8/11(水) 14:12 -

引用なし
パスワード
   ▼亜矢 さん:
基本的に配列変数を使った場合は総当たりして調べるしかありませんので、
それなりのロジックを考える必要があります。

他の方法では、collectionとか、dictonaryとかを使えば検索に関しては
楽チンになります。具体的には過去ログなどをdictionary、collectionを
キーワードにして検索してみて下さい。たくさん使用例が有ります。
この場合はdictionaryをお勧めします。

本当はその前に
ht tp://msdn.microsoft.com/ja-jp/library/default.aspx

dictionaryオブジェクト
をキーワードに検索するのbest

【66233】Re:他の変数内と同じものを探す
発言  Yuki  - 10/8/11(水) 14:35 -

引用なし
パスワード
   ▼亜矢 さん:
オーソドックスに

Sub TEST()
  Dim AA(1 To 5) As String
  Dim BB(1 To 5) As String
  Dim CC()    As String
  Dim i      As Long
  Dim j      As Long
  Dim n      As Long
  
  AA(1) = "りんご":  BB(1) = "すいか"
  AA(2) = "みかん":  BB(2) = "とまと"
  AA(3) = "すいか":  BB(3) = "みかん"
  AA(4) = "すもも":  BB(4) = "なし"
  AA(5) = "かき":   BB(5) = "くり"
  For i = 1 To 5
    For j = 1 To 5
      If AA(i) = BB(j) Then
        n = n + 1
        ReDim Preserve CC(1 To n)
        CC(n) = AA(i)
        Exit For
      End If
    Next
  Next
  For i = 1 To UBound(CC)
    Debug.Print "CC(" & i & ")=" & CC(i)
  Next
End Sub

【66234】Re:他の変数内と同じものを探す
発言  kanabun  - 10/8/11(水) 15:14 -

引用なし
パスワード
   ▼亜矢 さん:

こんにちは。
neptune さん ご紹介の【dictionary】については
前回のスレッド《【66193】変数内の同じデータ》
のなかで ひとつの利用方法を紹介しましたが、ご理解
されましたでしょうか?

>▼亜矢 さん:
>こんにちは
>
>りんさんの紹介されているDictionaryですが、これは
>便利ですよ♪
>ぜひ習得されることをおすすめします。
>文章中の単語の出現回数とか、
>グループ別の数量カウントなどもできますので。
>
>Sub Try1()
> Dim dic As Object
> Dim MM() As String
> ReDim MM(1 To 8)  ' ------- 少ないデータで実験
>  MM(1) = "りんご"
>  MM(2) = "みかん"
>  MM(3) = "めろん"
>  MM(4) = "りんご"
>  MM(5) = "かき"
>  MM(6) = "もも"
>  MM(7) = "りんご"
>  MM(8) = "みかん"
> 
> Dim i As Long
> 
> Set dic = CreateObject("Scripting.Dictionary")
> For i = 1 To UBound(MM)
>   dic(MM(i)) = Empty 'どんどん配列要素を登録する(重複していれば上書きされる)
> Next
>
>' 結果を元の配列に入れる
> ReDim MM(1 To dic.Count)
> For i = 0 To dic.Count - 1
>   MM(i + 1) = dic.Keys()(i)
> Next
> 
> Set dic = Nothing
>End Sub

>ありがとうございました。上記の通り行って結果解決しました。
とのお返事でしたが、
上記を理解していれば、下も分かりますよね?

Sub Try2()
 '↓ほんとは 変数には すでに 値が入っているのですが...
 ' ここでは ひとつづ 代入しています。
 Dim AA(1 To 5) As String
 Dim BB(1 To 5) As String
 AA(1) = "りんご":   BB(1) = "すいか"
 AA(2) = "みかん":   BB(2) = "とまと"
 AA(3) = "すいか":   BB(3) = "みかん"
 AA(4) = "すもも":   BB(4) = "なし"
 AA(5) = "かき":    BB(5) = "くり"

 Dim i As Long
 Dim dic As Object
 Set dic = CreateObject("Scripting.Dictionary")
 
 '配列AA() をdicに重複カットして登録
 For i = 1 To UBound(AA)
   dic(AA(i)) = Empty
 Next
 
 'このなかに 配列BB()のメンバがいるか? ひとつづつ調べる
 '結果を入れる3番目の配列 CC()を用意する(要素数はAAと同じ要素数)
 ReDim CC(1 To UBound(AA)) As String
 Dim k As Long
 For i = 1 To UBound(BB)
   If dic.Exists(BB(i)) Then
     k = k + 1
     CC(k) = BB(i)
   End If
 Next
 '結果の配列CC()を実際に利用された要素数kにリサイズする
 ReDim Preserve CC(1 To k)
 
 '確認
 For i = 1 To k
   Debug.Print CC(i)
 Next
End Sub

もっとも、
Excelでは いきなり「配列」があるのではなく、
シートのデータを配列に格納して...処理をする...
ということが多いので、

(シートにデータがなければ、配列内容をシートにコピーして、)

「データ」-[フィルタ]-[フィルタオプションの設定]
で抽出剃る方法もあります。
Dictionaryでやっていることがわからないときは、
こちらのほうが、理解しやすいかも?

【66235】Re:他の変数内と同じものを探す
発言  kanabun  - 10/8/11(水) 15:49 -

引用なし
パスワード
   ▼亜矢 さん:

>「データ」-[フィルタ]-[フィルタオプションの設定]
> で抽出剃る方法もあります。
> Dictionaryでやっていることがわからないときは、
> こちらのほうが、理解しやすいかも?

というのは、こういうことです。

 A列   B列
1 AA     AA
2 りんご     すいか
3 みかん     とまと
4 すいか     みかん
5 すもも     なし
6 かき     くり


'一行目に見出しを設定し(A列列見出しと B列列見出しは同じものを
いれておきます)。で、B列範囲を検索条件範囲として A列範囲に対し
フィルタオプションの設定(条件に合うものを抽出転記 転記先[C1])

Sub Try3()    
 Range("A1:A6").AdvancedFilter xlFilterCopy, [B1:B6], [C1]    
End Sub    

と、一行ですみます。(^^

【66238】Re:他の変数内と同じものを探す
お礼  亜矢  - 10/8/11(水) 16:18 -

引用なし
パスワード
   ▼kanabun さん:
>Sub Try2()
> '↓ほんとは 変数には すでに 値が入っているのですが...
> ' ここでは ひとつづ 代入しています。
> Dim AA(1 To 5) As String
> Dim BB(1 To 5) As String
> AA(1) = "りんご":   BB(1) = "すいか"
> AA(2) = "みかん":   BB(2) = "とまと"
> AA(3) = "すいか":   BB(3) = "みかん"
> AA(4) = "すもも":   BB(4) = "なし"
> AA(5) = "かき":    BB(5) = "くり"
>
> Dim i As Long
> Dim dic As Object
> Set dic = CreateObject("Scripting.Dictionary")
> 
> '配列AA() をdicに重複カットして登録
> For i = 1 To UBound(AA)
>   dic(AA(i)) = Empty
> Next
> 
> 'このなかに 配列BB()のメンバがいるか? ひとつづつ調べる
> '結果を入れる3番目の配列 CC()を用意する(要素数はAAと同じ要素数)
> ReDim CC(1 To UBound(AA)) As String
> Dim k As Long
> For i = 1 To UBound(BB)
>   If dic.Exists(BB(i)) Then
>     k = k + 1
>     CC(k) = BB(i)
>   End If
> Next
> '結果の配列CC()を実際に利用された要素数kにリサイズする
> ReDim Preserve CC(1 To k)
> 
> '確認
> For i = 1 To k
>   Debug.Print CC(i)
> Next
>End Sub
>
>もっとも、
> Excelでは いきなり「配列」があるのではなく、
> シートのデータを配列に格納して...処理をする...
>ということが多いので、
>
>(シートにデータがなければ、配列内容をシートにコピーして、)
>
>「データ」-[フィルタ]-[フィルタオプションの設定]
> で抽出剃る方法もあります。
> Dictionaryでやっていることがわからないときは、
> こちらのほうが、理解しやすいかも?
ありがとうございました。内容は理解しました。うまいコマンドがあって
簡単に串刺し的に検索ができるかなと期待していました。
 Existsメソッドは配列内に存在していたときにはtrueを返すということですね。
 結局は1ヶづつ検索することになるということですね。

【66239】Re:他の変数内と同じものを探す
発言  kanabun  - 10/8/11(水) 16:46 -

引用なし
パスワード
   ▼亜矢 さん:
> Existsメソッドは配列内に存在していたときにはtrueを返すということですね。
> 結局は1ヶづつ検索することになるということですね。

そうですが、
For i = 1 To Ubound(AA)
  For j = 1 To Uboun(BB)
   If AA(i) = BB(j) Then
     結果の配列に代入
   End If
  Next
Next

のような2重ループにしなくて済む分、
検索効率がよくなります。

ところで、
(前からお聞きしたかったのですが)
配列はどのようにしてデータを入力されたものですか?

【66247】Re:他の変数内と同じものを探す
発言  亜矢  - 10/8/12(木) 5:04 -

引用なし
パスワード
   ▼kanabun さん:
>▼亜矢 さん:
>> Existsメソッドは配列内に存在していたときにはtrueを返すということですね。
>> 結局は1ヶづつ検索することになるということですね。
>
>そうですが、
>For i = 1 To Ubound(AA)
>  For j = 1 To Uboun(BB)
>   If AA(i) = BB(j) Then
>     結果の配列に代入
>   End If
>  Next
>Next
>
>のような2重ループにしなくて済む分、
>検索効率がよくなります。
>
>ところで、
>(前からお聞きしたかったのですが)
>配列はどのようにしてデータを入力されたものですか?
エクセルシートにそれぞれ約10万行、5万行、1万行X4だけの
データがあり、常時自動的に増加していく仕組みになっています。
 その中から必要なデータをFindでなくオートフィルターを使って
 データを取得しています。Findではちょっと時間が遅くなるので、オートフィルターを使っています。
 データ数は最終的には最大20万行程度と考えています。

【66248】Re:他の変数内と同じものを探す
発言  kanabun  - 10/8/12(木) 10:01 -

引用なし
パスワード
   ▼亜矢 さん:

>>配列はどのようにしてデータを入力されたものですか?

>エクセルシートにそれぞれ約10万行、5万行、1万行X4だけの
>データがあり、常時自動的に増加していく仕組みになっています。
> その中から必要なデータをFindでなくオートフィルターを使って
> データを取得しています。Findではちょっと時間が遅くなるので、オートフィルターを使っています。
> データ数は最終的には最大20万行程度と考えています。

ご回答ありがとうございます。
やはり配列の元データはワークシート上なんですね。
なぜそんなこと聞いたかと申しますと、
ワークシート上の範囲を配列に入れると、2次元配列になりますが
亜矢さんは 一次元配列を例に出されていたものですから。
元データがシートの範囲ということですと、
フィルタオプションの設定のようなExcelの機能が(そのままVBAでも)
使えますから、そちらで出来る部分はやっておいて、抽出後のデータを
マクロで処理する、というような手順になるかと思います。

【66249】Re:他の変数内と同じものを探す
お礼  亜矢  - 10/8/12(木) 11:03 -

引用なし
パスワード
   ▼kanabun さん:
>▼亜矢 さん:
>
>>>配列はどのようにしてデータを入力されたものですか?
>
>>エクセルシートにそれぞれ約10万行、5万行、1万行X4だけの
>>データがあり、常時自動的に増加していく仕組みになっています。
>> その中から必要なデータをFindでなくオートフィルターを使って
>> データを取得しています。Findではちょっと時間が遅くなるので、オートフィルターを使っています。
>> データ数は最終的には最大20万行程度と考えています。
>
>ご回答ありがとうございます。
>やはり配列の元データはワークシート上なんですね。
>なぜそんなこと聞いたかと申しますと、
>ワークシート上の範囲を配列に入れると、2次元配列になりますが
>亜矢さんは 一次元配列を例に出されていたものですから。
>元データがシートの範囲ということですと、
>フィルタオプションの設定のようなExcelの機能が(そのままVBAでも)
>使えますから、そちらで出来る部分はやっておいて、抽出後のデータを
>マクロで処理する、というような手順になるかと思います。
重ね重ねご指導ありがとうございます。上記の様に考えてみます。

2747 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free