

Excel2013、マクロで複数の動作を行いたいのですが、以下の部分のみ完成しません。
お知恵をお借りできれば幸いです。
・book1のB列に「123」等の登録番号が不特定行続いている
・book2のC列に上記の登録番号が使用日順に並んでいる。
使用毎に追加のため順番はバラバラ、同じ番号が何度も出てくる
↑
この状態で、B列の番号をC列の上から検索していって、同番号がヒットした一番最初の行ごと新規ブック(book3)にコピーし、
B列の次の番号を再度C列の上から検索していき、ヒットすればその行をbook3の下にコピーし……
という事をして行きたいです。
B列の番号は、C列で一度ヒット&コピーすれば、それ以降は検索せず次の番号へと移ります。
ここに至るまでの他マクロの動作は上手く行ったのですが、この部分のみ色々と調べてみても動作するものが出来上がりません。
どういった構文を使えばいいか等でもご教授頂ければ幸いです。
どうぞよろしくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
book1のB列にある登録番号がbook2のC列にあれば、その行を新規ブックにコピーしたいということですね。
ws1=Book1.xlsmのSheet1
ws2=Book2.xlsxのSheet1
ws3=新規ブックのSheet1
a=ws1の最終行番号
b=ws2の最終行番号
c=ws2の最終列番号(表全体の最終列番号を取得しています)
d=ws3の転記開始行番号
e=ws2のC列チェック数のカウンタ
としています。
新規ブックを開き、そのSheet1をws3とします。
まずws1のB列i行目をws2のC列j行目と総当たりで確認します。
ws1のB列i行目の値がws2のC列j行目と同じだったら
ws3のd行目にws2のj行A列からc列の値を転記します。
転記したらd=d+1(次に転記する行)とし
ループを終了して、次に進みます。
同じでなかったらe=e+1とし、見つからなかった時には
ws1.Cells(i, "B").Value & "が見つかりません"と表示し、
次に進みます。
Sub test()
Dim a, b, c, d, e, i As Long, j As Long
Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
Set ws1 = Workbooks("Book1.xlsm").Worksheets("Sheet1")
Set ws2 = Workbooks("Book2.xlsx").Worksheets("Sheet1")
a = ws1.Cells(Rows.Count, "B").End(xlUp).Row
b = ws2.Cells(Rows.Count, "C").End(xlUp).Row
c = ws2.Range("A1").CurrentRegion.Columns.Count
d = 1
Workbooks.Add
Set ws3 = ActiveWorkbook.Worksheets("Sheet1")
ws1.Activate
For i = 2 To a
e = 0
For j = 2 To b
If ws1.Cells(i, "B").Value = ws2.Cells(j, "C").Value Then
ws3.Cells(d, "A").Resize(1, c).Value = ws2.Cells(j, "A").Resize(1, c).Value
d = d + 1
Exit For
Else
e = e + 1
End If
Next j
If e = b - 1 Then
MsgBox ws1.Cells(i, "B").Value & "が見つかりません", vbExclamation
End If
Next i
End Sub
No.1
- 回答日時:
こんばんは。
>・book2のC列に上記の登録番号が使用日順に並んでいる。
このC列の重複を取り去れば、それで、そのままつかえないでしょうか。Book3 に貼り付けてもよいのではありませんか?
データ・タブのデータツールの重複の削除の記録マクロを使うか、マクロのDictionary Objectで、重複を取り去ってしまうか、それだけなのですが、それを、book1との照合をするとか必要なのですか。
もし、照合を必要とする場合は、やり方をまったく変えて、
>B列の番号をC列の上から検索していって、
というのは、B列に重複がないという前提ですが、その上で、C列に現れていないものは、リストには省くものが出てくるのでしょうか。
そうすると、ちょっと複雑だなって思います。
ワークシート関数のCountIfで、Book2 のC列を検索して、C列に登場しないものを拾わず、そのまとまったものを、Book3 に貼り付けるという方法を考えました。
'照合を必要とする場合
Sub CheckNumberList()
Dim rng1 As Range
Dim rng2 As Range
Dim Ary() As Variant
Dim i As Long, j As Long, c
With ThisWorkbook.Worksheets("Sheet1") 'BookA のSheet1
Set rng1 = .Range("B1", .Cells(Rows.Count, "B").End(xlUp))
End With
With Workbooks("BookC.xlsx").Worksheets("Sheet1")
Set rng2 = .Range("C1", .Cells(Rows.Count, "C").End(xlUp))
End With
For Each c In rng1
If WorksheetFunction.CountIf(rng2, c.Value) > 0 Then
ReDim Preserve Ary(i)
Ary(i) = c.Value
i = i + 1
End If
Next c
If i = 0 Then
MsgBox "番号を収録できませんでした。", vbExclamation
Exit Sub
End If
Workbooks.Add '新規ブック
ActiveWorkbook.ActiveSheet.Range("A1").Resize(i).Value = Application.Transpose(Ary)
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBA 2 2022/04/27 13:29
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) Excelの列から検索して該当する行を別シートに転記するVBA 2 2022/12/20 09:35
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- Access(アクセス) Accessのクエリの結果を、既存のエクセルに追加したい 2 2022/07/31 22:44
- Visual Basic(VBA) 2つのシートの任意のセルの番号が一致したら、一致した行をコピーする VBA 2 2023/06/19 20:48
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
このQ&Aを見た人はこんなQ&Aも見ています
-
Exel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について
Visual Basic(VBA)
-
VBA 別ブックから条件に合うものを転記したいです
Visual Basic(VBA)
-
【VBA】特定の値が入った行をコピーして別シートに貼り付ける方法をおしえていただきたいです。
Excel(エクセル)
-
-
4
VBA 値と一致した行の一部の列のデータを転記について教えてください
Visual Basic(VBA)
-
5
vba 2つの条件が一致したらコピーして別シートに値のみ貼り付け
Visual Basic(VBA)
-
6
エクセル vba ある検索値を別ブックから参照し一致したすべての行で特定の列の値を返す
Visual Basic(VBA)
-
7
VBA 別ブックからコピペしたいのですが、軽くしたいです
Visual Basic(VBA)
-
8
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
9
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
10
【VBA】2つのシートの値を比較して条件一致したら、同じ行の隣の値を別ブックへ転記したいです。 VB
Visual Basic(VBA)
-
11
マクロボタンを押すと、ファイル名を“日付(年月日)_文字.xlsx”にして指定ファイルに保存したいの
Excel(エクセル)
-
12
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
13
VBAを使って検索したセルをコピーして別の場所に貼り付ける。
Visual Basic(VBA)
-
14
別ファイルから重複するデータを探したい【エクセル】
Excel(エクセル)
-
15
VBA 条件が一致した場合のみコピーする
その他(ビジネス・キャリア)
-
16
「選択範囲を解除してアクティブセルを選択」をマクロで行うにはどうすればよいでしょうか
Excel(エクセル)
-
17
【ExcelVBA】マクロの入ったシートをコピーしても新しいシート内でマクロを動作させるには?
Excel(エクセル)
-
18
特定の文字列が含まれている行のみ抜き出して、別シートに書き出す方法(Excel 2007)
Excel(エクセル)
-
19
連続する複数のセル値がすべて0であることを判定するマクロ
Visual Basic(VBA)
-
20
別ブックをダイアログボックスで指定してそこにあるシートをコピーしたい
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「段」と「行」の違いがよくわ...
-
エクセルで離れた列を選択して...
-
VLOOKUPの列番号の最大は?
-
エクセル マクロ 範囲指定で...
-
VBAで別ブックの列を検索し、該...
-
列方向、行方向の定義
-
Excelの行数、列数を増やしたい...
-
(VBA)Excelの特定の範囲にデー...
-
VBA 指定した列にある日時デー...
-
LEFT関数とIF関数の組み合わせ...
-
エクセル 1つのシートを日付で...
-
エクセル マクロ 範囲の値を上...
-
最近急にVBAの処理速度が遅くな...
-
VBA Splitで「引数の数が一致...
-
Excelの列から検索して該当する...
-
エクセルマクロ
-
Excel 2007で複合グラフ(折線...
-
Excel 区切り位置指定ウィザー...
-
Excel文字列一括変換
-
土日の列幅の自動変更を教えて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「段」と「行」の違いがよくわ...
-
エクセルで離れた列を選択して...
-
LEFT関数とIF関数の組み合わせ...
-
VLOOKUPの列番号の最大は?
-
VBA 指定した列にある日時デー...
-
Excelの行数、列数を増やしたい...
-
エクセルのソートで、数字より...
-
列方向、行方向の定義
-
VBAで別ブックの列を検索し、該...
-
エクセル マクロ 範囲指定で...
-
CSVファイルの「0落ち」にVBA
-
エクセルマクロPrivate Subを複...
-
エクセルで最初の行や列を開け...
-
最近急にVBAの処理速度が遅くな...
-
VBA
-
Excel文字列一括変換
-
エクセルで複数列の検索をマク...
-
エクセル マクロ 範囲の値を上...
-
横軸を日付・時間とするグラフ化
-
Alt+Shift+↑を一括で行うには、...
おすすめ情報
ご回答ありがとうございます。
大変申し訳ありません、説明が不足しておりました。
>>・book2のC列に上記の登録番号が使用日順に並んでいる。
>このC列の重複を取り去れば、それで、そのままつかえないでしょうか。
↑
book1B列の登録番号種類数=book2C列の登録番号種類数となっておりません。
book2の方が原本で、book1はそのうちの幾つかを抜き出し、「このbook1内にある登録番号の最新使用日を調べろ」という命令での作業といった感覚になります。
>B列に重複がないという前提ですが、その上で、C列に現れていないものは、リストには省くものが出てくるのでしょうか。
B列に重複はございません。基本的にはB列にある番号はC列にありますが、人ごく稀にB列にありC列に無い番号が出ます。
実際のマクロまで提示して頂き、誠にありがとうございます。こちらを一度組み込んでみたく思います。