Excel VBA質問箱 IV

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

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


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

【63708】配列について かお 09/12/2(水) 10:37 質問[未読]
【63709】Re:配列について Hirofumi 09/12/2(水) 11:42 回答[未読]
【63710】Re:配列について かお 09/12/2(水) 13:56 発言[未読]
【63711】Re:配列について Hirofumi 09/12/2(水) 14:27 回答[未読]
【63723】Re:配列について かお 09/12/3(木) 13:37 お礼[未読]

【63708】配列について
質問  かお  - 09/12/2(水) 10:37 -

引用なし
パスワード
   どうしても分からなくて困っています
どなたかアドバイスをいただけるとうれしいです

ブック1のSheet1とブック2のSheet1があり、Sheet1のリストに載っている情報を
ブック2のSheet1に記載したいのですが、どうしてもうまくいきません

【Sheet1】
A列    B列    C列   D列
123    A     T    A5000 
123    B     T    A5700
456    A     F    A6000
567    C     F    45600
567    D     G    A5000
897    A     R    A6000
888    A     T    E5000

上記のデータをA列をキーにして、B列D列の情報を
下記のSheet2へ記載したいのです
【ブック1のSheet1】のA列のキーが重複している場合は、一番初めに現れた値を摘要します

【ブック2のSheet1】
A列    B列    C列 
111   
145   
456    A     A6000 ←Sheet1のデータB列D列のデータをB列C列に記載
567    C     45600 ←Sheet1のデータB列D列のデータをB列C列に記載
567    C     45600 ←Sheet1のデータB列D列のデータをB列C列に記載
897    A     A6000 ←Sheet1のデータB列D列のデータをB列C列に記載
888    A     E5000 ←Sheet1のデータB列D列のデータをB列C列に記載
456   
567   
123    A     A5000 ←Sheet1のデータB列D列のデータをB列C列に記載
123    A     A5000 ←Sheet1のデータB列D列のデータをB列C列に記載

Dim MyD As Object, i As Long, TBL
Dim MyVal, MyKey, MyItem, MyVal2

Set MyD = CreateObject("scripting.dictionary")

TBL = Range("A2", Range("A" & Rows.Count).End(xlUp)).Resize(, 4).Value
  For i = 1 To UBound(TBL, 1)
    MyVal = TBL(i, 2) & "_" & TBL(i, 4)
    If Not TBL(i, 1) = Empty Then
     If Not MyD.exists(TBL(i, 1)) Then
       MyD.Add TBL(i, 1), MyVal
     End If
    End If
   
  Next i
↑ここまで、配列に格納

↓ここから、よく分かりません
    MyKey = MyD.keys
    MyItem = MyD.items
 
  ThisWorkbook.Activate
  For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
       
    If MyKey(i).exists(Cells(i, 1)) Then
      MyVal2 = Split(MyItem(i), "_")
      Range("B" & i).Value = MyVal2(0)
      Range("C" & i).Value = MyVal2(1)
    End If
  Next i

どうかよろしくお願いします

【63709】Re:配列について
回答  Hirofumi  - 09/12/2(水) 11:42 -

引用なし
パスワード
   こんなのでは?

Option Explicit

Public Sub Test_2()
 
  Dim MyD As Object
  Dim i As Long
  Dim TBL As Variant
  Dim MyVal As Variant
  Dim MyKey As Variant
'  Dim MyItem As Variant
'  Dim MyVal2 As Variant
  
  'Dictionaryのインスタンスを取得
  Set MyD = CreateObject("Scripting.Dictionary")
  
  With Workbooks("ブック1.xls").Worksheets("Sheet1")
    '"ブック1.xls"のSheet1のA2:Dnまでを配列に取得
    TBL = .Range(.Range("A2"), .Range("A" & Rows.Count).End(xlUp)).Resize(, 4).Value
    '配列先頭行〜最終行まで繰り返し
    For i = 1 To UBound(TBL, 1)
'      MyVal = TBL(i, 2) & "_" & TBL(i, 4)
      If Not TBL(i, 1) = Empty Then
        If Not MyD.Exists(TBL(i, 1)) Then
          'B列、C列を配列に代入
          MyVal = Array(TBL(i, 2), TBL(i, 4))
          'Dictionaryに登録
          MyD.Add TBL(i, 1), MyVal
        End If
      End If
    Next i
  End With
  '↑ここまで、配列に格納

  '↓ここから、よく分かりません
'  MyKey = MyD.keys
'  MyItem = MyD.items
  
'  ThisWorkbook.Activate
'  With ThisWorkbook.Worksheets("Sheet1")
  With Workbooks("ブック2.xls").Worksheets("Sheet1")
    For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row
      MyKey = .Cells(i, 1).Value
      If MyD.Exists(MyKey) Then
'        MyVal2 = Split(MyItem(i), "_")
'        Range("B" & i).Value = MyVal2(0)
'        Range("C" & i).Value = MyVal2(1)
        .Cells(i, 2).Resize(, 2).Value = MyD.Item(MyKey)
      End If
    Next i
  End With
  
End Sub

【63710】Re:配列について
発言  かお  - 09/12/2(水) 13:56 -

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

ありがとうございました
お蔭様で解決しました。
一つだけお聞きしたいのですが、
下記のコードで、
   .Cells(i, 2).Resize(, 2).Value = MyD.Item(MyKey)
の部分ですが、今回は隣同士の列だったので、Resizeで、できましたが、
もし、入力する列がB列とD列といったように、離れていたら、
どんなふうに処理をすればよいのでしょうか?
そういうことも今後出てくる予定ですので、よかったら、
アドバイス下さい

>  With Workbooks("ブック2.xls").Worksheets("Sheet1")
>    For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row
>      MyKey = .Cells(i, 1).Value
>      If MyD.Exists(MyKey) Then
>        .Cells(i, 2).Resize(, 2).Value = MyD.Item(MyKey)
>      End If
>    Next i
>  End With


お願いします

【63711】Re:配列について
回答  Hirofumi  - 09/12/2(水) 14:27 -

引用なし
パスワード
   こんなのでは?

Public Sub Test_3()
 
  Dim MyD As Object
  Dim i As Long
  Dim TBL As Variant
  Dim MyVal As Variant
  Dim MyKey As Variant
  
  'Dictionaryのインスタンスを取得
  Set MyD = CreateObject("Scripting.Dictionary")
  
  With Workbooks("ブック1.xls").Worksheets("Sheet1")
    '"ブック1.xls"のSheet1のA2:Dnまでを配列に取得
    TBL = .Range(.Range("A2"), .Range("A" & Rows.Count).End(xlUp)).Resize(, 4).Value
    '配列先頭行〜最終行まで繰り返し
    For i = 1 To UBound(TBL, 1)
      If Not TBL(i, 1) = Empty Then
        If Not MyD.Exists(TBL(i, 1)) Then
          'B列、C列を配列に代入
          MyVal = Array(TBL(i, 2), TBL(i, 4))
          'Dictionaryに登録
          MyD.Add TBL(i, 1), MyVal
        End If
      End If
    Next i
  End With
  
'  With ThisWorkbook.Worksheets("Sheet1")
  With Workbooks("ブック2.xls").Worksheets("Sheet1")
    For i = 1 To .Range("A" & Rows.Count).End(xlUp).Row
      MyKey = .Cells(i, 1).Value
      If MyD.Exists(MyKey) Then
        'DictionaryのItemをVariant型の変数に戻す
        MyVal = MyD.Item(MyKey)
        .Cells(i, 1).Offset(, 1).Value = MyVal(0)
        .Cells(i, 1).Offset(, 3).Value = MyVal(1)
      End If
    Next i
  End With
  
End Sub

【63723】Re:配列について
お礼  かお  - 09/12/3(木) 13:37 -

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

ありがとうございました

この方法で試してみます

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