Excelマクロ初心者のための横に連番を振る方法

このQ&Aのポイント
  • Excelのマクロを使って、セルF4から横方向に1から28までの連番を振る方法を学びたいです。
  • アプリケーションのバージョンや操作環境についても記載されており、初心者にとって理解しやすい内容となっています。
  • また、サンプルコードも掲載されており、実際に試してみることができます。
回答を見る
  • ベストアンサー

f4から右方向に1から28ごとに連続番号を入れたい

Windows7とExcel2007でマクロ作成中の初心者です。 (1)縦の行に連番を振るコードはたくさんありますが、横に連番を振る コードは皆無です。 (2)教えて頂きたいのは、あるセルF4から、右横方向に1から28までの番号を振りたいです。そして29番目からまた、右方向に1から28まで番号を振ります。これを繰り返します。 (3)ただし、今の番号を振る行の下の行の最終列までで終了したいです。 よろしくお願いします。 以下のような縦の例は数え切れないほどサンプルがあります。 Sub 横に番号を振る() Dim i As Long With ThisWorkbook.Worksheets(1) For i = 1 To 28 .Cells(i, "A").Value = i Next i End With End Sub

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

  • ベストアンサー
  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 次の様なやり方もあります。 Sub QNo9037494_f4から右方向に1から28ごとに連続番号を入れたい() Dim FirstCell As Range, LastCell As Range, myRange As Range, c As Range Set FirstCell = Range("F4") Set LastCell = Cells(FirstCell.Row + 1, Columns.Count) _ .End(xlToLeft).Offset(-1) If LastCell.Row < FirstCell.Row Then MsgBox "データがありません。" & _ vbCrLf & "マクロを終了します。", _ vbExclamation, "データ無し" End If For Each c In Range(FirstCell, LastCell) c.Value = 1 + (c.Column - FirstCell.Column) Mod 28 Next c End Sub

その他の回答 (4)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

 回答No.4です。  申し訳御座いません。後で確認しました処、前回回答致しましたVBAの構文中に一部誤りあった事に気付きました。  誤っていたのは、 If LastCell.Row < FirstCell.Row Then という箇所で、正しくは If LastCell.Column < FirstCell.Column Then とすべきでした。  この部分は、「番号を振る行の下の行の最終列」がF4セルがある列(F列)よりも左にあるのかどうかをIf~Then~Endifを使って判定するための部分です。  「『番号を振る行の下の行の最終列』がF4セルがある列(F列)よりも左にある」という事は、即ち、「F5セルから右側にはデータが無い」という事ですので、判定がTrueの場合には番号を振るべきセルが存在しないと見做して データがありません。 マクロを終了します。 という表示を出してから、マクロを終了する処理へと分岐させる為のものなのですが、縦と横を間違えてしまいました。  後それから、誤りと言っても、動作に影響する事は無いものなのですが、 Dim FirstCell As Range, LastCell As Range, myRange As Range, c As Range という箇所の中の myRange As Range, は不要でした。  従って、正しくは次の様なVBAとなります。 Sub QNo9037494_f4から右方向に1から28ごとに連続番号を入れたい() Dim FirstCell As Range, LastCell As Range, c As Range Set FirstCell = Range("F4") Set LastCell = Cells(FirstCell.Row + 1, Columns.Count) _ .End(xlToLeft).Offset(-1) If LastCell.Column < FirstCell.Column Then MsgBox "データがありません。" & _ vbCrLf & "マクロを終了します。", _ vbExclamation, "データ無し" End If For Each c In Range(FirstCell, LastCell) c.Value = 1 + (c.Column - FirstCell.Column) Mod 28 Next c End Sub

aitaine
質問者

お礼

わざわざ、ありがとうございます。締め切った後からこのように手を差し伸べてくださり、うるうる涙です。この前のコードでエラーが出たと思います。(記憶確かでないですが・・)このコードをまた、研究して試してみたいと思います。本当にありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

Sub test01() n = 1 '連番を初期化して1に cr = Cells(5, 1000).End(xlToLeft).Columns MsgBox cr '確認用 For j = 6 To cr 'F列第4行目から右列に連番代入 If (j - 6) Mod 28 = 0 Then '28までで1に戻る繰り返し n = 1 '連番を1に戻す End If Cells(4, j) = n 'F列第4行目から右に連番代入 n = n + 1 Next j End Sub F5から横方向にデータがか言っているとして、なにかのデータを入れて、テスト。 結果は第4行目で1-28を繰り返した。 (1)第5行目のデータのある最右列の捉え方。 (2)隣接する各列に代入する数字で1-28の繰り返しにする方法。 の方がわかってないのではないかな。 -- (1)縦の行に連番を振るコードはたくさんありますが、横に連番を振る コードは皆無です。 「行」の例でできたら、Cells(行、列)の表現法があるのだから、学習者は、類推して、考えて作り替えていると思う。すべて丸ごと本やWEBで得ようとしてもできないよ。 プログラムの上達とは類推できる力(と想像する力)だと思う。特に入試問題などでもそうだ。 このコーナーの質問の回答に対してさえ、多かれ少なかれ、類推力がなければ、自分のケースに合して、役立たせられないのだ。 ーー 上記はありふれた典型的な場合の例データでテストをやったので、実際では特殊な例が起こらないか、考えてください。 >下の行の最終列までで その間に空白セルがないという前提です。 >End(xlToLeft).を使えるのは 第1000列までと仮定したコードです。状況によっては増やしてください。

  • CC_T
  • ベストアンサー率47% (1038/2201)
回答No.2

1,2)Cellsの意味をもう一度おさらいしてください。 書かれているコードの .Cells(i, "A").Value の(i,"A")の部分がそのまま(行,列)を指しています。 ですから例えばそこを(i,i)として実行すると、A1セルからB2セル、C3セル・・・と言う風に右下に向かって斜めに数値が入るわけです。 当然、(1,i)とすれば1行目のA~AL列に、(2,i)とすれば2行目に数値が入ります。 3)最終列を探す方法も幾つかありますが、その1つ。  Last_Colum = Cells(B, Columns.Count).End(xlToLeft).Column これは、指定した行の右端から検索していって入力済みのセルの列数を得るコードです。 Bの部分に「今の番号を振る行の下の行」番号を入れれば、Last_Columという変数に「番号を振る行の下の行の最終列」の数値が書き込まれますので、 Do while~Loop や for~next など繰り返し処理を使って1列目からLast_Colum列まで繰り返し処理を実行させればよです。  入れ子構造の繰り返し処理になります。 Sub 番号を振る() Dim a As Integer, b As Integer, L As Integer a = 0 b = 0 'どこまで続けるかを取得(ここでは入力済みの4行目を基準にする) L = Cells(4, Columns.Count).End(xlToLeft).Column 'aがLに届くまで繰り返し処理 Do While a < L  a = a + 1  b = b + 1  Cells(3, a).Value = b   'bが28になったらbの値はリセットしよう   If b >= 28 Then b = 0 Loop End Sub

  • f272
  • ベストアンサー率46% (8012/17126)
回答No.1

> (1)縦の行に連番を振るコードはたくさんありますが、横に連番を振るコードは皆無です。 それは縦に連番ができるなら普通の人は横に連番も出来るからです。 > (2)教えて頂きたいのは、あるセルF4から、右横方向に1から28までの番号を振りたいです。そして29番目からまた、右方向に1から28まで番号を振ります。これを繰り返します。 F4からAG4に番号をふる例です Sub 横に番号を振る() Dim i As Long With ThisWorkbook.Worksheets(1) For i = 1 To 28 .Cells(4, 5+i).Value = i ’'''''(4)行(5+i)列に値を入れる Next i End With End Sub > (3)ただし、今の番号を振る行の下の行の最終列までで終了したいです。 最終列を探す例をネットで探してください。

関連するQ&A

  • シートの増減あっても特定セルに連番したい

    Excel2007でマクロ作成の初心者です。 すべてのシートのR15セルに、シートの順番どおり 1から連番で番号をつけるマクロを教えていただきました。 Private Sub Workbook_SheetActivate(ByVal Sh As Object) Dim i As Integer For i = 1 To ThisWorkbook.Worksheets.Count Worksheets(i).Range("R15").Value = i Next i End Sub これを以下のように改良したのですが、新しく追加したシートにはなぜか 番号が表示されません。どうしたら、うまく連番が入るようになるでしょうか。 Sub シートに連番() Dim i As Integer For i = 1 To ThisWorkbook.Worksheets.Count Worksheets(i).Range("R15").Value = i Next i End Sub

  • EXCEL VBA: 次の処理のマクロボタン作成

    ConvertシートのA列にあるフルパス付きファイル名を B列から右方向に最大L列までパス区切り文字(\)で分割済みです。 (但し、1行目は見出し行) 列方向(横方向)の分割部分を、横_縦シートの5行目から行方向(下方向)にそのままの順番で配置換え テスト目的で以下のコードを考えて、1行分(i=2)は配置換え出来るのを確認しています。 ここから横_縦シートのどこかにマクロボタンを配置して クリックすると以下を処理したいです。 1)range(”A5”)以下の書き出し分を削除 > 次の書き出しに備える 2)i=3 として 次の書き出しを行う イメージとしては、1行分は配置換えして確認して、ボタンクリックで次を表示して確認を繰り返す ボタンに登録するコードを教えてください。 可能なら、前を表示や処理停止のボタンも作成したいと思っていますのでご指導下さい。 Sub フルパス分割() Dim tmp As Variant Dim Ln As Long, i As Long, ii As Long Dim ws1 As Worksheet, ws3 As Worksheet Set ws1 = Worksheets("Everything") Set ws3 = Worksheets("Convert") Ln = ws1.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Ln ws3.Cells(i, 1) = ws1.Cells(i, 1) tmp = Split(ws3.Cells(i, 1), "\") For ii = LBound(tmp) To UBound(tmp) ws3.Cells(i, ii + 2) = tmp(ii) Next Next End Sub Sub 並べ替え() Dim Ln As Long, i As Long Dim Worksheet, ws3 As Worksheet, ws4 As Worksheet Dim tmp As Variant Set ws3 = Worksheets("Convert") Set ws4 = Worksheets("横_縦") Ln = ws3.Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Ln tmp = Split(ws3.Cells(i, 1), "\") ws3.Range(Cells(i, 2), Cells(i, UBound(tmp) + 2)).Copy ws4.Cells(i + 3, 1).PasteSpecial Transpose:=True Stop Next End Sub

  • Findステートメントで特定の行番号を取得する

    ユーザーフォーム中のテキストボックスに入力した数字を検索してその行番号を返したいと思い以下のコードを書いてみました。 Private Sub CommandButton1_Click() Dim Ylin As Long Dim No As Long No = TextBox1.Text Yline = Worksheets("Sheet2").Range("B").Find("No",LookAt:=lWhole).Rows With Worksheets("ひな型") .Cells(11, "D").Value = ComboBox1.Value .Cells(16, "D").Value = ComboBox2.Value .Cells(27, "F").Value = Cells("Yline", 5).Value End With Me.Hide End Sub すると実行時エラー380となり、どうもRowsourseプロパティを設定できないとの事。さまざまなサイトを検索してみましたがFindステートメント+Rowで行番号を取得している例はいくつも見受けられるためどうにも納得いきません。 ご指摘宜しくお願いします。

  • エクセル 最終行からの連続コピー

    * すぐに回答を! エクセルC20からI51までデータを1日1行ずつ入力します。 データが入力されている最終行から上に連続する10行(最終行含む)をコピーしたいのですが、最終行から10行上をどのように認識させたらいいのか、わかりません。Offsetなど試してみましたがダメでした。 よろしくお願いします。 Sub dataコピー() Dim i As Long Dim j As Integer Dim rng As Range '最後尾から10行前までを選択 With Worksheets("月").Range(Cells(20, 3), Cells(51, 10)) For i = Cells(Rows.Count, 1).End(xlUp).Row To -10? If rng Is Nothing Then Set rng = .Rows(i) End If j = j + 1 If j >= 10 Then Exit For Next i 'コピー If Not rng Is Nothing Then rng.Copy Range("M1") Beep Else MsgBox "該当行は存在しません。", 48 End If End With Set rng = Nothing End Sub コードはこちらを参考にしました ​http://questionbox.jp.msn.com/qa5440189.html

  • EXCELのVBAについて教えてください。

    演習1というシートの(1,1)のセルの値と(1,2)のセルの値を入れ替えるプログラムを作成したいので すがエラーが出て出来ません。コードは下記の様に書きました。 Sub 演習1() Dim sheetobj As Worksheet Dim a As Integer Set sheetobj = ThisWorkbook.Worksheets("演習1") With sheetobj a = .Cells(1, 1) .Cells(1, 1) = .Cells(1, 2) .Cells(1, 2) = a End With End Sub プログラミング自体が本を読んでも分かりません。 宜しければ小学生に教えるように文を訳してくれませんか?

  • 他のシートの任意の列に1行おきに表示する

    よろしくお願いします。 下の構文ですと Worksheets("入力")の3列目5行目以降のデーターが Sheet2の同じ列(3列目)5行目以降に1行おきに表示されます。 これを Worksheets("入力")の3列目5行目以降のデーターを Sheet2の7列目5行目以降に1行おきに表示したいのですが どのように書き直せばよいでしょうか。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim i As Long, j As Long j = 5 With Worksheets("入力") For i = 5 To .Cells(Rows.Count, 3).End(xlUp).Row .Rows(i).Copy Worksheets("Sheet2").Cells(j, 1) j = j + 2 Next i End With End Sub

  • VBAでの処理分岐方法を教えてほしいです

    VBAの分岐処理で悩んでおります。 誰かお助けお願いします。 A列に昇順で番号があります。 1 2 4 4 5 6 9 欠番や重複した数値があります。 やりたいことは欠番箇所に行を挿入し、連番にしたいです。 この例で言うと、3行目に1行を挿入し番号を3と入れる、6行目に2行挿入し7,8と連番にする。 連番になった後に、重複した数値に色を付けます。 以下私が作成したコードです。callで呼び出す予定です。 Sub 欠番判定数式() Dim i As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Cells(i, 3) = "=if(iserror(if(A" & i & "-A" & i - 1 & ">1,""○"","" "")),"""",if(A" & i & "-A" & i - 1 & ">1,""○"","" ""))" Next End Sub Sub 行挿入() Dim c As Range, Target As Range For Each c In Range("C2:C" & Cells(Rows.Count, 1).End(xlUp).Row) If c = "○" Then If Target Is Nothing Then ''(1) Set Target = c Else Set Target = Union(Target, c) ''(2) End If End If Next c If Not Target Is Nothing Then Target.Select Selection.EntireRow.Insert , copyorigin:=xlFormatFromLeftOrAbove End Sub Sub 空白連番入力() Dim i As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 1) = "" Then Cells(i, 1) = (Cells(i, 1).Offset(1, 0).Value) - 1 End If Next End Sub Sub 番号重複確認() Dim i As Integer For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Application.WorksheetFunction.CountIf(Range("$A$2:$A$" & Cells(Rows.Count, 1).End(xlUp).Row), Range("A" & i)) <> 1 Then Cells(i, 1).Interior.ColorIndex = 3 End If Next End Sub このコードを順に全て実行した時、1回目の処理で3行目と5行目に行挿入、そして番号が3と7と入力され連番に色が設定されます。 再度「欠番判定数式」を行い、次は8行目に行挿入し8と連番を入力させ処理を繰り返しさせたいです。 欠番は例として最高2個にしてますが、これから2個以上の可能性もあります。 一度全処理終了後、再度最初の処理(欠番判定数式)に戻り、欠番がある場合は行挿入させという処理を行わせ、欠番がない場合は次の処理に進めるという分岐方法を教えてほしいです。 よろしくお願いいたします

  • エクセル(VBA)で名簿から該当する人を取り出す?

    シート名→ コース別VBA に 表示する窓口を設定しました。 そして、クラス出席番号順 というシート名から そのコース別VBAに表示するという作業です。 表示するのは、番号・名前・住所などです。 一応、下のように打ってみたのですが、 「オブジェクトは、メソッドまたはプロパティをサポートしていません。」 よろしくお願い致します。 Sub コース別表示() Set 窓 = Worksheets("コース別VBA") 引き取り = 窓.Cells(3, 2) Set クラス = Worksheets("クラス出席番号順") 縦 = 6 For 行 = 3 To 351 If クラス.Cells(行, 9) = 引き取り Then 窓.cell(縦, 2) = クラス.Cells(行, 3) 窓.cell(縦, 3) = クラス.Cells(行, 4) 窓.cell(縦, 4) = クラス.Cells(行, 5) 窓.cell(縦, 5) = クラス.Cells(行, 6) 窓.cell(縦, 6) = クラス.Cells(行, 7) 窓.cell(縦, 7) = クラス.Cells(行, 8) 縦 = 縦 + 1 End If Next End Sub

  • 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

  • VBAで、35行3列の範囲を通し番号で埋めたい

    お世話になります。 表題のとおり、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 -------------------------------------- 以上です。 よろしくお願いいたいます。

専門家に質問してみよう