VBAの連番の振り方について

このQ&Aのポイント
  • VBAを使用してセルに連番を振りたい場合、一部のプログラムは正しく動作しないことがあります。
  • 具体的には、セルのコピペがうまく行われる一方で、連番が振られないため、最初の行が空になってしまいます。
  • この問題を解決するためには、一部の修正が必要です。詳細な修正方法については、以下のプログラムを参考にしてください。
回答を見る
  • ベストアンサー

VBAの連番の振り方について

セルC1からC10まで罫線の表があり、inputboxで入力された数値だけD列以降にコピペされ、 セルC1をスタートに C1が1、D1が2、E1が3・・・といったように、連番を振りたいのですが、 下記プログラムで実行すると、inputboxで入力された数値分、表はコピペされますが、 肝心な連番が振られず1行目は空白のままになってしまいます。 ------------------------------------------------------------------------------ Dim cp As Long, x As Integer Dim ren As Integer 答え1 = InputBox("拠点数を入力してください。", "拠点数入力") ia = Val(答え1) Application.ScreenUpdating = False Range("C1:C10").Copy For cp = 1 To ia - 1 Cells(1, x + 4).PasteSpecial x = x + 1 Next With Application .CutCopyMode = False .ScreenUpdating = True End With ren = 1 Range("C1").Select Do While ActiveCell.Offset(0, 1).Value <> "" ActiveCell.Value = ren ren = ren + 1 ActiveCell.Offset(1).MergeArea.Select Loop どう修正すれば良いのか分かりません。 宜しくお願い致します。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1616/2455)
回答No.1

もともとC1に何かデータが入ってなければ1行目は空白ですから Do While ActiveCell.Offset(0, 1).Value <> "" 右横のセルをチェックしてますから、Loopは実行されません。 下(2行目)のセルが空白かどうかをチェックして 以下のようにするか (ActiveCell.Offset(1).MergeArea.Selectは下方向に進むので変更しました) Do While ActiveCell.Offset(1, 0).Value <> "" ActiveCell.Value = ren ren = ren + 1 ActiveCell.Offset(0, 1).MergeArea.Select Loop ActiveCellはやめたほうがいいのではと思いますから Do While Range("C1").Offset(1, ren - 1).Value <> "" Range("C1").Offset(0, ren - 1).Value = ren ren = ren + 1 Loop のようにするか 最後のren = 1以降はなくして(Do Whileはやめて) 最初のループを利用する以下に変更したらいかがでしょう。 Range("C1:C10").Copy Range("C1").Value = 1 For cp = 1 To ia - 1 Cells(1, cp + 3).PasteSpecial Cells(1, cp + 3).Value = cp + 1 Next

guchan2020
質問者

お礼

kkkkkmさん、ありがとうございました。 思っていた動きが出来るようになりました。 こんなにすっきりとした式で可能になるとは驚いた半面、 まだまだ勉強が必要だと再認識しました。 とてもいい勉強になりました。本当にありがとうございました。

その他の回答 (1)

  • kkkkkm
  • ベストアンサー率65% (1616/2455)
回答No.2

No.1の追加です。 連番だけ別にしたいのでしたら Do Whileじゃなくて、Do Whileのところを 以下のようにしてはいかがでしょう。Do~Loopは極力使いたくない。 For i = 1 To ia Range("C1").Offset(0, i - 1).Value = i Next 代入部分は Cells(1, i + 2).Value = i でもいけますが、C1からを意識してRange("C1").Offsetにしています。

関連するQ&A

  • excel vbaでの質問になります

    このようなマクロを作成したのですが、セルに数式が入れてあると、どうしてもその下の空白の行に値を入力されてしまいます。 数式が入っているセルにもそのままセルに値を入れたいのですが・・ 宜しくお願いします。 Dim wb1 As Worksheet, r1 As Range Dim N As Integer, i As Integer Dim mycount As Long   Set wb1 = ThisWorkbook.Worksheets("請求書") mycount = Range("B111").CurrentRegion.Rows.Count Cells(111 + mycount, 2).Select ActiveCell.Offset(0, 0).Value = wb1.Range("C60").Value ActiveCell.Offset(0, 1).Value = wb1.Range("C61").Value ActiveCell.Offset(0, 12).Value = wb1.Range("C66").Value ActiveCell.Offset(0, 13).Value = wb1.Range("C74").Value ActiveCell.Offset(0, 14).Value = wb1.Range("C75").Value ActiveCell.Offset(0, 15).Value = wb1.Range("C84").Value ActiveCell.Offset(0, 16).Value = wb1.Range("C85").Value ActiveCell.Offset(0, 20).Value = wb1.Range("C69").Value ActiveCell.Offset(0, 22).Value = wb1.Range("C68").Value ActiveCell.Offset(0, 23).Value = wb1.Range("C76").Value ActiveCell.Offset(0, 24).Value = wb1.Range("C77").Value Exit Sub

  • Access VBAで分類別に連番を振る応用

    Sub DAO_num()   '分類別連番付加 Dim db As DAO.Database Dim rs As DAO.Recordset Dim fld As DAO.Field Dim fldid As String Dim stSQL As String Dim i As Long '入力開始番号の値を格納 Dim i2 As String '前ゼロ表記の設定値を格納 Dim i3 As String '入力された変数をセーブ Dim recut As Long '連番付加処理カウンタ stSQL = "SELECT * FROM [Vba] ORDER BY [code] , [zip] , [ID]" Set db = CurrentDb() Set rs = db.OpenRecordset(stSQL, dbOpenDynaset) Set fld = rs.Fields("ren") '[ren]フィールドに連番を付加 rs.MoveFirst i = 0 i2 = "" fldid = rs!code i = InputBox("開始番号を入力して下さい。") i3 = i i2 = InputBox("前ゼロ表記の必要桁数を入力して下さい。") Do Until rs.EOF rs.Edit recut = recut + 1 If fldid <> rs!code Then '[code]が変わったら連番を振り直す i = i3 fldid = rs!code Else End If fld = Format(i, i2) rs.Update i = i + 1 rs.MoveNext Loop rs.Close db.Close MsgBox ("【処理終了】" & vbCrLf & "処理件数= " & recut & " 件") End Sub ---------------------------------------------------------------- 質問です。 i = InputBox("開始番号を入力して下さい。") ↑ここで値を入力した後、確認の為のInputBoxを出して値を入力し、最初入力した値と確認用に入力した値が同じなら処理を行う。不正の場合、メッセージを出して強制終了。 という風にカスタマイズしたいのですが、うまくいきません。 どなたかアドバイス宜しくお願い致します。

  • エクセル マクロ VBA について

    以下はセルB2.C2.D2.E2.F2をアクティブセルから右方向へ入力しています。ここでの入力とは"=" + "セルB2" というものです。一つずつ入力している為マクロが長くなります。短くシンプルなものにしたいです。ご教示お願いします。 ActiveCell.FormulaR1C1 = "=R2C2" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C3" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C4" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C5" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C6"

  • 通し番号(連番)を返すマクロ

    エクセルで -------------------        | Retsu1 | Retsu2 | ------------------- Gyou    |    1 |    1  | -------------------         |    1  |    2  | -------------------        |     1 |    3  | -------------------        |     2 |    1  | このようにRetsu1には1~Xの数字が入っています。 データはRetsu1で並べ替えをしているため、その数字は、しばらく1が続いたら、次は2が続き、その次には3が続くというような並び方をしています。X(最終の数字)が続いた後は空白です。 そこで、Retsu2には1,2,3・・・というように連番を書き込みたいと思います。 これはRetsu1の同一数字内で連番にしたいのです。 つまり、Retsu1の値が2になれば、また新たに1,2,3・・・というような感じです。 最後にはRetsu1の値がXで1,2,3・・・と連番の書き込みが終わったら(Retsu1が空白になったら) Retsu2への書き込みも終了とします。 マクロ初心者のため Dim Gyou As Integer Dim Retsu1 As Integer Dim Retsu2 As Integer までしかできていません。 この続きのマクロを教えてください。お願いします。

  • 簡素化

    よろしくお願いします 下記構文の簡素化ができないでしょうか。 Application.ScreenUpdating = False Dim r As Range Set r = ActiveCell.MergeArea r.MergeCells = False With Sheets("注文伺い書入力") ActiveCell.Offset(0, 21).Activate ActiveCell = "" ActiveCell.Offset(0, 2).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" ActiveCell.Offset(0, 1).Activate ActiveCell = "" End With r.MergeCells = True Application.ScreenUpdating = True

  • vbaで複数のパターンのファイル名を読み込みたい

    例えば、11.jpg~79.jpgの画像を読み込むとします。 これをvbaで記述すると j & i & ".jpg" となります(1の位と10の位の数字は独立していると考えてください) これを、1-1.jpg~7-9.jpg といった形式をvbaで記述すると、 j & "-"& i & ".jpg" となります。 これをvbaで記述させるときに、これをA1のセルに「ji」や、「j-i」や、「i」、「j」と入力させたときに様々なパターンに対応させたいと考えております。 (他の方法でもいいです。やりたいことは、複数パターンのファイル名に対応させたいという事です。) いちいち、写真のファイル名のパターンが違うたびにコード書き直すのも面倒ですし、プログラムわからない人には読み込ませることすらできないです。 4パターンだったら、if文で分けちゃえば?という人もいるでしょうが、それは最終手段として残しておきたいです(プログラムがえらい長くなり、後々の修正が大変だし、パターンが増えるたび追加しなければならないので) せめて、C言語のように#defineによる置き換えができれば、 #define PATARN j & "-"& i として、「一か所のみ修正すれば楽ちん」みたいなことができればいいんですけれども、 VBAで、C言語の#defineに該当するものが何かよくわかりません。 (プログラム本文にはPATARNに該当する箇所が何か所かあるので、修正が大変なんです) もし必要ならと思い、ソースの一部を書いておきます(主要なところだけ残して、後はざっくり削除しています) やってることは、写真を挿入して、規則的に並べて、JPEG変換しています (下のコードは写真の挿入のみ) Sub 写真挿入→JPEG変換() On Error Resume Next Dim flag As Integer Dim xoffset As Integer Dim yoffset As Integer Dim Ystart As Integer Dim i As Integer Dim j As Integer Dim Xstart As Integer Dim str As String Dim Er As String Xstart = 1 Dim Xend As Integer Dim Yend As Integer flag = 0 xoffset = 1 yoffset = 1 Ystart = 1 Yend = 6 Xend = 6 Application.ScreenUpdating = False For j = Xstart To Xend For i = Ystart To Yend ActiveSheet.Pictures.Insert(ActiveWorkbook.Path & _ j & i & ".jpg").Select If i = Yend Then Else If flag = 0 Then ActiveCell.Offset(yoffset, 0).Range("A1").Select ElseIf flag = 1 Then ActiveCell.Offset(0, xoffset).Range("A1").Select End If End If Next If flag = 0 Then ActiveCell.Offset(-(Yend - Ystart) * yoffset, xoffset).Range("A1").Select ElseIf flag = 1 Then ActiveCell.Offset(yoffset, -(Yend - Ystart) * xoffset).Range("A1").Select End If Next Application.ScreenUpdating = True End Sub

  • 処理速度を早くする

    処理速度を早くする よろしくお願いします。 下の構文で処理するのに5,6秒掛かります。 もっと早く処理をさせる方法をお教えください。 Private Sub 消去_Click() Application.ScreenUpdating = False Dim k As Integer Dim s As Integer With Worksheets("予定情報") k = 1 ActiveCell.Offset(0, k).Value = Temp For s = 0 To 30 ActiveCell.Offset(0, 0 + s).Delete Shift:=xlUp Range("A200:M204").Borders.LineStyle = True Next End With Application.ScreenUpdating = True End Sub

  • エクセルVBA 結合セルに指定した数まで連番を振る

    皆さんこんにちは。 エクセル2013を使用しています。 Sheet1のA列が2行ずつ結合しています。 A3(固定)から下方向にUserform1のTextbox1に入力した 数値まで連番を振りたいと思い下記のコードを 作成しました。 例えばTextbox1に”10”と入力してコマンドボタンを押すと セルA3・A5・A7・A9・A11・・・の順に1~10が入力されるように したかったのですが実際動かしてみると 1・2・4・6・8・10が入力されてしまいます。 結合セルだからなのでしょうか? でもセルA5に2は入るし・・・と イマイチ理由が分かりません。 A3・A5・A7・A9・A11・・・の順に 連番を振るにはどうしたら良いでしょうか? ------------------------------------------------------- Sheets("Sheet1").Range("A3").Select Dim i As Long Dim j As Long i = TextBox1.Value For j = 1 To i ActiveCell.Offset(j - 1, 0) = j Next

  • VBAで縦一列に数字を入力したい

    Private Sub CommandButton1_Click() Dim n As Integer Dim i As Integer Dim x As Integer For i = 1 To n x = i + 3 n = InputBox("層数の値を入力してください") Cells(3, 1).Value = ("基板") Cells(x, 1).Value = i x = x + 1 Next End Sub 上記のようなマクロを組んだのですが、4行目に1が入ってとまってしまいました。 これを完成させるにはどうしたらいいでしょうか?

  • VBA リストボックスの値をセルに転記

    よろしくお願いします。 したいことは、 ユーザーフォームのリストボックスで複数の値を選んで複数セルに転記する。 ActiveCell.offset(10, 5) ⇐ リストボックスで選んだ1つ目 ActiveCell.offset(11, 5) ⇐ リストボックスで選んだ2つ目 ActiveCell.offset(12, 5) ⇐ リストボックスで選んだ3つ目 下の構文では1つしか転記できません。 Dim n As Integer, s As String For n = 0 To ListBox3.ListCount - 1 If ListBox3.Selected(n) Then s = s & ListBox3.List(n) & vbCrLf ActiveCell.offset(10, 5).Value = s End If Next

専門家に質問してみよう