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

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

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

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

Q&A

解決済

2回答

1953閲覧

[VBA]A列に特定の文字がある場合繰り返しをする

aaaskw123123

総合スコア13

VBA

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

0グッド

0クリップ

投稿2021/09/29 02:37

編集2021/09/29 03:25

前提・実現したいこと

A列に特定の文字が入っているところからFor文をスタートさせたいです。

↓のプログラムでは
都道府県.xlsxのL4にThisWorkbookのJ2をコピー
都道府県.xlsxnのM4にThisworkbookのL2をコピー
都道府県.xlsxのN4にThisworkbookのM2をコピー



と、変数cntとiを使ってデータ数分繰り返しを行っています。

今はcnt=4と具体的に数字を代入をしていますが、
始まるセルが変わる可能性もある場合(都道府県.xlsxのセルを追加した場合など)を考えて
A列に'東京'と入っている場合以下のFor文を繰り返す というコードを書きたいです。

Dim wb As Workbook Set wb = Workbooks("都道府県.xlsx") Dim i As Long Dim cnt cnt = 4 For i = 2 To ThisWorkbook.Worksheets("A").Cells(Rows.Count, 1).End(xlUp).Row wb.Sheets(1).Range("L" & cnt) _ =ThisWorkbook.Worksheets("A").Range("J" & i) wb.Sheets(1).Range("M" & cnt) _ = ThisWorkbook.Worksheets("A").Range("L" & i) wb.Sheets(1).Range("N" & cnt) _ = ThisWorkbook.Worksheets("A").Range("M" & i) wb.Sheets(1).Range("O" & cnt) _ = ThisWorkbook.Worksheets("A").Range("K" & i) cnt = cnt + 1 Next End Sub

試したこと

試しにIF文を入れてみたのですが、
ここでcntに入れる値何が入るのかが分からなくて困っています。

ご教授お願いいたします。

Dim wb As Workbook Set wb = Workbooks("都道府県.xlsx") Dim i As Long Dim cnt cnt = 4   'i=2から最終行まで繰り返し For i = 2 To ThisWorkbook.Worksheets("A").Cells(Rows.Count, 1).End(xlUp).Row     'もしA列に東京という文字が入っていたら  IF wb.Sheets(1). InStr(wb.Sheets(1).Range("A" & i), "東京") Then wb.Sheets(1).Range("L" & cnt) _ =ThisWorkbook.Worksheets("A").Range("J" & i) wb.Sheets(1).Range("M" & cnt) _ = ThisWorkbook.Worksheets("A").Range("L" & i) wb.Sheets(1).Range("N" & cnt) _ = ThisWorkbook.Worksheets("A").Range("M" & i) wb.Sheets(1).Range("O" & cnt) _ = ThisWorkbook.Worksheets("A").Range("K" & i) cnt = cnt + 1   End IF Next End Sub

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

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

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

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

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

itagagaki

2021/09/29 02:55

コピー先は4行目から順番に1行ずつ進むのですよね? で、2行目から最終行までの間で、A列が東京の行だけ、コピー先の4行目以降にコピーしたいのですか? それとも、2行目から最終行までの間で、A列が東京である最初の行を探し、見つかったら、その行から最終行までの間で、コピー先の4行目以降にコピーしたいのですか?
aaaskw123123

2021/09/29 03:12 編集

コピー先は4行目から始まるとは決まってないです. そのため、実現したいことは後者になります。
aaaskw123123

2021/09/29 03:13

A列に東京という文字が入っているか確認する必要があると思うので、 4行目から始まるかはわからない という感じです。
itagagaki

2021/09/29 03:43

えーと、確かにこれは混乱しています。 東京が入っているかどうかをチェックしているのはコピー先であるwb.Sheets(1)なのに コピー元のシートのインデックスである i を使ってチェックしています。まずそこからおかしいです。 要件をしっかり明文化しましょう。 ・「A列に」というのはどのシートの話をしているのか→コピー元の話かと思っていたらコピー先の話だった ・コピー元からは2行目から最終行まで全部をコピーするのか? ・各行のコピー先はどこ?
aaaskw123123

2021/09/29 03:49

・A列➔コピー先の話 ・コピー元からは2行目からデータ数分だけコピーしたいので最終行と設定しています。
Usirow

2021/09/29 07:20

「コピー先A列で東京が入っているセルを見つけたら、そこを始点としてFor文を回す」のか「コピー先A列の中でFor文を回して、東京とあるセルにだけ処理をするのか」が曖昧な気がするのですが、どちらなのでしょう?
guest

回答2

0

2行目から最終行までの間で、A列が東京の行だけコピーする
コピー先は4行目から順番に1行ずつ進む

それなら「試したこと」のコードのままでいいのではないでしょうか。

下記は、変数名がcntでは意図がわかりにくいのでdest_rowに変更して、インデントを整形しただけで、
同じコードです。

VBA

1Dim wb As Workbook 2Set wb = Workbooks("都道府県.xlsx") 3Dim i As Long 4Dim dest_row; 5 6 dest_row = 4 'コピー先の行 7 8  'i=2から最終行まで繰り返し 9 For i = 2 To ThisWorkbook.Worksheets("A").Cells(Rows.Count, 1).End(xlUp).Row 10 11     'もしA列に東京という文字が入っていたら 12 IF wb.Sheets(1).InStr(ws.Range("A" & i), "東京") Then 13 14 wb.Sheets(1).Range("L" & dest_row) _ 15 =ThisWorkbook.Worksheets("A").Range("J" & i) 16 17 wb.Sheets(1).Range("M" & dest_row) _ 18 = ThisWorkbook.Worksheets("A").Range("L" & i) 19 20 wb.Sheets(1).Range("N" & dest_row) _ 21 = ThisWorkbook.Worksheets("A").Range("M" & i) 22 23 wb.Sheets(1).Range("O" & dest_row) _ 24 = ThisWorkbook.Worksheets("A").Range("K" & i) 25 26 dest_row = dest_row + 1 'コピー先の行を1つ進める 27 28   End IF 29 Next 30 31 32End Sub

投稿2021/09/29 03:07

itagagaki

総合スコア8402

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

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

aaaskw123123

2021/09/29 03:09

申し訳ございません。 4行目から始まるとは限らないので、後者の方でした????
aaaskw123123

2021/09/29 03:10

なので、cntの値に何が入るのかわからないという質問です..すみません。
itagagaki

2021/09/29 03:28

ん?4行目から始まるとは限らないとは? コピー元は2行目から コピー先は4行目から ですよね? コピー先が4行目からではないということですか?
aaaskw123123

2021/09/29 03:35

コピー元は2行目から始めると決まっていて、 コピー先はA列に東京という文字がある場合 繰り返しをしたいという 感じです。 例えば 最初はA列の1,2,3行目に愛知があったとして4行目は東京があります。 もし、セルを追加して4行目に愛知と入力した場合 4行目から始まるとは断言できないので、 A列に東京がある間にFor文を回したいという意味です。 分かりにくくてごめんなさい。
itagagaki

2021/09/29 03:51

これは確かに混乱しています。 要件をしっかり定義しましょう。 たとえばただ「A列」と言ったのでは曖昧です。現に誤解が生じていました。 どのシートのA列なのかを明文化しましょう。 コピー元の2行目から最終行まで、すべての行について、コピーは行うのですか? その際、それぞれの行のコピー先は何行目になるべきなのですか? これを文章で説明できないことにはプログラムのコーディングも不可能です。
guest

0

ベストアンサー

VBA

1Sub sample1() 2 Dim wb As Workbook, saki As Worksheet 3 Set wb = Workbooks("都道府県.xlsx") 4 Set saki = wb.Sheets(1) 5 6 Dim moto As Worksheet 7 Set moto = ThisWorkbook.Worksheets("A") 8 9 Dim cnt As Long 10 cnt = saki.Range("A:A").Find("東京").Row 11 12 Dim i 13 For i = 2 To moto.Cells(Rows.Count, 1).End(xlUp).Row 14 saki.Range("L" & cnt) = moto.Range("J" & i) 15 saki.Range("M" & cnt) = moto.Range("L" & i) 16 saki.Range("N" & cnt) = moto.Range("M" & i) 17 saki.Range("O" & cnt) = moto.Range("K" & i) 18 cnt = cnt + 1 19 Next 20End Sub 21 22 23Sub sample2() 24 Dim wb As Workbook, saki As Worksheet 25 Set wb = Workbooks("都道府県.xlsx") 26 Set saki = wb.Sheets(1) 27 28 Dim moto As Worksheet 29 Set moto = ThisWorkbook.Worksheets("A") 30 31 Dim lastRow As Long 32 lastRow = moto.Range("A" & moto.Rows.Count).End(xlUp).Row 33 34 Dim i, j 35 j = 2 36 For i = 1 To saki.Range("A" & saki.Rows.Count).End(xlUp).Row 37 If saki.Range("A" & i).Value = "東京" Then 38 saki.Range("L" & i).Value = moto.Range("J" & j).Value 39 j = j + i 40 If j > lastRow Then Exit For 41 End If 42 Next 43End Sub 44

投稿2021/09/29 02:53

編集2021/09/29 09:52
jinoji

総合スコア4585

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

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

aaaskw123123

2021/09/29 03:04

回答ありがとうございます。 変数iは使わないということでしょうか・・・?
jinoji

2021/09/29 04:00

このコードで、以前は4と決め打ちしていた東京の場所を決定してから、 元のコードの実行する、という考え方でした。
aaaskw123123

2021/09/29 10:09

編集ありがとうございます。 Findを使ったら開始行を取得することができました。 助かりました!! ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問