Excel VBA質問箱 IV

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

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


857 / 13645 ツリー ←次へ | 前へ→

【77909】複数有る検索結果の横方向への表示方法について laihu 16/2/3(水) 9:41 質問[未読]
【77910】Re:複数有る検索結果の横方向への表示方法... 独覚 16/2/3(水) 9:52 発言[未読]
【77911】Re:複数有る検索結果の横方向への表示方法... laihu 16/2/4(木) 7:55 回答[未読]
【77913】Re:複数有る検索結果の横方向への表示方法... β 16/2/4(木) 10:14 発言[未読]
【77914】Re:複数有る検索結果の横方向への表示方法... laihu 16/2/4(木) 11:59 お礼[未読]

【77909】複数有る検索結果の横方向への表示方法に...
質問  laihu  - 16/2/3(水) 9:41 -

引用なし
パスワード
   こんにちは。
VBA初心者で自分なりに何度も試みているのですが
なかなかうまくいかないので教えて頂ければ幸いです。

Sheet1のA列(重複有り)の内、Sheet2のD列(重複無し)と値が一致するものを検索し、sheet1で値が一致した全ての行のB列の値を、順にSheet2の該当する行の、
E,F,G列に横方向に代入していくというものです。

言葉では説明しにくいので、下記のようなイメージでご理解頂けるでしょうか?
-----------------------------------------------------------------------
【マクロ実行前】
-----------------------------------------------------------------------
<Sheet1>

(A)  B   C   D   E
 イ  あ
 ロ  い
 イ  う
 ニ  え
 イ  お
-----------------------------------------------------------------------
<Sheet2>

A  B   C   (D)  E   F   G
          イ 
           ロ 
          ハ
          ニ 
          ホ
------------------------------------------------------------------------
【マクロ実行後】
-----------------------------------------------------------------------
<Sheet2>

A  B   C  (D)  E   F   G
          イ  あ  う  お
           ロ  い
          ハ
          ニ  え
          ホ
------------------------------------------------------------------------

Sheet1のA列、Sheet2のD列は毎回行数が変化するのでxlUpを使った変数として扱い、sheet2のE、F、G列についてはMAX3列ですので、変数を5to7とし、自分なりに作ってみたのですが、変数と繰り返し処理の指示に不慣れでうまくいきません。

説明不足な部分もあるかと思いますが、教えて頂ければとても助かります。

【77910】Re:複数有る検索結果の横方向への表示方...
発言  独覚  - 16/2/3(水) 9:52 -

引用なし
パスワード
   ▼laihu さん:
ワークシート関数で行う方法もありますがマクロのほうがいいでしょうか?

【77911】Re:複数有る検索結果の横方向への表示方...
回答  laihu  - 16/2/4(木) 7:55 -

引用なし
パスワード
   ワークシート関数で現在使用しておりますが、実際は行数が非常に多く、いちいち再計算にかなりの時間がかかります。
VBAであればそれを最小限に抑えることができるだろうと思っています。

因みに今は下記のような数式をSheet2の各セルに入れています。
もっと簡単な数式があれば是非教えてください。

<数式>(下記はSheet2のE2に入る数式です。)
{=IF($D2="","",IF(COUNTIF(Sheet1!$A:$A,$D2)<COLUMN(A1),"",INDEX(Sheet1!$B:$B,SMALL(IF(Sheet1!$A:$A=$D2,ROW($D:$D)),COLUMN(A1)))))}

【77913】Re:複数有る検索結果の横方向への表示方...
発言  β  - 16/2/4(木) 10:14 -

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

関数は独覚さんにおまかせし、VBA処理の一案です。

Sub Test()
  Dim dic As Object
  Dim c As Range
  
  Set dic = CreateObject("Scripting.Dictionary")
  Application.ScreenUpdating = False
  
  With Sheets("Sheet1")
    For Each c In .Range("A2", .Range("A" & Rows.Count).End(xlUp))
      If Not dic.exists(c.Value) Then Set dic(c.Value) = CreateObject("Scripting.Dictionary")
      dic(c.Value)(dic(c.Value).Count) = c.Offset(, 1).Value
    Next
  End With
  
  With Sheets("Sheet2")
    .Range("A1", .UsedRange).Offset(1, 4).ClearContents
    For Each c In .Range("D2", .Range("D" & Rows.Count).End(xlUp))
      If dic.exists(c.Value) Then c.Offset(, 1).Resize(, dic(c.Value).Count).Value = dic(c.Value).items
    Next
    .Select
  End With
  
End Sub

【77914】Re:複数有る検索結果の横方向への表示方...
お礼  laihu  - 16/2/4(木) 11:59 -

引用なし
パスワード
   ▼β さん:
早速試してみました。意図通りの結果が出ました。完璧です!
聞いてみるものですね。

自分でも理解できる様、これから勉強していきたいと思います。
今後とも宜しくお願い致します。

>▼laihu さん:
>
>関数は独覚さんにおまかせし、VBA処理の一案です。
>
>Sub Test()
>  Dim dic As Object
>  Dim c As Range
>  
>  Set dic = CreateObject("Scripting.Dictionary")
>  Application.ScreenUpdating = False
>  
>  With Sheets("Sheet1")
>    For Each c In .Range("A2", .Range("A" & Rows.Count).End(xlUp))
>      If Not dic.exists(c.Value) Then Set dic(c.Value) = CreateObject("Scripting.Dictionary")
>      dic(c.Value)(dic(c.Value).Count) = c.Offset(, 1).Value
>    Next
>  End With
>  
>  With Sheets("Sheet2")
>    .Range("A1", .UsedRange).Offset(1, 4).ClearContents
>    For Each c In .Range("D2", .Range("D" & Rows.Count).End(xlUp))
>      If dic.exists(c.Value) Then c.Offset(, 1).Resize(, dic(c.Value).Count).Value = dic(c.Value).items
>    Next
>    .Select
>  End With
>  
>End Sub

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