VBAでセルの行頭に連番を付加する方法

このQ&Aのポイント
  • VBAを使用して、セルの行頭に連番を付加する方法についての質問です。
  • 現在、B列をナンバリング用の仮セルとして使用していますが、仮セルを使わずに連番を付加する方法があるかどうか知りたいです。
  • 以下のコードは、指定した範囲のセルの行頭に連番を付加する方法です。
回答を見る
  • ベストアンサー

vba セルの行頭に連番を付加

セルの行頭に連番を付加したいので下記のようなコードを作成しました。 B列をナンバリング用の仮セルとして使いましたが 仮セルを利用しない方法はありますか ? Option Explicit Sub セル連番付加() Dim i As Long For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row With Cells(i, "B") .Value = i - 1 .NumberFormatLocal = "@" .Value = Format(.Value, "00") End With Cells(i, "C") = Cells(i, "B") & " " & Cells(i, "A") Next End Sub

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.5

> Dim Temp As Variant とTemp()では無いので配列でしょうか? > Temp(i - 1, 1)と2次元配列のように見えますが? セルの値を一気に入れた場合()を省略しても2次元配列になります。 私が最初に参考にしたサイトでは()が無かったので、そのままの流れで()無しにしてます。 今ちょっと検索しても()無しで説明しているサイトが殆どでした。 ()を使っても使わなくてもいいと記載があったのはこちらだけでした。 https://excel-ubara.com/excelvba1/EXCELVBA414.html > 配列は、Option Baseで1を宣言しない限り配列の添え字の最小値は「0」からになるので > A列の左端は、temp(0,1)となるの無いですか? 通常はそうなのですが、一気に入れた場合は1からになります。 同時に利用する他の配列があればそれは0からになります。 仕様だと思ってください。

NuboChan
質問者

お礼

解説ありがとうございます。 配列は、今まで利用することが自分的には無かったので知らないことばかりです。 教えていただいた事を元に解説を付けたコードが下記となります。 Sub セル連番付加配列_4() 'A列を配列に入れて処理する 'データ量が多い場合には、データを一気に多次元配列に入れて配列で処理して '一気にセルに書き戻すと処理が早くなります。 Dim i As Long Dim Temp As Variant 'セルの値を一気に入れた場合配列で()を省略しても2次元配列になります。 'セル範囲のValueを入れた配列の下限は1になります。 'LBoundが必ず1になる点に注意して下さい。 'つまり '配列は、Option Baseで1を宣言しない限り配列の添え字の最小値は「0」からですが '配列に一気に入れた場合は1からになります。 '同時に利用する他の配列があればそれは0からになります。 'これは、EXCELの仕様だと思ってください。 If Range("A2") = "" Then MsgBox "処理DATAが入力されていません。" & Chr(13) & "処理を中止します。!!" End Else End If '書き出しセル初期化 Range("B2:B100").Clear Temp = Range(Cells(2, "A"), Cells(Rows.Count, "A").End(xlUp)) 'セル範囲をVariant型変数に入れる事で、配列を作成することができます。 'Temp(1 To Cells(Rows.Count, "A").End(xlUp),1)のような縦横の2次元配列 For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row Temp(i - 1, 1) = Format(i - 1, "00") & " " & Temp(i - 1, 1) Next Cells(2, "B").Resize(UBound(Temp), 1).Value = Temp 'これで、配列に格納したデータを一括でセルに出力する事が出来ます。 'UBoundを使うと配列の最大インデックス数を取得 ' さらに「Resize」と組み合わせることで配列の範囲を自動調整 ' 「Resize」+「UBound」で配列範囲を自動調整 Resize(UBound(Temp), 1)の型式は定番 End Sub

その他の回答 (4)

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.4

> Cells(行番号, 列番号) > と同じ考えで処理できます 説明が下手でした。 Cells(1,1) はA1を示しますが Temp(1, 1) は読み込んだセルの左上端のセルの値になります。 今回の場合は Cells(2, "A") が左上端なので A2の値 になります。

NuboChan
質問者

お礼

Sub セル連番付加配列_2()とSub セル連番付加配列_3()の違いが 説明でされると理解できました。 Sub セル連番付加配列_3()でのTempが()付きで無いのを見をとしていました。 配列の方に目が言っていて普通の変数である事を 「上記の場合単に変数でもいいのではと思います。」と説明されていたのに 「上記」に引っ張られて上に書いていた「Sub セル連番付加配列_2」の事思っていたのが大きなミスになりました。 kkkkkmさんの「Sub セル連番付加配列2()」についてですが (私のコードの「Sub セル連番付加配列_2()」と見た目が見ているので紛らわしいのですが....) 記載されているのは、 Dim Temp As Variant とTemp()では無いので配列でしょうか? Temp(i - 1, 1)と2次元配列のように見えますが? 又、 配列は、Option Baseで1を宣言しない限り配列の添え字の最小値は「0」からになるので A列の左端は、temp(0,1)となるの無いですか? range("A1")つまりcells(1,1)は見出し列で実際のDATAは、range("A2")つまりcells(2,1) となりますが、添字の関係が今市見えてきません。 tempの配列 temp(0,1) temp(1,1) temp(2,1)

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

> Preserveで「データの値を保持したまま配列の要素数を変更する」のはなぜですか? 配列にしたのにそれまでの値を保持せず、以後その配列を利用しないのでしたら、配列ではなく「単に変数でも」になると思います。質問で配列にとあったのでその後になにかしら利用する可能性を考えてデータを保持しています。 > Sub セル連番付加変数_3()について > > ここでは、Dimで最初の配列を宣言しただけで > ReDimで配列を再宣言していませんそれでも正常にB列に出力されています。 配列ではなく普通の変数ですので。 > 最後の「A列を配列に入れて処理する」するマクロは > 私には、理解が難しい内容です。 配列繋がりで記載しました。データ量が多い場合には、データを一気に多次元配列に入れて配列で処理して一気にセルに書き戻すと処理が早くなります。きっと。 Temp = Range(Cells(2, "A"), Cells(Rows.Count, "A").End(xlUp)) で一気に読み込んで Temp(行番号, 列番号) となりますから Cells(行番号, 列番号) と同じ考えで処理できます。ただし、セルに対するプロパティやメソッド及び列番号に"A"などは使えません。

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

> 配列に一時的に値を格納する事で処理する事 値を配列に格納するということで思いついたものを Sub セル連番付加配列() Dim i As Long Dim Temp() As Variant For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row ReDim Preserve Temp(i - 1) Temp(i - 1) = Format(i - 1, "00") Cells(i, "C") = Temp(i - 1) & " " & Cells(i, "A") Next End Sub 上記の場合単に変数でもいいのではと思います。 Sub セル連番付加変数() Dim i As Long Dim Temp As Variant For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row Temp = Format(i - 1, "00") Cells(i, "C") = Temp & " " & Cells(i, "A") Next End Sub A列を配列に入れて処理する Sub セル連番付加配列2() Dim i As Long Dim Temp As Variant Temp = Range(Cells(2, "A"), Cells(Rows.Count, "A").End(xlUp)) For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row Temp(i - 1, 1) = Format(i - 1, "00") & " " & Temp(i - 1, 1) Next Cells(2, "C").Resize(UBound(Temp), 1).Value = Temp End Sub

NuboChan
質問者

お礼

配列を利用したコードをありがとうございます。 教えてもらったコードを参考に以下のように一部修正しました。 Sub セル連番付加変数_2()について ReDim Preserve Temp(i - 1) と配列の要素数を宣言していますが ReDim Temp(i - 1) としてもB列の結果に変化は無いのですが Preserveで「データの値を保持したまま配列の要素数を変更する」のはなぜですか? (ReDim Preserve Temp(i - 1) では無くReDim Temp(i - 1)としないのはなぜですか?) Sub セル連番付加変数_3()について ここでは、Dimで最初の配列を宣言しただけで ReDimで配列を再宣言していませんがそれでも正常にB列に出力されています。 ReDimを使用すべきかの判断がよく判りませんでした。 最後の「A列を配列に入れて処理する」するマクロは 私には、理解が難しい内容です。 Sub セル連番付加配列_2() Dim i As Long Dim Temp() As Variant '可変長配列の宣言 (宣言時には要素数は指定しない) 'ReDimステートメントを使って配列の要素数を変更した場合、 ' 元のデータはすべて消えてしまいますので注意してください! 'また、データ型の変更が可能なのは, ' 可変長配列の宣言時にバリアント型で宣言した場合だけになります。 'データの値を保持したまま配列の要素数を変更したい場合は, ' ReDim Preserveステートメントを使用します。 If Range("A2") = "" Then MsgBox "処理DATAが入力されていません。" & Chr(13) & "処理を中止します。!!" End Else End If '書き出しセル初期化 Range("B2:B100").Clear For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row ReDim Preserve Temp(i - 1) 'ReDimで配列の要素数の上限を指定する Temp(i - 1) = Format(i - 1, "00") Cells(i, "B") = Temp(i - 1) & " " & Cells(i, "A") Next End Sub '----------------------------------------------------------------- Sub セル連番付加変数_3() Dim i As Long Dim Temp As Variant If Range("A2") = "" Then MsgBox "処理DATAが入力されていません。" & Chr(13) & "処理を中止します。!!" End Else End If '書き出しセル初期化 Range("B2:B100").Clear For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row Temp = Format(i - 1, "00") Cells(i, "B") = Temp & " " & Cells(i, "A") Next End Sub

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

B列に入れずにそのままでいけると思います。 Sub セル連番付加() Dim i As Long For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row Cells(i, "C") = Format(i - 1, "00") & " " & Cells(i, "A") Next End Sub

NuboChan
質問者

お礼

kkkkkmさん、ありがとうございます。 いただいたコードで処理できました。 今回は、仮セルを使わずに処理できましたが 出来ない場合を想定して 配列に一時的に値を格納する事で処理する事も出来ると思いますが その場合はどのようなコードになりますか? 私が最初に例に上げたコードを元に教えていただければ嬉しいです。

関連するQ&A

  • vba 日付時刻のセル エラー13型が一致しません

    日付の入ったセルと時刻の入ったセルを合算させようとするとエラーが生じます。 エラー13「型が一致しません」と表示されます。 エラーが生じないようにするにはどうしたよいでしょうか? Option Explicit Public num As Integer Sub newmacro() For num = 1 To Range("a1").End(xlDown).Row Cells(num, "F").Value = (Cells(num, "D").Value + Cells(num, "E").Value) - (Cells(num, "B").Value + Cells(num, "C").Value) Next num End Sub

  • エクセルVBAでセル選択するコードが変

    エクセルのワークシートでVBAでセル選択するコードで理解に苦しむことがあります。 通常、Cells(2, 1)はセル番地で言えばA2セル Cells(4, 1)はセル番地で言えばA4セルです。 しかし、 With .Range("B5:B15")でくくれば  .Cells(2, 1)はセル番地で言えばB6セルだと思います。 .Cells(4, 1) はセル番地で言えばB8セルだと思います。 ところが下記のコードを動かすと、なぜかC10:C12が選択されてしまいます。 この理屈がわかりません。 Sub test02()   With Sheets("Sheet1")     With .Range("B5:B15")       .Range(.Cells(2, 1), .Cells(4, 1)).Select     End With   End With End Sub なお、 .Range(.Cells(2, 1), .Cells(4, 1)).Selectを .Range(“A2:A4”).Selectに書きかえると、希望のB6:B8が選択されます。

  • セルのバイト数をカウントして文字を付加する方法2

    http://okwave.jp/qa/q7971095.html で後述のマクロを紹介していただきましたが、 B列の値のバイト数が4バイトの場合、その値の最後から1つ目と2つ目の間に●を付加するマクロの場合はどのように改造すればよいのでしょうか。 B列の各セルですが、Nulではなく何かの値が必ずあるという前提で構いません。 Sub Sample1() Dim i As Long For i = 2 To Cells(Rows.Count, 2).End(xlUp).Row If LenB(Cells(i, 2)) = 4 Then Cells(i, 2) = "●" & Cells(i, 2) & "★" End If Next i End Sub Excelのバージョンは2007を使用しています。

  • VBAについて

    現在マクロ勉強中です。 教えて頂きたいのは、登録ボタンで指定セルの台帳への転記する方法です。 Private Sub cmdToroku_Click() Dim myrow As Integer Option Explicit With ActiveSheet If .Range("A4").Value = "" Then myrow = 1 Else myrow = .Range(Cells(.Rows.Count, 1).End(xlUp).Address).Row + 1 End If .Cells(myrow, 1).Value = TextBox1.Value End With End Sub 上記ですと、開いているシートのA1に入力されてしまいます。 別シートへ転記したい場合どのあたりを修正すればよいのでしょうか? お力お借りできれば幸いです。

  • 同じセル位置にシートの連番をつけたい

    Excel2007でマクロ作成の初心者です。 すべてのシートのR15セルに、シートの順番どおり 1から連番で番号をつけたいです。 途中でシートを削除したときも、即座に新しい連番が表示されるようにしたいです。 どうつくったらいいか、皆目わかりません。よろしくお願いします。 Sub test() Dim i As Integer For i = 1 To (Worksheets.Count - 3) Cells(18, 15) = Worksheets(i) Range("R15").Formula = "="1"" Next i End Sub

  • VBA For Eachでセル内の文字列を一個ずつ取り出すには

    エクセル2000です。 たとえばA1セル内の文字列を一個ずつ取り出す場合、 Sub test01() For i = 1 To Len(Range("A1").Value) Cells(i, "B").Value = Range("A1").Characters(i, 1).Text Next End Sub このように最初から最後の文字まで何番目で指定することはわかるのですが、これをFor Each で回すにはどうしたらよいでしょうか? (⌒o⌒)? お教えください。 Sub test02() For Each ch In Range("A1").Characters i = i + 1 Cells(i, "B").Value = ch Next End Sub ではエラーになります。

  • 2つのVBAを組み合わせる方法

    お世話になります、2つのVBAを組み合わせる方法で迷っています。 1つ目が Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Intersect(Target, Range("C1,B9:B39")) Is Nothing Or Target.Count > 1 Then Exit Sub Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True End Sub です。 2つめが Private Sub Worksheet_Change(ByVal Target As Range)  Application.EnableEvents = True If Intersect(Target, Range("R8:R38")) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End Sub です。2つのPrivate Sub Worksheet_Change(ByVal Target As Range)イベントのVBAですが、どのようにして組み合わせれば良いのでしょうか?

  • VBAのループ処理について

    VBA(Excel2000)にて、参考書等を見て下記のコードを作成しました。 「セルA1かA10において、同じ数値が続けて入力されたら、最後のセル(一番下のセル)をB列にコピーする。」 Sub ループ() Dim a As Long With Range("a1:a10") For a = 1 To .Count - 1 If .Cells(a).value <> .Cells(a + 1).value Then .Cells(a, 2).value = .Cells(a).value End If Next .Cells(.Count, 2).value = .Cells(.Count).value End With End Sub 上記の「For idx = 1 To .Count - 1」の意味が分かりません。 よろしくお願いします。

  • セル値

    すみません エクセルVBA勉強中のものですが、セルA1とA2がブランクだったら、セルB1に”あ”を表示するという式を作ったのですがうまく動いてくれません ご指導のほどお願いします。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Cells(1, 1).Value <> "" & Cells(2, 1).Value <> "" Then Cells(1, 2).Value = "あ" End If End Sub

  • 連続データのVBAの質問

    お世話になります。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long, k As Long, myNum As Long If Range("C1") <= Date - Day(Date) Then Exit Sub If Not Intersect(Target, Range("C1,B9:B39")) Is Nothing And Target.Count = 1 Then Application.EnableEvents = False With Target If .Column = 3 Then myNum = WorksheetFunction.Max(Range("B9:B39")) If IsDate(.Value) Then For i = 9 To 39 If Cells(i, "A").Value = "" Then Cells(i, "B").Value = "" Else Cells(i, "B") = myNum + i - 8 End If Next i End If Else i = .Row If .Value = "" Then Range(Cells(i + 1, "B"), Cells(39, "B")).ClearContents Else For k = i + 1 To 39 If Cells(k, "A").Value = "" Then Cells(k, "B").Value = "" Else Cells(k, "B") = Cells(k - 1, "B") + 1 End If Next k End If End If End With Application.EnableEvents = True ElseIf Not Intersect(Target, Range("R8:R38")) Is Nothing Then Application.EnableEvents = False Range(Cells(Target.Row, 18), Cells(39, 18)).Value = Target.Value Application.EnableEvents = True End If End Sub これはセルC1に年月を表記させ、そのC1セルの年月を変更した場合B9~B39のセルが自動で連続データの数字を記入し、B9~B39のどこかのセルを空白にすると、そのセル以降も空白になります。 そこで質問ですが、例えばB14の数字を消すとB15~39まで空白のセルになります。そして、B20に1と入力するとB21~39に連続データの数字が自動記入されます。 そしてC1の年月を次の月に更新した際は、B39で示された数字以降の連続データをB9に表示させるには、どうすれば良いでしょうか?

専門家に質問してみよう