Excel VBA質問箱 IV

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

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


3669 / 13644 ツリー ←次へ | 前へ→

【60818】検索方法にて 質問小僧 09/3/16(月) 20:34 質問[未読]
【60819】Re:検索方法にて kanabun 09/3/16(月) 21:04 発言[未読]
【60824】Re:検索方法にて2 質問小僧 09/3/17(火) 9:13 発言[未読]
【60826】Re:検索方法にて2 kanabun 09/3/17(火) 9:50 発言[未読]
【60827】Re:検索方法にて2 質問小僧 09/3/17(火) 9:55 お礼[未読]
【60828】Re:検索方法にて2 kanabun 09/3/17(火) 11:32 発言[未読]

【60818】検索方法にて
質問  質問小僧  - 09/3/16(月) 20:34 -

引用なし
パスワード
   何方か助けてください。

検索の方法です。
今はVLOOKUPで処理していますが、この場合問題があり
回収したくやり方を教えて欲しいのですが・・・・

内容)

あるデータを伝票NOで集計して、別のファイルの管理台帳より
伝票NOをKEYにし管理番号を取得したいのです。

しかし、管理台帳には同一伝票NOで管理番号違いのデータがあ
り、VLOOKUPで処理すると、複数の中の1個のデータしか
取得できません・・・

知りたい内容は
1.伝票番号が複数かそうでないのか
2.伝票NOが同じものがある場合その管理NOはどれとどれとどれか
 複数あります。
3.それを一覧表出力したい。


以上お手数おかけしますがどなたかアドバイス並びに具体的な方法
を教えて下さい。

御願いします。

【60819】Re:検索方法にて
発言  kanabun  - 09/3/16(月) 21:04 -

引用なし
パスワード
   ▼質問小僧 さん:

>しかし、管理台帳には同一伝票NOで管理番号違いのデータがあ
>り、VLOOKUPで処理すると、複数の中の1個のデータしか
>取得できません・・・

>1.伝票番号が複数かそうでないのか

まず、
別のファイルの管理台帳 のリストを    

伝票No    管理番号
1234    A00123
1235    A00124
1234    A01234
1235    A01235
1246    A01246
1234    B1234
    
伝票No、管理番号でソートされたリストにしておくことをおすすめします。
    
伝票No    管理番号
1234    A00123
1234    A01234
1234    B1234
1235    A00124
1235    A01235
1246    A01246

>2.伝票NOが同じものがある場合その管理NOはどれとどれとどれか
>3.それを一覧表出力したい。

ソートされたリストに対して、Dictionaryなどを使えば
ユニークな「伝票NO」に対する 管理番号の配列の対照表を作成できます。
Dictionaryとか連想配列 って耳にされたことありますか?

【60824】Re:検索方法にて2
発言  質問小僧  - 09/3/17(火) 9:13 -

引用なし
パスワード
   連絡ありがとうございます。
Dictionaryは、何かをkeyにして
keyが変わるまで値を加算
変われば0から行うようなことで
利用したことがありますが
これと同じで、keyが変わるまで
管理番号を別ファイルに出力すれば
いいのでしょうか?

それなら、なんとなくやり方はわかるのですが・・・

【60826】Re:検索方法にて2
発言  kanabun  - 09/3/17(火) 9:50 -

引用なし
パスワード
   ▼質問小僧 さん:こんにちは

>Dictionaryは、何かをkeyにして
>keyが変わるまで値を加算
>変われば0から行うようなことで
>利用したことがありますが
>これと同じで、keyが変わるまで
>管理番号を別ファイルに出力すれば
>いいのでしょうか?
>
>それなら、なんとなくやり方はわかるのですが・・・

ある程度ご存じのようですので、それなら話は簡単です。
VLOOKUP で表引きする代わりに、
メモリにおいた dictionaryを「辞書引き」すればいいわけです。

(ちょっと時間が取れないので サンプルはすぐ出せませんが)
 key     item
 (No)   (管理番号)

1234   {A00123, A01234, B1234}
1235   {A00125, A01235}
:

> 別ファイルに出力
までのことはないと思います。

【60827】Re:検索方法にて2
お礼  質問小僧  - 09/3/17(火) 9:55 -

引用なし
パスワード
   ありがとうございました。
やってみます。

【60828】Re:検索方法にて2
発言  kanabun  - 09/3/17(火) 11:32 -

引用なし
パスワード
   ▼質問小僧 さん:

「別Book」に 先に提示しましたようなリストがあるとしますと、

>  A      B
>伝票No   管理番号
>1234    A00123
>1235    A00124
>1234    A01234
>1235    A01235
>1246    A01246
>1234    B1234

Sub Try1()
  Dim WS2 As Worksheet
  Dim v
  Dim dic As Object
  Dim sKey As String, ss As String
  Dim i As Long
  
  Set WS2 = Workbooks("別Book.xls").Worksheets(1)
  v = WS2.Range("A1").CurrentRegion.Value  '元のリストを配列に入れる
  Set dic = CreateObject("Scripting.Dictionary")
  For i = 1 To UBound(v)
    sKey = v(i, 1)             '伝票番号をキーとして
    If dic.Exists(sKey) Then        
      dic(sKey) = dic(sKey) & "," & v(i, 2)'管理番号をグループ化
    Else
      dic(sKey) = v(i, 2)
    End If
  Next
  WS2.Range("D1").Resize(dic.Count, 2).Value = _
    Application.Transpose(Array(dic.Keys, dic.Items))'集約後のリスト
    
  Set dic = Nothing
  Set WS2 = Nothing
      
End Sub

これを走らせると、同じシートの D列,E列に 伝票Noで
グループ化した(管理番号を集約した)あたらしいリスト
ができます。

--------------------------------
 D列    E列
伝票No  管理番号
1234   A00123,A01234,B1234
1235   A00124,A01235
1246   A01246

このあたらしいリストをどう使うかはあなた次第ですが、
VLOOKUPの検索範囲をこのあたらしいリストとすることもできます。

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