Excel VBA質問箱 IV

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

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


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

【68929】最後の値段を入れるには。。。 鼻子 11/4/28(木) 17:02 質問[未読]
【68930】Re:最後の値段を入れるには。。。 UO3 11/4/28(木) 17:38 回答[未読]
【68932】Re:最後の値段を入れるには。。。 kanabun 11/4/28(木) 19:35 発言[未読]

【68929】最後の値段を入れるには。。。
質問  鼻子  - 11/4/28(木) 17:02 -

引用なし
パスワード
   いつも御世話になっております。
またお願いします。

Sheet1にこのようなデータが入っております。

  A   B    C    D     E
1    3月    4月    5月    6月
2チョコ    280            
3キャンディ        150        
4ドーナツ    370        360    
5アイス        130        120

Sheet2にはこのような表があります。
  A   B
1    最新値段
2ドーナツ    
3キャンディ    
4アイス    
5チョコ    

Sheet2のBの列に最新の値段だけを以下のように商品別に入れるにはどのような式が必要ですか?
因みに商品の順番はバラバラでSheet1と合っていません。
  A   B
    最新値段
2ドーナツ     360
3キャンディ150
4アイス     120
5チョコ     280

よろしくお願いします。m(_ _)m

【68930】Re:最後の値段を入れるには。。。
回答  UO3  - 11/4/28(木) 17:38 -

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

もう少し軽く、Matchなんかをつかう方法もありますが、なにせ
ロジックが簡単になるので、バカチョンDictionaryで。

Sub Sample()
  Dim dic As Object
  Dim dKey As Variant
  Dim c As Range
  Dim p As Range
  
  Application.ScreenUpdating = False
  
  Set dic = CreateObject("Scripting.Dictionary")
  
  With Sheets("Sheet1")
    For Each c In .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
      Set p = .Cells(c.Row, .Columns.Count).End(xlToLeft)
      dic(c.Value) = p.Value
    Next
  End With
  
  With Sheets("Sheet2")
    For Each c In .Range("A2", .Range("A" & .Rows.Count).End(xlUp))
      c.Offset(, 1).Value = dic(c.Value)
    Next
  End With
  
  Set dic = Nothing
  Set p = Nothing

  Application.ScreenUpdating = True
    
End Sub

【68932】Re:最後の値段を入れるには。。。
発言  kanabun  - 11/4/28(木) 19:35 -

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

自分でやるなら やっぱ Dictionaryでしょうが、
もし(Dictionaryのしくみが分からないとかで)
Match関数で検索するなら、こんな風でしょうか。

Sub Match_Try()
 Dim r As Range
 Dim x As Long
 With Sheet1  '検索対象範囲を変数r に セット
   Set r = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
   x = .Columns.Count
 End With
 
 Dim i As Long
 Dim m, v
 Dim c As Range
 With Sheet2
   With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
     ReDim v(1 To .Count, 0)
     'Sheet2 A列の値が範囲rにあるか調べる
     For Each c In .Cells
       m = Application.Match(c.Value2, r, 0)
       i = i + 1
       If IsNumeric(m) Then
         'あったばあい、その行の一番右の値を配列にセット
         v(i, 0) = r(m, x).End(xlToLeft).Value
       End If
     Next
     .Offset(, 1).Value = v 'B列に 配列を貼り付ける
   End With
 End With
   
End Sub

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