[[20150301204159]] 『違いを教えてください。』(みちこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『違いを教えてください。』(みちこ)

Sub 連番()
Dim i
Dim j
Dim k

i = 1
k = 1
Do While i <= 10
j = i
Do While j <= 10

Cells(i, j) = k
k = k + 1
j = j + 1
Loop
i = i + 1
Loop

End Sub

Sub Macro1()

    Dim i
    Dim j
    Dim k
    i = 1
    k = 1
    Do While i <= 10
     j = 1
     Do While j <= 10
     Cells(i, j) = k
     k = k + 1
     j = j + 1
     Loop
     i = i + 1
    Loop
End Sub

 連番のマクロを実行するとしたのような結果になり
 1	2	3	4	5	6	7	8	9	10
	11	12	13	14	15	16	17	18	19
		20	21	22	23	24	25	26	27
			28	29	30	31	32	33	34
				35	36	37	38	39	40
					41	42	43	44	45
						46	47	48	49
							50	51	52
								53	54
									55
macro1のほうを実行すると
1	2	3	4	5	6	7	8	9	10
11	12	13	14	15	16	17	18	19	20
21	22	23	24	25	26	27	28	29	30
31	32	33	34	35	36	37	38	39	40
41	42	43	44	45	46	47	48	49	50
51	52	53	54	55	56	57	58	59	60
61	62	63	64	65	66	67	68	69	70
71	72	73	74	75	76	77	78	79	80
81	82	83	84	85	86	87	88	89	90
91	92	93	94	95	96	97	98	99	100
のような結果になります。
同じようなコードを書いたつもりなのですが、どうして、このような結果の違いになりますか?最近勉強し始めたばかりで、教えていただければ助かります。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 同じようなでも、同じじゃないですよね。
        j = i
 と
        j = 1
 の違いが、結果の違いになっています。

 動作を確認するときに、F8を押しながら、マウスを変数の上に置いたり、「ウォッチ」
 ウィンドウに変数をドロップしてから、F8 でステップ実行すると、マクロがどのように
 動いているか確認できると思います。

『デバッグトレースの開始方法』
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html

 マクロを修得するには、まずステップ実行やデバッグを覚えるとよいかと思います。

(Mook) 2015/03/01(日) 21:05


 Mookさんともろかぶりですが、メモッたのでアップします。

 よ〜く、目を凝らして眺めると、1点、異なってますね。

 連番では  j = i 
 Macro1では j = 1

 それより、マクロを勉強したところなら、今のうちに、コードにきちんとインデントをつける習慣を。
 見事に(?)1桁目からコード記述がなされているけど、このように書くんだという参考書があるんでしょうか?
 (最近、いろんな人が、この見事なまでの1桁目開始コードをアップしているので、どこかに、そのように指導する参考書があるのかなと)

 Sub 連番()
    Dim i
    Dim j
    Dim k

    i = 1
    k = 1
    Do While i <= 10
        j = i
        Do While j <= 10
            Cells(i, j) = k
            k = k + 1
            j = j + 1
        Loop
        i = i + 1
    Loop

 End Sub

 Sub Macro1()

    Dim i
    Dim j
    Dim k
    i = 1
    k = 1
    Do While i <= 10
        j = 1
        Do While j <= 10
            Cells(i, j) = k
            k = k + 1
            j = j + 1
        Loop
        i = i + 1
    Loop

 End Sub

(β) 2015/03/01(日) 21:07


 ついでに。
 連番 と Macro1 とどちらがやりたいことかわかりませんが、ループの範囲があらかじめ
 わかっているのであれば、For 文を使うと見やすくなる気がします。

 Sub Sample()
    Dim i As Long
    Dim j As Long
    Dim k As Long

    k = 1
    For i = 1 To 10
        For j = 1 To 10
            Cells(i, j) = k
            k = k + 1
        Next
    Next
 End Sub
(Mook) 2015/03/01(日) 21:40

Mookさん、βさん
ありがとうございます。
do while を解説してるところがあって、そこに上がってたのを練習のため、
自分で打ったのですが、間違えて入力していたみたいです。
見比べてみましたが、気が付きませんでした。
ステップ実行やデバッグ、覚えます。

インデントについては、単に見やすくするためのものなのでしょうか?
グループごとにインデントをつけるのか、逆にどの頻度でインデントをつけるかの記述がなくて、
本等では、インデントはついてますが、それがどのような法則でつけられてるかがいまいちわからなくて、
とりあえず、1桁目開始している次第です…。

(みちこ) 2015/03/01(日) 22:49


 >インデントについては、単に見やすくするためのものなのでしょうか? 
 そうです。
 見やすくするためなのですが、コードが見やすいことは大事なことです。

 インデントを付けるのは、
 IF 〜 End If
 For 〜 Next
 Do 〜 Loop
 など、構文の最初と終わりで同じ位置にすることにより、構文の範囲が明確になります。

 とりあえず見様見真似でも良いので、インデントを習慣にした方が良いでしょう。
(Mook) 2015/03/01(日) 22:57

Mookさん
ありがとうございます。
気になっていたので、助かりました。
アドバイスいただいたところなど、気を付けてみます。
(みちこ) 2015/03/01(日) 23:32

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.