質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

2191閲覧

【VBA】検索した条件のセル(複数)を別のブックに転記したい

zazabi

総合スコア24

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2020/03/24 07:36

繰り返し処理のコードが色々あるようで、どれが適切かわからないのでアドバイスをお願いします。
中途半端にコードを掲載しますが、ここまでできているという目安でお願いします……。

######環境
Excel(バージョン1910(ビルド 12130.20410))
######概要
別ブックの.csvファイルからA列の特定文字列を含んだ複数のセルを転記したい。
#####詳細
※転記元ファイル(.csvファイル)と転記先ファイルを開いた状態
※コピペしたいセルはA列に点在するため、範囲でのコピーは不可
1.転記先の「開始セル」セルを文字列検索する
2.上記の1つ下の座標を取得する
3.転記元ファイルで文字列検索(部分一致)をする
4.一致したセルをコピーする
5.転記先開始セルにペーストする
6.転記先セルを下にずらす
7.手順2~6を繰り返す
8.合致する全ての転記が終わったら終了する
#####コード

vba

1'変数 2Option Explicit 3Sub sample() 4 '「転記先」のシート1を変数に格納 5 Dim book As Workbook 6 Set book = Workbooks("転記先.xlsm") 7 Dim sheet, csvsheet As Worksheet 8 Set sheet = Workbooks("転記先.xlsm").Worksheets(1) 9 10 'csvファイルを転記するための変数 11 Dim csv_wb, csvname As Workbook 'ワークブック固有拡張子 12 Dim OpenFilename, csv As String 13 14 'OpenFilename:csvを開くための変数 15 'csv:csvファイル_拡張子付き 16 'csvname:csvの名前 17 'csvsheet:csvのシート名 18 19 '繰り返し処理の変数 20 Dim damy1 As Range 21 Dim damy1_ad, damy1_v As String 22 23 24'転記元の.csvファイルを開くコードは正常なため、割愛 25 26'シート1で「開始セル」を検索(完全一致) 27 Set damy1 = sheet.Cells.Find(What:="開始セル", lookat:=xlWhole) 28 If Not damy1 Is Nothing Then 29 damy1_ad = damy1.Offset(1, 0).Address( _ 30 RowAbsolute:=False, _ 31 ColumnAbsolute:=False) '「開始セル」文字列の1つ下のセル座標を変数に格納 32 Else 33 Call MsgBox("セルが見つかりません") 34 End 35 End If 36 37 Dim damy2_r As Range 38 Set damy2_r = Range("A:A") '検索範囲:A列 39 Set damy2 = csvsheet.damy2_r.Find(What:="検索文字", lookat:=xlPart)

不勉強で申し訳ありませんが、よろしくお願い致します。
説明不足の箇所がありましたら修正しますので、コメントをお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sage

2020/03/24 07:40

回答者に何を求めているのですか?
zazabi

2020/03/24 07:52

コメントありがとうございます。 with や for を使用した繰り返し処理と文字列検索を繰り返す.findnextを組み合わせて質問内容のコードを作成するのかと思っています。ですが、withやforや.findnextを使う際にどちらを中に組み込ませるのかわかっていません。 上手く言語化できず申し訳ないです……。
guest

回答2

0

with文には繰り返し機能はありません。
繰り返し処理は普通はfor文かdo~loop文を使います(goto文でも繰り返し処理を行えますが、一般には勧められていません)。
withで指定するものが繰り返し処理の中で変わらなければwith文が外側、変わるのならばwith文は内側になります。

投稿2020/03/24 08:05

sage

総合スコア1240

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zazabi

2020/03/24 08:11

コメントありがとうございます。 調べて作成してみます。
guest

0

自己解決

出来ましたので、共有します。
転記項目が複数ある場合、転記先と転記元に選択しているシートが切り替わるので画面がチカチカしますがそこは改善の必要がありそうです。
ですが、目的の処理がうまくいきました。
sageさん、コメントありがとうございます。

vba

1 'シート1で「開始セル」を検索(完全一致) 2 Set damy1 = sheet.Cells.Find(what:="開始セル", LookAt:=xlWhole) 3 If Not damy1 Is Nothing Then 4 damy1_ad = damy2.Offset(1, 0).Address(RowAbsolute:=False, _ 5 ColumnAbsolute:=False) '「開始セル」文字列の1つ下のセル座標を変数に格納 6 Else 7 Call MsgBox("セルが見つかりません") '「開始セル」文字列が無かった場合のエラー回避 8 End 9 End If 10 11 '繰り返し転記処理 12 Dim damy2_r As Range 13 Set damy2_r = Range("A:A") '検索範囲をA列に設定する変数 14 Dim damy2_cell As Range '最初に検索にヒットしたセルを記録 15 16 Set damy2 = csvsheet.Cells.Find(what:="word", LookAt:=xlPart) '最初のFindで“word”という語を検索するように設定 17 If Not damy2 Is Nothing Then '検索対象が1件以上ある場合に下記コードを実行 18 Set damy2_cell = damy2 '最初のセルを格納する 19 Do 20 damy2_ad = damy2.Address(RowAbsolute:=False, _ 21 ColumnAbsolute:=False) '検索したセルの座標を変換する 22 csvsheet.Range(damy2_ad).Copy 'コピーする 23 sheet.Range(damy1_ad).PasteSpecial Paste:=xlPasteValues '値のみを貼り付ける 24 Application.CutCopyMode = False 'コピーを解除する 25 26 damy1_ad = sheet.Range(damy1_ad).Offset(1, 0).Address( _ 27 RowAbsolute:=False, _ 28 ColumnAbsolute:=False) '貼り付けるセルの座標を1つ下にする 29 30 Set damy2 = csvsheet.Cells.FindNext(damy2) '()内のセルの次のセルから検索を続行 31 Loop While damy2.Address <> damy2_cell.Address '最初のセルに戻るまでDo~Loopを継続 32 End If 33 34 ActiveWorkbook.Close SaveChanges:=False 'csvファイルを閉じる(保存無し)

投稿2020/04/01 01:11

zazabi

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問