皆様、初めまして、こんにちは。私は、VBAを初めて1ヶ月の初心者でございます。
質問内容に、不手際がありましたら、ご容赦ください。
現在、表題の通り、エクセルVBAの 「複数条件抜き出しマクロ」を自分なりに、ネットから、題材を見つけて、勉強しております。
今回私が質問させて頂きたいのは、過去に質問サイトに投稿されていたマクロについてなのですが、ある方が、質問で以下のような質問をされていました。
< ある方の質問内容 (以下引用です。) >
下記の様なデータがあるときに、部活が「野球」でかつクラブは「囲碁」に入っている生徒の学籍番号を別のシート(Sheet2)のB3から下に順にリスト化するマクロがどうしても出来なくて困っています。
<sheet1>
A B C D E
1 学籍番号 学年 名前 部活 クラブ
2 2222222 1 山田 太郎 野球 囲碁
3 9854923 2 吉田 次郎 剣道 絵画
4 1111111 3 佐藤 三郎 野球 囲碁
5 8888883 1 米山 権蔵 卓球 囲碁
それに対して、回答者が、以下のような回答をされていました。
< 回答者の回答 >
Public Sub test()
Dim strSerch1 As String
Dim strSerch2 As String
Dim lngLastRow As Long
Dim i As Long, j As Long
'検索する文字を以下の二つの変数に代入
strSerch1 = "野球"
strSerch2 = "囲碁"
'Sheet2にリスト化するための変数
'最初に入れるのが3行目なのでjに3を代入
j = 3
With Worksheets("Sheet1")
'.Cells(.Rows.Count, 1).End(xlUp).Rowで最後の行がどこなのか調べて
'lngLastRow変数に代入する。
'今回の場合は五行目が最後なので5が格納されます。
lngLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
For i = lngLastRow To 2 Step -1
'ここで四列目と五列目を同時に比較して、両方とも同じならSheet2に学籍番号を入れる処理に移る。
If .Cells(i, 4).Value = strSerch1 And .Cells(i, 5).Value = strSerch2 Then
Worksheets("Sheet2").Cells(j, 2).Value = .Cells(i, 1).Value
j = j + 1
End If
Next i
End With
End Sub
(引用終わり)
前置きが長くなってすいません。ここで私の質問なのですが、End Subから5行上の「j = j + 1」の位置に関してなのですが、
このマクロでは、End Ifの上にあり、正しい結果が得られるのですが、End Ifの下に書くと同じ結果が得られず、シート2のB3は「空欄」になり、そしてB4に「1111111」が入り、続いてB5 は,また「空欄」になり、そしてB6に「2222222」が入ってしまうという結果が得られてしまいます。
なぜ、「j = j + 1」をEnd Ifの下に書くと、B3は「空欄」になり、B4から書き始め、B5
がまた空欄になるのか全然よくわかりません。
私としては、「j = j + 1」をFor Nextで繰り返す前に置けば良いと考え、Next iより上にあれば良いと思い、「j = j + 1」は、End Ifの上でも、下でもどちらでも良いと考えたのですが、なぜ、結果に違いが出るのか?未熟もので、基本的な事が分かってないが故に、質問自体に不備があるかもしれませんが、ご教授のほど、よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
そりゃそうでしょう。
If .Cells(i, 4).Value = strSerch1 And .Cells(i, 5).Value = strSerch2
これが成立したときのみ、Sheet2の3番目にデータを格納し、次に又成立したら4番目に格納。・・・・・
endif の後にj=j+1を書いたら、成立するしないに関らず、格納位置をカウントアップしてしまう。
例えばi=2から10までfor文で回したとして、i=5の場合のみifが成立したら。
i=2,3,4の時には不成立なのにjは毎回1カウントアップされる。
i=4を終わった段階でj=6になっている。
i=5で成立したらj=6になってるから6番目に格納してしまう。
正しくは3番目。
早速の回答ありがとうございます。
とても、わかりやすい回答ありがとうございます。
(自分の実力の無さに無力感を覚えます…。)
<< endif の後にj=j+1を書いたら、成立するしないに関らず、格納位置をカウントアップしてしまう。
⇒ 言われてみると、ホントそのとおりでございます。
この度は、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) Sheet3から2つの条件でオートフィルターで抽出した個数をSheet2へ入力するマクロで、一つ目の 4 2023/01/12 23:40
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
日本語の意味を教えてください。
-
10級の壁
-
囲碁と数学?
-
一目、一見 ひとめ、いちもく、...
-
囲碁 一番手直り
-
碁を打つことを何を囲むと言う...
-
囲碁の上達に指導碁は必須?
-
地の作り方
-
碁盤と碁石で遊べるゲームで囲...
-
今現在20歳の者なんですが、...
-
囲碁)初心者すぎて何をしたら良...
-
囲碁中級者、囲碁未経験者への...
-
囲碁の地合計算の仕方を教えて...
-
囲碁の高段者の方にお聞きします
-
エクセルVBA 複数の条件を含む...
-
「なりせば」の意味を教えて下...
-
碁の石なしバージョンの漢字は ...
-
初心者でも囲碁サロンに行けま...
-
囲碁の番組で解説をしていた女性
-
本因坊、名人、天元
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報