Excel VBA質問箱 IV

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

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


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

【7182】同一データの抽出について 乾燥肌 03/8/26(火) 1:13 質問
【7184】Re:同一データの抽出について INA 03/8/26(火) 8:21 回答
【7214】訂正させて頂きます。 乾燥肌 03/8/26(火) 19:46 回答
【7215】取り合えずこんな物でも? Hirofumi 03/8/26(火) 20:57 回答
【7256】ありがとうございました 乾燥肌 03/8/28(木) 1:36 お礼
【7260】Re:取り合えずこんな物でも? INA 03/8/28(木) 9:53 お礼

【7182】同一データの抽出について
質問  乾燥肌  - 03/8/26(火) 1:13 -

引用なし
パスワード
   はじめまして。
右も左も分からない初心者なのですが、仕事で急に
Excel VBAを使うハメになり、お力をお借りしたく
投稿させて頂きました。

今、Excelで2つのシートがあるのですが、
一つは社名(数字で表されています)、人名(数字で
表されています)、顧客コード(数字で表されていま
す)、そして購入品目(これは日本語です)が500件
くらい入っています(シートAとします)。
もう一つにも、違う日付での社名、人名、顧客コード
(こちらもすべて数字で表されています)、購入品目が
500件程入力されているのですが(こちらは
シートBとします)、この二つのシートを見て、
同一の者がいた場合、シートA(Bでもよいのですが)
の購入品目の隣に、違う日付で購入した品目(ここでは
Bに入力されている品目)を自動で入力していく
というマクロは組めるものでしょうか?
※「社名」の数字の小さいものから順に、また、
 次は「人名」の数字の小さいものから順に並んでいます
 ので、データを逆にみていく処理は必要ありませんし、
 同じ人間が同じシート内に2回出てくることもありません。
参考書を片手に頑張ってはみたのですが、どうも
よく分かりません。
Do 〜Loop という構文を使って作ってみたのですが、
上手く動きませんし・・・。

お力を貸して頂けたら幸いです。
よろしくお願いいたします。

【7184】Re:同一データの抽出について
回答  INA  - 03/8/26(火) 8:21 -

引用なし
パスワード
   シートの状態を掲載して頂けないでしょうか?

>今、Excelで2つのシートがあるのですが、
>一つは社名(数字で表されています)、人名(数字で
>表されています)、顧客コード(数字で表されていま
>す)、そして購入品目(これは日本語です)が500件
>くらい入っています(シートAとします)。

↓こんな感じで・・

  A   B   C       D
1 社名 人名 顧客コード  購入品目
2 123  456   789    パソコン
3 321  142   777    テレビ
4 :
5 :


>もう一つにも、違う日付での社名、人名、顧客コード
>(こちらもすべて数字で表されています)、購入品目が
>500件程入力されているのですが(こちらはシートBとします)
「違う日付での社名」とは何ですか?
上記同様【シートB】の状態を掲載願います。


>この二つのシートを見て、
>同一の者がいた場合、シートA(Bでもよいのですが)
「同一の者」の定義(条件)を説明して下さい。
A,B,C列が一致した場合?
「同一の者」だからB列だけ一致すればよいのかな?


>の購入品目の隣に、違う日付で購入した品目(ここでは
>Bに入力されている品目)を自動で入力していく
>というマクロは組めるものでしょうか?
「同一の者」という条件に合致した場合、
【シートA】のE列に【シートB】のD列(購入品目)の
値を代入すれば良いと言うことでしょうか?

>※「社名」の数字の小さいものから順に、また、
> 次は「人名」の数字の小さいものから順に並んでいます
> ので、データを逆にみていく処理は必要ありませんし、
> 同じ人間が同じシート内に2回出てくることもありません。
「同じ人間」とは、B列の「人名」のことですよね?

ご自分で作られた単語を使うときは、その単語の説明をお願い致します。
(例えば何列に、何行くらい、何形式(文字列、数値)で等々・・・)

【7214】訂正させて頂きます。
回答  乾燥肌  - 03/8/26(火) 19:46 -

引用なし
パスワード
   INA 様

お返事ありがとうございました。
解りにくい書き方をしてしまい、申し訳ありませんでした。
「初心者だから」という言い訳は通用しませんね。
相手に伝わらないような文書を書いているようでは
キチンとしたお返事を頂く資格もありません。
改めて訂正させて頂きます。

まず、シートの状態ですが、例を作って頂いた
状態、まさにそのままです。
>
>  A   B   C       D
>1 社名 人名 顧客コード  購入品目
>2 123  456   789    パソコン
>3 321  142   777    テレビ
>4 :
>5 :
>
次に、シートBですが、これはシートAと
まったく同じ様式で書かれた表で、例えば
>
>  A   B   C       D
>1 社名 人名 顧客コード  購入品目
>2 100  999   888    ラジカセ
>3 123  456   789    時計
>4 :
>5 :

というように、表のレイアウトは同じで、
内在するデータが違うシートということです。


「同一の者」の定義(条件)ですが、
A,B,C列がすべて一致した場合です。
上記の例ですと、シートAでパソコンを買い、
シートBで時計を買った者が、その「同一の者」
になります。


次に値の代入についてですが、
「同一の者」という条件に合致した場合、
シートBのE列にシートAのD列(購入品目)の
値を代入させたいのです。
例でいうと、
>  A   B   C       D     E
>1 社名 人名 顧客コード  購入品目 購入品目
>2 100  999   888    ラジカセ 
>3 123  456   789    時計    パソコン
>4 :
>5 :

というようになります。


同じ人間が同じシート内に2回出てくることはありません。
ここでいう「同じ人間」とは、先述のとおり、
A・B・C列がすべて合致した人間です。

以上の説明で、ご理解頂けましたでしょうか?
まだ説明不足な点がありましたら、ご指摘ください。

それでは、よろしくお願い致します。

【7215】取り合えずこんな物でも?
回答  Hirofumi E-MAIL  - 03/8/26(火) 20:57 -

引用なし
パスワード
   横から失礼します
取り合えず、速くないけどこんなかな?
社名、人名、顧客コードの最大桁数+1を、RowSearchの定数の設定して下さい
取り合えず、各4桁に設定してあります
時間が無かったので、Testを行っていません
上手く行かなかったらゴメン

以下を同一の標準モジュールに記述して下さい

Public Sub Test()

  Dim i As Long
  Dim vntData As Variant
  Dim rngScope As Range
  Dim lngFound As Long
  
  'シートAのデータを配列に取得
  With Worksheets("シートA")
    vntData = Range(.Cells(2, 1), _
          .Cells(65536, 4).End(xlUp)).Value
  End With
  
  'シートBを探索
  With Worksheets("シートB")
    '探索範囲を取得
    Set rngScope = Range(.Cells(2, 1), _
            .Cells(65536, 3).End(xlUp)).Value
    'シートAのデータの終りまで繰り返し
    For i = 1 To UBound(vntData, 1)
      '社名、人名、顧客コードをKeyに探索範囲より探索
      lngFound = RowSearch(vntData(i, 1), vntData(i, 2), _
                    vntData(i, 3), rngScope)
      'もし、Keyと同じ物が有った場合
      If lngFound <> -1 Then
        'E列にシートAのD列の値を代入
        .Cells(lngFound, 5).Value = vntData(i, 4)
      End If
    Next i
  End With
  
  Set rngScope = Nothing
  
End Sub

Private Function RowSearch(vntKey1 As Variant, _
                vntKey2 As Variant, _
                vntKey3 As Variant, _
                rngScope As Range) As Long

'  二進探索(複数探索Key)

  Dim lngLow As Long
  Dim lngHigh As Long
  Dim lngMiddle As Long
  Dim vntTmp As Variant
  Dim lngStartAdd As Long
  Dim vntKey As Variant
  
  Const lngLen1 As Long = 4 '社名の最大桁数+1
  Const lngLen2 As Long = 4 '人名の最大桁数+1
  Const lngLen3 As Long = 4 '顧客コードの最大桁数+1
  
  vntKey = Right(String(lngLen1, " ") & vntKey1, lngLen1) _
      & Right(String(lngLen2, " ") & vntKey2, lngLen2) _
      & Right(String(lngLen3, " ") & vntKey3, lngLen3)
  
  With rngScope
    lngStartAdd = .Row - 1
    lngLow = 1
    lngHigh = .Rows.Count
    Do While lngLow <= lngHigh
      lngMiddle = (lngLow + lngHigh) \ 2
      vntTmp = Right(String(lngLen1, " ") _
            & .Cells(lngMiddle, 1).Value, lngLen1) _
          & Right(String(lngLen2, " ") _
            & .Cells(lngMiddle, 2).Value, lngLen2) _
          & Right(String(lngLen3, " ") _
            & .Cells(lngMiddle, 3).Value, lngLen3)
      Select Case vntKey
        Case Is > vntTmp
          lngLow = lngMiddle + 1
        Case Is < vntTmp
          lngHigh = lngMiddle - 1
        Case Is = vntTmp
          lngLow = lngMiddle + 1
          lngHigh = lngMiddle - 1
      End Select
    Loop
  End With
  If lngLow = lngHigh + 2 Then
    RowSearch = lngStartAdd + lngMiddle
  Else
    RowSearch = -1
  End If

End Function

【7256】ありがとうございました
お礼  乾燥肌  - 03/8/28(木) 1:36 -

引用なし
パスワード
   Hirofumi様

どうもありがとうございました。
早速明日、会社のパソコンで使ってみようと思います。
今の私には読み解くのも難解ですが、
現在勉強中ですので、いずれはHirofimi様のように
質問に答えられるようになろうと思います。

それでは、また別の機会がありましたら、
よろしくお願いします。

【7260】Re:取り合えずこんな物でも?
お礼  INA  - 03/8/28(木) 9:53 -

引用なし
パスワード
   >Hirofumi 様
フォローありがとうございました。(_ _)

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