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

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

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

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

Q&A

解決済

2回答

281閲覧

VBA ループ処理でのデータ取り出し

o-98-0

総合スコア10

VBA

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

0グッド

0クリップ

投稿2018/02/14 06:23

VBA初心者です。
下記のように一つのシートのA列の値とD列の値が紐づいているデータから
■を起点として最終的にA列が●のF列のデータを取り出す場合どういったコードを書けばよいでしょうか。
for文で、■をD列から探してその■のA列の値をまたD列で探す…といったものを書いていたのですが
何回目にA列に●が出てくるかはランダムなので、回数を指定しても意味がありませんでした。
ご指導ご鞭撻宜しくお願い致します。

A B C D E F

▲ ■
● ▲ ★

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

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

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

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

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

torisan

2018/02/14 06:34

結局検索するのはA列なのかD列なのかよくわかりませんでした。具体例を挙げて頂けませんか?
o-98-0

2018/02/14 06:40

申し訳ありません。A列の■と同じ値がないかをまずD列で探し、見つかった行のA列の値が●でない場合、さらにその値(▲)をD列で探し。。。というのを繰り返します。▲の行の場合はA列を見ると●が入っているのでそのF列の値を取り出して処理完了という流れです。
guest

回答2

0

ベストアンサー

こんな感じでしょうか。
無限ループしそうで怖い…。
対策は適宜入れてください。

VBA

1Dim rowA As Long 2Dim rowD As Long 3 4rowA = 1 5rowD = 1 6Do 7 If Cells(rowA, 1).Value = Cells(rowD, 4).Value Then 8 If Cells(rowD, 1).Value = "●" Then 9 Debug.Print "お目当て:" & Cells(rowD, 6).Value 10 Exit Do 11 Else 12 rowA = rowD 13 End If 14 End If 15 rowD = rowD + 1 16Loop

2/14 18:13の質問の回答
データがなくなったらループを抜ける処理を追加。
A列D列ともにデータが連続して格納されている前提です。

VBA

1Dim rowA As Long 2Dim rowD As Long 3 4rowA = 1 5rowD = 2 ' ←2行目からに変更しました 6Do 7 ' A列D列の終了判定 8 If Cells(rowA, 1).Value = "" Or Cells(rowD, 1).Value = "" Then 9 Debug.Print "終了:お目当て発見できず" 10 Exit Do 11 End If 12 If Cells(rowA, 1).Value = Cells(rowD, 4).Value Then 13 If Cells(rowD, 1).Value = "●" Then 14 Debug.Print "お目当て:" & Cells(rowD, 6).Value 15 Exit Do 16 Else 17 rowA = rowD 18 End If 19 End If 20 rowD = rowD + 1 21Loop 22

投稿2018/02/14 07:20

編集2018/02/14 23:33
ttyp03

総合スコア16996

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

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

torisan

2018/02/14 07:36

察するに rowA = rowA + 1 ⇒ rowA = rowD : rowD = rowD + 1 ですかね……? rowDも舐め直すのか仕様がよくわかりませんが。。
ttyp03

2018/02/14 07:38

そうすね。ご指摘どおり。 今のままでも一応動いてはいますけど、最適ではなかったです。 修正しときます。
ttyp03

2018/02/14 07:42

修正してみました。 rowDは常にカウントしててよさそうだったので、If文の外に出しました。
o-98-0

2018/02/14 09:13

回答ありがとうございます! すみません。もう一つ伺いたいのですが、この処理をA列のデータが入っている最終行まで繰り返すにはどうすればよいでしょうか?
o-98-0

2018/02/14 09:29

説明不足で申し訳ありません。 E列のデータ(☆)と同行のA列のデータ(■)をD列から探し、その行のA列のデータをD列から探す。。。というのを、A列が●の時まで繰り返した後、●の行のFの値を元のE列のデータ(☆)と同行のG列に表示させたいです。 それを値が入っているE列全てで行うような処理方法はありませんでしょうか。 宜しくお願い致します。 A B C D E F G ■    ☆ ● ▲     ■ ●     ▲ ☆★●
ttyp03

2018/02/14 23:26

質問の幅を広げすぎです。 最初に投稿した質問が解決できたのであればクローズして、自分なりに模索し、それでも解決できないのであれば改めて質問を投稿してください。 二つ前の質問の件はあとでコードを修正しておくので、確認お願いします。
o-98-0

2018/02/15 04:42

申し訳ありません。確認致しました。ありがとうございます。
guest

0

変数Xを初期化しておき、
For文でA列が●の場合に、F列の値をXに入れる。

そうすれば、
For文が終わった時のXが、
最後の値になるはずですよね?

投稿2018/02/14 07:57

ExcelVBAer

総合スコア1175

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問