プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

表題のとおり、F5:H35の範囲で、通し番号を入力したいのですが、VBAコードのヒントを教えていただけませんでしょうか?

番号を振る規則は「5行が1・2・3」「6行が4・5・6」といった具合に、横に昇順に並べたいのです。
最後に「35行が103・104・105」としたいです。

下記のようにコードを書いてみました。
5行(1行目)まで走るんですが、6行(2行目)に改行してくれませんでした。
For構文の原理がいまひとつ理解できてないからでしょうか?

---------------------------------------

Sub 通し番号()
1) Dim i As Integer, j As Integer, n As Integer
2) i = 5
3) j = 6
4) n = 1
5)For i = i To 35
6)For j = j To 8
7)Cells(i, j) = n
8)n = n + 1
9)Next
10)Next
End Sub

--------------------------------------

以上です。
よろしくお願いいたいます。

A 回答 (7件)

jのループで最初の一回はj=6で始まりますが2回目からはjが8のままですのでjのループが実行されません。



このような場合、変数をループ用と初期値用と別にしたほうがいいと思われます。

同じにするのでしたら以下のように変更してください。

i = 5
n = 1
For i = i To 35
j = 6
For j = j To 8
Cells(i, j) = n
' Debug.Print i; " "; j
n = n + 1
Next
Next

ちなみにうまくいかない場合
Debug.Print i; " "; j
と記載して実行すると、変数の値がイミディエイトウインドウに表示されますので、問題の原因が分かることが多々あります。

> 最後に「35行が103・104・105」としたいです。

91,92,93
となります。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
なるほどループ用の変数ですかぁ。
j=6の置き位置の意味を理解していませんでした。
おかげさまでうまく走りました。
デバッグの一文もありがとうございます。
大変参考になります。

お礼日時:2014/03/02 14:57

i=5


j=6
というようは指定はfor~nextでは行いません。
for i= 5 to 39
開始、終了を数値又は変数で指定すれば良いのです。

for~nextを繰り返す2次配列的使用の場合は、どちらを先にループさせるのか考えましょう。
今回は行を5行目~39行目まで回す間に列を3列数値変更したいのですから、最初のfor~nextは行から始めないといけない事が解りますよね。
基本的は構文ですので、覚えましょうね。

最祖は色々あるでしょうが、頑張って勉強して下さい。
VBAはネット上にサンプルコードはいくらでもあります。分からないことはネット検索する方が早く自己解決する事も多いですよ。

修正案です。最終数値が105にしたいのであればF5:H35ではなくF5:H39になります。(35行までではなく、賞味35行必要)

Sub 通し番号()
Dim i As Integer, j As Integer, n As Integer

n = 1

For i = 5 To 39
For j = 6 To 8
Cells(i, j) = n
n = n + 1
Next
Next

End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ご指摘のとおりインターネットを活用させていただいております。
なかなか簡単に覚えられないところに、力のなさを感じております。
コード大変参考になりました。
ありがとうございます。

お礼日時:2014/03/02 15:01

No1です



初期値を別の変数にする例を忘れてました。

以下のような感じにしておけば、表のレイアウトの変更で行の指定や列の指定を変更する場合、分かりやすいと思います。

また、後々何かの機能を追加してコードが増えても、最初や最後の行や列などの指定を数値でするのではなく変数で指定しておけば、レイアウト変更になっても最初の変数の代入値を変更するだけで済みますのでメンテナンスがしやすいと思います。

Sub Example()

Dim i As Integer, j As Integer, n As Integer
Dim FirstRow As Integer, LastRow As Integer
Dim FirstColumn As Integer, LastColumn As Integer

FirstRow = 5
LastRow = FirstRow + 34 '実質35行いるのでしたら最終行は左の計算になります。
FirstColumn = 6
LastColumn = 8

n = 1

For i = FirstRow To LastRow
For j = FirstColumn To LastColumn
Cells(i, j) = n
n = n + 1
Next
Next

End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
いずれは「メンテしやすい分に書き換えよう」と思っていましたので、大変助かります。
Row・Columnオブジェクトが発想できるほど、脳ミソが出来上がっていないので、勉強させていただきます!

お礼日時:2014/03/02 15:07

No3の訂正です。



LastColumn = 8

LastColumn = FirstColumn + 2
のほうがいいかもしれません。
    • good
    • 0
この回答へのお礼

本当にありがとうございます><
こういう細かさもプログラミングのポイントなのでしょうね。
恐縮です。

お礼日時:2014/03/02 15:09

Tablet手書き入力なので字下げできてないけど



Sub 通し番号()

Dim n As Integer
Dim objRanges as range
Dim objRange as range

n = 0

Set objRanges = Range("F5:H35")

For each objRange in objRanges
n = n + 1
objRange = n
Next objRange

Set objRange= nothing
Set objRanges =nothing

End Sub
    • good
    • 0
この回答へのお礼

なんとForEachっすか!
むむ・・・精進せねば・・・
そして最後のSetステートメントも、じつはさっぱりで・・・
いえいえ、教わってばっかりではいけませんので、意味を考えます!
標準モジュールに書きまくって、試しまくります。
大変参考になります。
ありがとうございます。

お礼日時:2014/03/02 15:16

こんにちは!



>F5:H35の範囲で
となると最終行は
91・92・93 になると思いますが・・・

一例です。

Sub Sample1()
Dim cnt As Long, c As Range
For Each c In Range("F5:H35")
cnt = cnt + 1
c = cnt
Next c
End Sub

こんな感じでも大丈夫だと思います。m(_ _)m
    • good
    • 0
この回答へのお礼

おお!こちらもForEach!
しかも短い・・・
最後の行の数字は、私の暗算違いでした。
すいません。
勉強させていただきます!

お礼日時:2014/03/02 15:18

5行目から始まるなら、終わりは39行ですね? For 2個もいりません。

F5:H39の範囲を選んで、For Eachすればそれでいいです。

Sub renban()
Dim i As Range, x As Long
x = 0
For Each i In [F5:H39]
x = x + 1: i.Value = x
Next
End Sub
    • good
    • 0
この回答へのお礼

なんとForEachでこんなにサッパリするとは><
結果は同じなのに・・・
4行目が私にはなじみがないのですが、実際走りましたので、勉強させていただきます。
(若輩者がこんなこと言ってすいません)

お礼日時:2014/03/02 15:25

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