• ベストアンサー

エクセル このマクロはどこが間違っているのでしょうか。

いつもお世話になります。 エクセルで、別ファイルにある表の、同じ商品コードのデータをつなげようしています。 <開いている表;タイトルを除くと12行目から開始> 列V  ~  列AC 商品コード テキストデータ <別ファイルの表;タイトルを除くと20行目から開始> 列B  ~  列T 商品コード (空白)←このセルに、列ACのデータを入れたい 下記のマクロを作成し、実行してみたのですが、結果は、sh1のセル"T20"(=最初の行)にのみ値が入り、後は空白のままでした。 お手数をおかけしますが、修正箇所と、何が原因で、2行目以降に働かないのかを教えていただけますでしょうか。 Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Workbooks("Book1.xls").Worksheets("sheet1") Set sh2 = Workbooks(ThisWorkbook.Name).Worksheets("sheet2") l = 20 For m = 12 To 2012 Step 1 If sh2.Cells(m, "V") = sh1.Cells(l, "B") Then sh1.Cells(l, "T") = sh2.Cells(m, "AC") l = l + 1 End If Next m

質問者が選んだベストアンサー

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.3

こんにちは。maruru01です。 処理内容というのは、sh2の表から、sh1のB列の商品コードで検索して、対応するテキストデータをT列に表示させるということですよね。 なら、何故sh2の方だけでループを廻すのですか? 外のループがsh1で、内にsh2のループでは? しかし、そもそも処理内容の主旨からすれば、ループを廻して検索するのは大変非効率だと思います。 WorksheetFunctionオブジェクトで、Vlookup関数を使用するとか、Findメソッドで検索した方がいいと思いますよ。 とりあえず、Findメソッドによる方法です。 Dim sh1 As Worksheet Dim sh2 As Worksheet Dim i As Long Dim temp As Variant Set sh1 = Workbooks("Book1.xls").Worksheets("sheet1") Set sh2 = Workbooks(ThisWorkbook.Name).Worksheets("sheet2") For i = 20 To (sh1のB列の最下行数)   temp = sh2.Range("V12:V2012").Find(What:=sh1.Cells(i, 2).Value)   If Not temp Is Nothing Then     sh1.Cells(i, 20).Value = temp.Offset(0, 7).Value   End If Next i

7-samurai
質問者

お礼

大変な勘違いをしていたようで、お恥ずかしい・・・。 Findメソッドというのも、今回初めて知りました。 何故VLOOKUPを使わなかったかというと、別のシートにも、違う商品コードを集めた表があって、それも同じ行にデータをつなげたいので、VLOOKUPでは、前の文字が消えてしまうかと思ったからです。 (maruru01さんなら、空白行のみVLOOKUPをかけるなどの技も簡単に出来るんだろうなぁ~、と書きながら思っています。ちなみに、私のキャパに問題のある脳みそでは考えるのにパンクしてしまいそうです。) いただきました回答で、問題は解決しました。 ありがとうございました。

その他の回答 (2)

  • edomin
  • ベストアンサー率32% (327/1003)
回答No.2

シート1とシート2の中にあるデータの並び方は合っていますか? シート1の中のデータがシート2と逆順だと一番最後のデータしかコピーできないんじゃないですか?

7-samurai
質問者

お礼

いつもお世話になります。 ご指摘いただきました通り、このマクロだと、全く同じ商品コードで、並び順も同じものでないと意味がないですね。 処理内容の主旨が、「数も並びも違う商品コードを検索してデータを貼り付ける」というVLOOKUP関数に近いものだったので、Findメソッドを使う必要があるとの回答を、別の方からいただきました。 ありがとうございました。

  • pbforce
  • ベストアンサー率22% (379/1719)
回答No.1

I=20 For m = 12 To 2012 Step 1 If sh2.Cells(m, "V") = sh1.Cells(l, "B") Then sh1.Cells(l, "T") = sh2.Cells(m, "AC") l = l + 1 End If Next m 1) I=20 m=12 if sh2.Cells(12,"V")=sh1.cells(20,"B") Then sh1.cells(20,"T")=sh2.cells(12,"AC") 2) I=21 m=13 if sh2.Cells(13,"V")=sh1.cells(21,"B") Then sh1.cells(21,"T")=sh2.cells(13,"AC") 3) I=22 m=14 if sh2.Cells(14,"V")=sh1.cells(21,"B") Then sh1.cells(21,"T")=sh2.cells(14,"AC") ですが、おかしくないでしょうか? 1)で20行目と12行目を比較しています、 2)で21行目と13行目を比較しています、 3)で22行目と14行目を比較しています。 目的と合致していますか?

7-samurai
質問者

お礼

いつもお世話になります。 折角回答をいただいたのですが、私は大変な勘違いをしていて、そもそも最初に作っていたマクロがまったく目的と見当違いだったようです。申し訳ございませんでした。 処理内容の主旨が、「数も並びも違う商品コードを検索してデータを貼り付ける」というVLOOKUP関数に近いものだったので、Findメソッドを使う必要があるとの回答を、別の方からいただきました。 ありがとうございました。

関連するQ&A