アプリ版:「スタンプのみでお礼する」機能のリリースについて

皆様、初めまして、こんにちは。私は、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の上でも、下でもどちらでも良いと考えたのですが、なぜ、結果に違いが出るのか?未熟もので、基本的な事が分かってないが故に、質問自体に不備があるかもしれませんが、ご教授のほど、よろしくお願いいたします。

A 回答 (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番目。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
とても、わかりやすい回答ありがとうございます。
(自分の実力の無さに無力感を覚えます…。)

<< endif の後にj=j+1を書いたら、成立するしないに関らず、格納位置をカウントアップしてしまう。

⇒ 言われてみると、ホントそのとおりでございます。

この度は、ありがとうございました。

お礼日時:2016/04/12 13:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!