Excel VBA質問箱 IV

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

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


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

【50080】商品管理、検索の方法 tk 07/7/8(日) 8:31 質問[未読]
【50082】Re:商品管理、検索の方法 かみちゃん 07/7/8(日) 9:11 発言[未読]
【50111】Re:商品管理、検索の方法 tk 07/7/9(月) 21:50 質問[未読]
【50112】Re:商品管理、検索の方法 かみちゃん 07/7/9(月) 22:07 発言[未読]

【50080】商品管理、検索の方法
質問  tk  - 07/7/8(日) 8:31 -

引用なし
パスワード
   はじめまして。

1つのブックにシートを2つ作って商品の管理をしようと考えています。

・シート1に作成日(A列)と番号(B列)を入力
・シート2に品名(A列、入力済み)、番号(B列)、作成日(C列)を更新
シート1のB列の値がシート2のB列で検索できたら(重複はない)A列の値をシート2のC列に上書きする。B列の値がシート2で存在しなければ、Msgboxを出す。

以上のプログラムを作りたいのですが初心者なもので教えていただけると幸いです。
よろしくお願いします。

【50082】Re:商品管理、検索の方法
発言  かみちゃん  - 07/7/8(日) 9:11 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>・シート1に作成日(A列)と番号(B列)を入力
>・シート2に品名(A列、入力済み)、番号(B列)、作成日(C列)を更新
>シート1のB列の値がシート2のB列で検索できたら(重複はない)A列の値をシート2のC列に上書きする。B列の値がシート2で存在しなければ、Msgboxを出す。

とりあえず、ワークシート関数であるMatch関数をVBAで使うことで、検索結果の
行を取得します。

以下のコードは、Sheet1のB1セルの値を検索するものです。

Sub Sample()
 Dim c As Range
 Dim lngRow As Long
 
 With Sheets("Sheet1").Range("B1")
  lngRow = 0
  On Error Resume Next
  lngRow = Application.Match(.Value, Sheets("Sheet2").Columns("B"), 0)
  On Error GoTo 0
  If lngRow > 0 Then
   Sheets("Sheet2").Cells(lngRow, 3).Value = .Offset(, -1).Value
  Else
   MsgBox "番号なし" & .Value
  End If
 End With
End Sub

これをヒントにでもして、ご自分で少し考えてみてください。
Sheet1のB列のセルすべてを処理するためには、上記のコードに、
For 〜 Next などの繰り返し処理を加えることになります。
繰り返し処理の方法は、過去ログにヒントがたくさんありますので、検索してみる
のもいいかもしれません。

【50111】Re:商品管理、検索の方法
質問  tk  - 07/7/9(月) 21:50 -

引用なし
パスワード
   返信ありがとうございます。

>とりあえず、ワークシート関数であるMatch関数をVBAで使うことで、検索結果の
>行を取得します。
>
>以下のコードは、Sheet1のB1セルの値を検索するものです。
>
>Sub Sample()
> Dim c As Range
> Dim lngRow As Long
> 
> With Sheets("Sheet1").Range("B1")
>  lngRow = 0
>  On Error Resume Next
>  lngRow = Application.Match(.Value, Sheets("Sheet2").Columns("B"), 0)
>  On Error GoTo 0
>  If lngRow > 0 Then
>   Sheets("Sheet2").Cells(lngRow, 3).Value = .Offset(, -1).Value
>  Else
>   MsgBox "番号なし" & .Value
>  End If
> End With
>End Sub
>
>これをヒントにでもして、ご自分で少し考えてみてください。
>Sheet1のB列のセルすべてを処理するためには、上記のコードに、
>For 〜 Next などの繰り返し処理を加えることになります。
>繰り返し処理の方法は、過去ログにヒントがたくさんありますので、検索してみる
>のもいいかもしれません。


アドバイスいただいたように考えてみたのですが、

(省略)
Dim RR As Long
Dim Rmax As Long

Rmax = Sheets("Sheet1").Range("B65536").End(xlUp).Row
For RR = 2 To Rmax

With Sheets("Sheet1")
lngRow = 0
On Error Resume Next
lngRow = Application.Match(Cells(RR, 2).Value, Sheets("Sheet2").Columns("B"), 0)
On Error GoTo 0

If lngRow > 0 Then
 Sheets("Sheet2").Cells(lngRow, 3).Value = .Offset(RR, -1).Value
Else
 MsgBox "番号なし" & .Value
End If
End With
Next
End Sub

以上でやるとif文を実行せず、全てElse以降に進んでしまうようなのです。
(Sheet1のB列のセルに数個データがあるとして、完全に一致しているデータがあっても書き換えられず、全て「番号なし」のメッセージが表示されます。)

本を見ながらの初心者なので教えていただければと思います。

【50112】Re:商品管理、検索の方法
発言  かみちゃん  - 07/7/9(月) 22:07 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>(Sheet1のB列のセルに数個データがあるとして、完全に一致しているデータがあ
> っても書き換えられず、全て「番号なし」のメッセージが表示されます。)

考えられることとして、Sheet1のB列とSheet2のB列のデータ型が一致していない
のではないかと思います。

また、このコードのままだと、Sheet1をアクティブにした状態で処理しないと誤動作をします。

それとも、以下のコードの記述が私が提示したものと違いますし、おかしいです。
With Sheets("Sheet1")
 lngRow = 0
 On Error Resume Next
 lngRow = Application.Match(Cells(RR, 2).Value, Sheets("Sheet2").Columns("B"), 0)
 On Error GoTo 0

 If lngRow > 0 Then
  Sheets("Sheet2").Cells(lngRow, 3).Value = .Offset(RR, -1).Value


With Sheets("Sheet1")
は、
With Sheets("Sheet1").Cells(RR, 2)

Cells(RR, 2).Value

.Value

.Offset(RR, -1).Value
は、
.Offset(, -1).Value
とご提示させていただいたのですが、なぜ記述を修正したのでしょうか?

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