• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセル 転記ループが上手くいきません)

エクセル転記ループが上手くいかない理由とは?

このQ&Aのポイント
  • シート2のA列とシート3のA列が一致した場合、シート2のB列の数値をシート3のB列に転記したいが、転記がされない。
  • 処理時間を短縮するために配列を使用したが、転記ができない原因は何か?
  • エクセルのVBAコードを使用して転記を試みたが、うまくいかない。なぜだろう?

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

こんばんは、参考に Sub Test()   Dim c As Range, myR As Variant   With Sheets("Sheet3")     For Each c In .Range("A1", .Cells(Rows.Count, "A").End(xlUp))       myR = Application.Match(c.Value, Sheets("Sheet2").Columns(1), 0)       If Not IsError(myR) Then         c.Offset(, 1).Value = Sheets("Sheet2").Cells(myR, "B").Value       End If     Next   End With End Sub

ww00771155
質問者

お礼

ループが一回! ありがとうございます。 やってみます!!

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.3

既定路線と違うのですが、勉強のために、参考までに書いてみます。 下記は、ソートとMatching法ですが、やってみてください。 まず両シートをキー(生徒番号=氏名コード)でソートする。 ソート後は下記データ例となるとする。 Sheet1は1学期成績 、SheetIIは2学期成績 とする。 ーー データ例 1学期成績 2学期成績 氏名コード 氏名 1学期点数 氏名コード 氏名 2学期点数 11 大内 23 41           11 大内 41 14 木村 33 45           14 木村 45 15 小池 48 51           15 小池 51 22 佐藤 29 43              21 鈴木 44 * 23 浦野 53 47     22佐藤 43 26 近藤 45 36     23浦野 47 28 前野 19 51     26近藤 36 33 田中 34 23     28前野 51 34 外島 65 38     33田中 23           34外島 38           44塚本 28 * Sheet1のD列に、2学期の成績を持ってきたものです。下記VBA実行後の状態です。レイアウト(列の左右位置)が崩れますがすみません。 ーーー 標準モジュールに Sub matching() Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") '--- lr1 = sh1.Range("A1000000").End(xlUp).Row MsgBox lr1 lr2 = sh2.Range("A1000000").End(xlUp).Row MsgBox lr2 '----ソート--Shee1------- 'sh1.Sort.SortFields.Clear 'sh1.Sort.SortFields.Add Key:=Range("A2"), _ ' SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal '----ソート--Shee2------- 'sh2.Sort.SortFields.Clear 'sh2.Sort.SortFields.Add Key:=Range("A2"), _ ' SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal '---データ終了サインに使う highval = 999999 '----初期値をセット i = 3: j = 3 '処理スタート行 keyA = sh1.Cells(i, "A") 'Aデータのスタート行をキー keyB = sh2.Cells(j, "A") 'Bデータのスタート行をキー '============キー比較====結果は3種類のどれか========== Comp: If keyA > keyB Then GoTo Heigh If keyA = keyB Then GoTo Equal If keyA < keyB Then GoTo Low '---keyA > keyB Heigh: MsgBox "HIGH" & keyA & "> " & keyB j = j + 1 If j > lr2 Then keyB = highval 'keyBE = "Y" Else keyB = sh2.Cells(j, "A") End If GoTo Comp '---keyA = keyB Equal: MsgBox "Equal" & keyA & " " & keyB If keyA = highval Then GoTo Endr '終了 '==========メイン処理=====key一致行での処理 sh1.Cells(i, "D") = sh2.Cells(j, "C") 'キーが等しいときの処理内容 '--- i = i + 1: j = j + 1 'A,Bとも次行データへ keyA = sh1.Cells(i, "A"): keyB = sh2.Cells(j, "A") GoTo Comp '---keyA < keyB Low: MsgBox "Low" & keyA & "< " & keyB i = i + 1 If i > lr1 Then keyA = highval 'keyAE = "Y" Else keyA = sh1.Cells(i, "A") End If GoTo Comp '--処理-終了 Endr: End Sub ーー 多いデータでやるときは ・ScreenUpdating=Falseを入れてください ・Msgboxは削除してください。 ーー 上記は、1学期の在級性のみ、データ合成の対象にしていますが、 2学期後の、転出生、転入生も残したリストにも(少しコードを修正すれば)できます。 その場合は、結果は、第3のSheetに書き出すようにするのがよいでしょう。 ==== 上記のやり方は、ソートに処理時間を、しわ寄せしてます。 ソートは、重要なコンピュター処理なので、素人のプログラムでやるのでなくて、各社とも工夫して、ユティリティを作っています。 またソートだけを、空いた時間に済ますこともできます。 上記のように、ソート後の、本件処理時間は、ワンパス(両シートの各行を1回読みだけ)なので、格別に早いと思います。 ーー Find法(同じキーのデータがどこにあるかをさがすプログラムを書く)は、処理時間がかかると思います。人間が手作業でやる場合の手順はこの方法でしょう。 ーー SQLなど、データベース言語を使う方法もあります。プロは、こちらの方法を取るのではないかな。

ww00771155
質問者

お礼

まだVBA初心者で、周りにも詳しい人がおらず、ネットで調べながら独学でやっているので、上記のような回答は勉強になりますし、ありがたいです!! 本当にありがとうございます!!

すると、全ての回答が全文表示されます。
  • f272
  • ベストアンサー率46% (8651/18505)
回答No.1

sheet2をMyArray1にコピーした sheet3をMyArray2にコピーした MyArray1の必要なところをMyArray2の適切な位置ににコピーした これだけでsheet3の内容が書き換わればびっくりです。 MyArray2をsheet3にコピーする を最後に付け加えればやりたいことができるでしょう。 Sheets("sheet3").Range("A1:B" & last2) = MyArray2

ww00771155
質問者

お礼

ありがとうございます。 If MyArray1(i, 1) = MyArray2(ii, 1) Then MyArray2(ii, 2) = MyArray1(i, 2) End If ここで、もしシート2のA列の数値とシート3のA列の数値が同じならばシート3にコピーするとやったつもりだったのですが…。 すみませんでした。 教えてもらった方法でやってみます。 ありがとうございました。

ww00771155
質問者

補足

遅くなりましたが、やってみました。 でも、最後に教えていただいた一文を加えても転記されませんでした・・。 何がいけないのか・・・。 すみませんが、別の方の回答でうまくいきましたので、そちらを参考にします。 ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A