Excel VBA質問箱 IV

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

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


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

【81825】dictionaryの使い方で質問(その2) 煮詰まった 21/6/17(木) 18:54 質問[未読]
【81826】Re:dictionaryの使い方で質問(その2) マナ 21/6/17(木) 21:30 発言[未読]
【81831】Re:dictionaryの使い方で質問(その2) 煮詰まった 21/6/18(金) 9:24 お礼[未読]
【81828】Re:dictionaryの使い方で質問(その2) マナ 21/6/17(木) 22:32 発言[未読]
【81830】Re:dictionaryの使い方で質問(その2) 煮詰まった 21/6/18(金) 9:18 質問[未読]
【81829】Re:dictionaryの使い方で質問(その2) マナ 21/6/17(木) 22:55 発言[未読]

【81825】dictionaryの使い方で質問(その2)
質問  煮詰まった  - 21/6/17(木) 18:54 -

引用なし
パスワード
   元シートは以下
商品名
a1
a2
a3
a4
a5

先シートは以下
商品名    価格    価格2
a2    100    200
a3    110    220
a4    120    240

元シートに先シートの商品名をキーに価格、価格2を取り込もうとした場合に

元シートに商品名のキーはあるが
先シートに商品名のキーがない場合の回避方法教えてください。


    For m = 1 To UBound(c1) '検索用配列の要素数分ループ
    
     
      Keyval = c1(m, 1)
      
        c1(m, 2) = myDic.Item(Keyval)(0) '検索値のKeyでItemを抽出
        c1(m, 3) = myDic.Item(Keyval)(1) '検索値のKeyでItemを抽出
    
        ここにで元シートに商品キーがあるが先シートに商品
        キーがない場合を教えてください。    
    Next m


Sub Sample2()

    
    Dim c1 As Variant
    Dim c2 As Variant
    
    
    Dim Keyval   As String
    Dim ItemVal   As Variant
    Dim ItemVal1   As String
    Dim ItemVal2   As String
    
    Dim MaxRow   As Long
    Dim n      As Long
    Dim m      As Long
    
    Dim myDic    As Object


    Windows("サンプル2.xlsm").Activate
    Sheets("元").Select
    Range("A1").Select
    c1 = Range("A1:C9")

    
    Windows("サンプル2.xlsm").Activate
    Sheets("先").Select
    Range("A1").Select
    c2 = Range("A1:C9")


    Set myDic = CreateObject("Scripting.Dictionary")
    
    For n = 1 To UBound(c2) '参照用の配列を要素数分ループ
              
      Keyval = c2(n, 1) '3.Keyを格納
      ItemVal1 = c2(n, 2) '4.Itemを格納
      ItemVal2 = c2(n, 3) '4.Itemを格納
      
      ItemVal = Array(ItemVal1, ItemVal2)
      
      
      '登録されていなければ登録
      '※Dictionaryは重複登録出来ない
      '今回のサンプルデータは初めから重複はありません。
      If Not myDic.Exists(Keyval) Then
      
        myDic.Add Keyval, ItemVal
        
      End If
      
    Next n
    
    For m = 1 To UBound(c1) '検索用配列の要素数分ループ
    
     
      Keyval = c1(m, 1)
      
        c1(m, 2) = myDic.Item(Keyval)(0) '検索値のKeyでItemを抽出
        c1(m, 3) = myDic.Item(Keyval)(1) '検索値のKeyでItemを抽出
    
    
    Next m
    
    
    Windows("サンプル2.xlsm").Activate
    Sheets("元").Select
    Range("A1").Select
    Range("A1:C9") = c1
    
    
    Set myDic = Nothing
    
    Set c1 = Nothing
    Set c2 = Nothing
    
  
  End Sub

【81826】Re:dictionaryの使い方で質問(その2)
発言  マナ  - 21/6/17(木) 21:30 -

引用なし
パスワード
   ▼煮詰まった さん:

If myDic.Exists(Keyval) Then

では?

【81828】Re:dictionaryの使い方で質問(その2)
発言  マナ  - 21/6/17(木) 22:32 -

引用なし
パスワード
   ▼煮詰まった さん:

>      If Not myDic.Exists(Keyval) Then     
>        myDic.Add Keyval, ItemVal       
>      End If

こうすれば、重複キーでもエラーにならなので
1行でOKです。

myDic(Keyval) = ItemVal


>

【81829】Re:dictionaryの使い方で質問(その2)
発言  マナ  - 21/6/17(木) 22:55 -

引用なし
パスワード
   ▼煮詰まった さん:

dictionaryには行番号を登録するのもありと思います。

Sub test()
  Dim dic As Object
  Dim r1 As Range, r2 As Range
  Dim v1, v2
  Dim k As Long, n As Long
  
  Set dic = CreateObject("scripting.dictionary")
  
  With Workbooks("サンプル2.xlsm")
    Set r1 = .Sheets("元").Range("A1:C9")
    Set r2 = .Sheets("先").Range("A1:C9")
  End With
  
  v1 = r1.Value
  v2 = r2.Value

  For k = 1 To UBound(v2)
    dic(v2(k, 1)) = k
  Next
  
  For k = 1 To UBound(v1)
    If dic.exists(v1(k, 1)) Then
      n = dic(v1(k, 1))
      v1(k, 2) = v2(n, 2)
      v1(k, 3) = v2(n, 3)
    End If
  Next
 
  r1.Value = v1

End Sub

【81830】Re:dictionaryの使い方で質問(その2)
質問  煮詰まった  - 21/6/18(金) 9:18 -

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

    For m = 1 To UBound(c1) '検索用配列の要素数分ループ
    

      Keyval = c1(m, 1)
      ''myDic(Keyval) = ItemVal

        c1(m, 2) = myDic.Item(Keyval)(0) '検索値のKeyでItemを抽出
        c1(m, 3) = myDic.Item(Keyval)(1) '検索値のKeyでItemを抽出
    
      ''End If
    
    Next m

    いろいろ説明ありがとうございました。
     
    上記の処理で元に商品キーはあるが先に商品キーがない場合
    型が一致しないのエラーがでるのでこの回避方法教えてください。

【81831】Re:dictionaryの使い方で質問(その2)
お礼  煮詰まった  - 21/6/18(金) 9:24 -

引用なし
パスワード
   ▼マナ さん:
>▼煮詰まった さん:
>
>If myDic.Exists(Keyval) Then
>
>では?

この記述で対応することができることわかりました。
ありがとうございました。

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