- ベストアンサー
VBAで35行3列の範囲に通し番号を入力する方法
- VBAを使って、F5からH35の範囲に通し番号を入力したい場合のコードヒントを教えてください。
- 番号の振り方は、5行が1・2・3、6行が4・5・6といった具合に、横に昇順に並べたいです。
- 現在のコードでは、5行まで走行していますが、6行に改行してくれません。どう修正すればいいでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (6)
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! >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
お礼
おお!こちらもForEach! しかも短い・・・ 最後の行の数字は、私の暗算違いでした。 すいません。 勉強させていただきます!
- bin-chan
- ベストアンサー率33% (1403/4213)
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
お礼
なんとForEachっすか! むむ・・・精進せねば・・・ そして最後のSetステートメントも、じつはさっぱりで・・・ いえいえ、教わってばっかりではいけませんので、意味を考えます! 標準モジュールに書きまくって、試しまくります。 大変参考になります。 ありがとうございます。
- kmetu
- ベストアンサー率41% (562/1346)
No3の訂正です。 LastColumn = 8 も LastColumn = FirstColumn + 2 のほうがいいかもしれません。
お礼
本当にありがとうございます>< こういう細かさもプログラミングのポイントなのでしょうね。 恐縮です。
- kmetu
- ベストアンサー率41% (562/1346)
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
お礼
ありがとうございます。 いずれは「メンテしやすい分に書き換えよう」と思っていましたので、大変助かります。 Row・Columnオブジェクトが発想できるほど、脳ミソが出来上がっていないので、勉強させていただきます!
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
お礼
回答ありがとうございます。 ご指摘のとおりインターネットを活用させていただいております。 なかなか簡単に覚えられないところに、力のなさを感じております。 コード大変参考になりました。 ありがとうございます。
- kmetu
- ベストアンサー率41% (562/1346)
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 となります。
お礼
早速の回答ありがとうございます。 なるほどループ用の変数ですかぁ。 j=6の置き位置の意味を理解していませんでした。 おかげさまでうまく走りました。 デバッグの一文もありがとうございます。 大変参考になります。
お礼
なんとForEachでこんなにサッパリするとは>< 結果は同じなのに・・・ 4行目が私にはなじみがないのですが、実際走りましたので、勉強させていただきます。 (若輩者がこんなこと言ってすいません)