Excel VBA質問箱 IV

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

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


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

【77575】マッチしたら指定範囲を別シートへコピー soul-taker 15/10/26(月) 16:25 質問[未読]
【77576】Re:マッチしたら指定範囲を別シートへコピー β 15/10/26(月) 19:16 発言[未読]
【77581】Re:マッチしたら指定範囲を別シートへコピー soul-taker 15/10/27(火) 8:23 発言[未読]
【77582】Re:マッチしたら指定範囲を別シートへコピー β 15/10/27(火) 8:52 発言[未読]
【77583】Re:マッチしたら指定範囲を別シートへコピー soul-taker 15/10/27(火) 14:53 お礼[未読]

【77575】マッチしたら指定範囲を別シートへコピー
質問  soul-taker  - 15/10/26(月) 16:25 -

引用なし
パスワード
   初めて投稿致します。
よろしくお願いします。

・sheetA
 「A5:I20」に文字データが入っています。
 (途中に空白列有り。最終行は月度によって変動。)

・sheetB
 「A5:A30」に文字データが入っています。
 (途中に空白列有り。最終行は月度によって変動。)

・sheetAの「A5」列と同じ値のものがsheetBの「A5」列内に
 あった場合、その同じ値の行の「C列からI列」をsheetA→
 sheetBにコピーする。
 (sheetAもsheetBも都度、最終行が変わるので、文字デー
  タの範囲が変わる。)
・できれば、途中で並べ替えの作業等や作業列の作成はしたく
 ない。

 <例>
  【sheetA】
       A  B  C D E F G H I
    5  0001    ○ あ     ○ か
    6  0006    ○ い
    7
    8  0035        ○ ○ ○ き
    9  0018    ○ う         ○
    ・
    ・
    19  0099        ○   ○
    20  0102    ○ え
 

  【sheetB】
    sheetBは、最初はA列のみにデータがあり、C〜
    I列は空白の状態。
    5行目、6行目、9行目が、それぞれsheetAの5行目
    6行目、8行目と同じなので、それぞれのsheetAの
    A列でマッチしたC列〜I列をsheetBのC列〜I
    列にコピーして、下記の結果としたい。

       A  B  C D E F G H I
    5  0001    ○ あ     ○ か
    6  0006    ○ い
    7  0042
    8
    9  0035        ○ ○ ○ き
    10  0051
    ・
    ・
    30  0099        ○   ○


これを下記のように記述したところ、うまくいかずに悩んでい
ます。

Dim r1 As Range, r2 As Range, c As Range
Dim m As Variant

Sheets(A).Select

With Worksheets(A)
  Set r2 = .Range("A5", .Cells(.Rows.Count, 1).End(xlUp))
End With
With Worksheets(B)
  Set r1 = .Range("A5", .Cells(.Rows.Count, 1).End(xlUp))
End With
 
For Each c In r1
  m = Application.Match(c.Value2, r2, 0)
  If IsNumeric(m) Then
    r2.Item(m, 3).Resize(, 7).Copy c.Item(1, 3)
  End If
Next

別のところで、うまくいっていた事例を移植したのですが、
(実のところ、中身がきちんと理解できていないので)どこ
がマズイのかが見つけられませんでした。

どなたか、ご助言いただけますと助かります。
何とぞ、よろしくお願い致します。

【77576】Re:マッチしたら指定範囲を別シートへコ...
発言  β  - 15/10/26(月) 19:16 -

引用なし
パスワード
   ▼soul-taker さん:

>これを下記のように記述したところ、うまくいかずに悩んでいます。

どううまくいかなかったのでしょう。

・マッチするはずなのに何も転記されなかった?
・実行したけどとちゅうで実行時エラーになった?
・実行まえにコンパイルエラーになった?

そのあたりを明確にしないと、回答側としては、悩んでしまいます。

Worksheets(A) や Worksheets(B)

この A や B は変数ですけど、どこかに定義されているのでしょうか?
で、その変数内には、あらかじめ シート名が格納されているのでしょうか?

もしかして シート名が "A" や "B" ということですか?

であれば

Worksheets("A") や Worksheets("B")

ですけど?

【77581】Re:マッチしたら指定範囲を別シートへコ...
発言  soul-taker  - 15/10/27(火) 8:23 -

引用なし
パスワード
   βさま

リアクションありがとうございます。

そうですね、記述が足りませんでした。
申し訳ありません。

うまくいかなかった現象は、まさに

・マッチするはずなのに何も転記されなかった

…です。

マクロ自体は、どこにも引っかかりませんでしたが、何も
記載されませんでした。

> Worksheets(A) や Worksheets(B)
>
> この A や B は変数ですけど、どこかに定義されているのでしょうか?
>で、その変数内には、あらかじめ シート名が格納されているのでしょうか?

→シート名は変数で、あらかじめ別途に格納されています。

以上、よろしくお願い致します。

【77582】Re:マッチしたら指定範囲を別シートへコ...
発言  β  - 15/10/27(火) 8:52 -

引用なし
パスワード
   ▼soul-taker さん:

Value2を使っておられるということから推測して
両シートのA列は、「数値」で、表示書式で 0001 等になっているんだと思います。

で、両シートのA列を提示の状態にして、提示コードそのまま
(AやBは変数宣言した上で、実際のシート名をそこに代入して)
実行しましたが、マッチしたものは、ちゃんと転記されます。

考えられるとすれば A や B に、目的のシート名ではないものが入っていて、
処理が別シートに対してなされている。

あるいは、一方のシートの A列は【数値】としての 0001 だけど、一方のシートのA列は
文字列としての '0001 。

このいずれかだと思うのですが?

なお、不具合とは関係ありませんが、マッチしなかった場合、当該転記領域をクリアするように
しておかれたらよろしいかと思います。

【77583】Re:マッチしたら指定範囲を別シートへコ...
お礼  soul-taker  - 15/10/27(火) 14:53 -

引用なし
パスワード
   βさま

ご助言、どうもありがとうございました。

A列が「実は数値に見える文字列」だった事に考えが至りませんでした。

(これを数値化して試してみましたが、結果的には両方のシートとも文字列
であれば、問題ない事も確認できました。)

あれこれと原因を探りまして、結局、「r1」、「r2」に格納した範囲と

> r2.Item(m, 3).Resize(, 7).Copy c.Item(1, 3)

で指定したセル位置のところで勘違いがあり、投稿したサンプルでは上手く
回るものが、実際のシートでは上手くいかない原因でした。

(上記の「3」がシート全体に対する絶対的な列番号だと勘違いしていました。
 「r2」の範囲での「3列目」であることに気づくのに時間がかかりました。)

お忙しい中お時間を割いていただき、誠にありがとうございました。
また何かありましたら、よろしくお願い致します。

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