こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセル2003でのマクロで質問です。

エクセル2003でのマクロで質問です。
セル(2,22)には"1"という値が入っています。
セル(2,13)には"20100521"という値が入っています。
セル(3,13)には"20100521"という値が入っています。
セル(4.13)には"20100525"という値が入っています。
セル(5,13)には"20100525"という値が入っています。

このようなときに
セル(3,22)の値は"1"
セル(4,22)の値は"2"
セル(5,22)の値は"2"
となるように以下のようなマクロを作成しました。

Dim i As Integer, j As Integer, date1 As String
i = 2
j = 3
Do While Cells(i, 1).Value <> ""
If Cells(i, 13) = Cells(j, 13) Then
Cells(j, 22) = Cells(i, 22)
Else
Cells(j, 22) = Cells(i, 22) + 1
End If
i = i + 1
j = j + 1
Loop

しかし、結果は
セル(3,22)の値は"2"
セル(4,22)の値は"3"
セル(5,22)の値は"4"

となってしまいます。
どこに原因があるのかわかりません。

助けてください。
宜しくお願いします。

投稿日時 - 2010-06-22 20:14:49

QNo.5987624

困ってます

質問者が選んだベストアンサー

テストした結果、問題はありませんよ。
多分、どこか勘違いしているような気がします。
可能性があるのは、
1.日付の値が違う
 もし文字ならスペースがどこかに入っていて、等しくならない。
2.日付は M列 なのに 実際はL列やN列になっている。
 この可能性が一番高いと思われます。

プログラムはもうちょっとシンプルで、また列名をわかりやすくした方が良いと思います。
例えば
Sub TEST()
 Dim I As Integer
 I = 2
 Do While Cells(I, "A").Value <> ""
   If Cells(I, "M") = Cells(I + 1, "M") Then
     Cells(I + 1, "V") = Cells(I, "V")
   Else
     Cells(I + 1, "V") = Cells(I, "V") + 1
   End If
   I = I + 1
 Loop
End Sub

またデバッグして、途中の変数値を確認すれば問題点はすぐにわかると思います。
色々大変ですが、がんばって下さい。

投稿日時 - 2010-06-23 08:53:51

お礼

テスト結果、正常に作動しました。
どうやら、この構文の前後が影響しているようです。
この部分は問題ないことがわかりました。
ありがとうございました。

投稿日時 - 2010-06-24 11:49:23

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

書式はありますか。目に見える値と比較している値が違うこともなくはない。

原因追求のため、
jをi+1に変えることにより、iを基準にした動きだけ見たらよくなる。
ループ判定にValueつけているのに他はつけていないのも直す。

セル値をCELLSで判定するのでなく一旦変数にしてみる。

投稿日時 - 2010-06-23 09:19:02

お礼

iを基準にした動きだけにしたほうが、確かにわかりやすいですね。
ありがとうございました。

投稿日時 - 2010-06-24 11:50:52

ANo.4

見る限りA列に値があればM列に日付があり、
この日付ごとのカウントをV列へ求める、と見受けられます。

結果からすると
If Cells(i, 13) = Cells(j, 13) Then
Cells(j, 22) = Cells(i, 22) + 1
Else
Cells(j, 22) = Cells(i, 22)
End If
条件式が=になっていれば、カウンタ+1を1つ下のセルへ
条件式が=になっていないならば、カウンタ(そのまま)を1つ下のセルへ
の動きになっていませんか?。
やりたいことと+1する条件が逆になっている???。

If Cells(i, 13) = Cells(j, 13) Then
がホントに一致する状態の値になっているか見直し。

投稿日時 - 2010-06-22 23:42:18

お礼

そうなんですよ。おっしゃる通り、やりたいことと条件が逆になってるような感じです。
他の方からも頂いてるように、最初の条件が本当に一致する状態か確認したいと思います。
ありがとうございました。

投稿日時 - 2010-06-23 00:19:41

ANo.3

私もマクロを勉強したいので、話に入れてもらいます。
値を代入するので、 cells(x,y).value としてはどうですか?
また、直前の行を参照するなら、jを(i+1)としては?(特に i と j は区別しにくいので、jを混在させない方が見やすくないですか? いかがでしょうか?
結果を教えてくださいね。

投稿日時 - 2010-06-22 22:08:31

補足

構文自体は最初のままのものと変わりない結果でした。どうやら前後のマクロが影響しているようです。

投稿日時 - 2010-06-24 11:53:22

お礼

なるほど。試してみます。結果はまた、お伝えします。

投稿日時 - 2010-06-23 00:15:18

ANo.2

マクロには問題がないようなので、シートのデータを確認してください。
また、Do While行とIf行の間に以下のデバッグ文を追加してイミディエイトウィンドウでセル値を確認してください。

Debug.Print Cells(i, 13) & "⇔" & Cells(j, 13)

投稿日時 - 2010-06-22 21:09:02

補足

イミティエイトウィンドウには以下のように表示されました。

2010531⇔

これってどういう意味でしょうか?

投稿日時 - 2010-06-24 11:08:45

お礼

試してみます。ありがとうございます。

投稿日時 - 2010-06-23 00:13:15

ANo.1

うーん、そうなってるならそうでしょうねぇ。
なにを数えて以下のようにしたいのかを書かないとさっぱり分かりません。
セル(3,22)の値は"1"
セル(4,22)の値は"2"
セル(5,22)の値は"2"

投稿日時 - 2010-06-22 20:23:39

補足

同じ日付をひとつのグループとして捉え、日付の早いものから,1,2,3・・・となるようにしたいのですが。

投稿日時 - 2010-06-23 00:11:50

あなたにオススメの質問