★ Access2000VBA・Excel2000VBA独学 ~ ExcelVBAで、行1行分の指定や選択・挿入・追加などの方法、いろいろ。(テーブル機能を使わない普通の場合と、テーブル機能を使う場合)~プラス、ついでに2行ごと、3行ごと、x行ごと、なとで、「下へずれて選択する」方法も少し。テーブル機能を使わない場合は、主に、Range.ResizeとRange.Offsetプロパティで。
★ はじめに
セル範囲の選択や操作には本当に色んな方法がありますが、その中でも特に、
「1行選択(あるいは指定)して、途中の行に挿入したり、最終行に追加したり」
という処理は多いです。
(愚かな方法なのでやめることを推奨しますが)特に、「顧客データ」を、ユーザーフォームから入力したいなどの場合も、ユーザーフォーム上のテキストボックスのデータをシート側(一覧表)に転記するような処理でも使います。
なので、ここではその、
「1行選択(あるいは指定)して、途中の行に挿入したり、最終行に追加したり」
ということのテストをしてみたいと思います。
※重要な補足
「顧客データ」入力でいちいちユーザーフォームを使うのはロスが多くて愚かな方法です。
「顧客データ入力」じゃなくても、「一覧表データをつくりたい」という要望がある時に、いちいち手間のかかるユーザーフォームを使うのは、プログラム作成や修正、機能追加、等々の時間をドブに捨てるようなものです。
「絶対にやめましょう」。(どうしてもやむを得ない場合以外は)
データを横方向に入力するのが目が疲れるなら、ユーザーフォームではなくシートをフォームに見たてて代用する方が(セルやシートなどの色んな機能が使えるため)、はるかに効率的です。
例
(ExcelのショボいユーザーフォームよりもシートやAccessフォームの方が50倍良いです)
★★★★★★Access2000VBA・Excel2000VBA独学~配列を利用しての、新規レコードの一括セルデータ(レコード)追加のプログラム・その2。~顧客マスタ入力~ワークシートをフォームに見立てて、縦長のデータの行と列を入れ替えながら他のシートへ転記するサンプル。~
あるいは、
・オプション設定に関係なく
・Enterで右へセル移動でき、
・表の右端を自動検知して
・次行の先頭に折り返すプログラム
を作って、普通に一覧表にダイレクトに入力したほうがいいです。
シートを入力フォームとして代用すれば、拡大縮小して(文字を大きく小さく)もラクですし、データの入力制限は「入力規則」などを使えば、入力ミスの防止策としても結構なことができます。
作り変え、作り足し、もラクです。
ユーザーフォームのほうが「見た目的にカッコイイ気がする」かもしれませんが、大変無礼ですみませんが、そういう考え方は(上から目線で本当にすみませんがでもマジで)「愚の骨頂」といいますか・・・、「効率のことを無視しています」ので、無駄だらけとなり、コスパも最悪となります。
誰かが言っていても絶対に真似しなようにしてください。
作成やメンテの無駄なコスト(時間・金額)が2倍どころか、3倍も4倍もかかるようになってしまいます。
特に、最近の愚かな「教科書」を名乗るような、VBAの市販書籍などに そういうサンプルが多いので、間違ってもあこがれなどは持たぬよう、騙されないように気を付けてください。
仕事の時間をムダに奪われて、「本来かける必夜の無い」「無駄なプログラム作成用・改修用の人件費」を「垂れ流すだけ」です。
本当に、無責任でバカな市販書籍の著者やサイトには、騙されないようにご注意ください。
★ サンプルのダウンロード
いちおう、ESETでウィルスチェックしてあります。
解凍すると、「行1行分の指定や選択・挿入・追加など.xlsm」が出てきます。
解凍できましたら、VBEを開いて下記のプログラムをF8キーでステップ実行してみたり、
コードの「行や列の値」を変えたりして、ご自分でも色々と試してみてください。
前半のプログラムでInsert(行の挿入を)するときに、
セルの書式もついでにコピーしたい場合は、
o_WS01.Rows.Item(i_Row).Insert
を
o_WS01.Rows.Item(i_Row).Insert xlDown, xlFormatFromLeftOrAbove '書式もコピー
に書き換えます。
後半のプログラムでは、
「With o_List01.ListRows.Add(Position:=2)」
の部分は、
例えば
「Dim o_RtnNewRow01 As ListRow
Set o_RtnNewRow01 = o_List01.ListRows.Add(Position:=2) 」
みたいにやっておいてから、
「With o_RtnNewRow01
~ ~
~ ~
End With 」
などとやってほうがラクで見やすい?かも?
あと、ついでにですが、
組み込みのメソッドを全部「Call」で呼び出して、
変数やプロパティへの値の代入には全部「Let」を付けてみました。
一般的にはそんなことしませんが、
『 組込のメソッドはCallで呼び出せる=なら組込のメソッドの「実体・実態・正体」は、「SubかFunctionプロシージャ」では無いか?と推測できる。なぜならCallはSubとFunctionだけしか呼び出せない命令だから。 』
ということと
『 プロパティ項目への値の代入であっても、その命令文は ” 代入ステートメント ” には違いはないので、Let を使うことができるのでは?という実験を検証した。& そんなこと考えたことすらない = ” ステートメント ” の意味をまるでわかってない講師が多い?ことへの警鐘 & そんな4流以下の講師にテキトーなレッスンされて、だまされないように気を付けて。 』
という理由から、
「なぜ?」
「4流以下の講師を疑う。」
「日本のVBA教育を疑う。」
という意識をもってほしいと思ったので、そうしてみました。
参考URL
【最終行】
ワークシートの最終行、最終列を取得する
ワークシートの最終行、最終列を取得する(まとめ)
【行の挿入】
https://excel-ubara.com/excelvba2/EXCELVBA016.html
https://www.tipsfound.com/vba/08004
https://akira55.com/insertdelete/
Google検索「vba 行 挿入 書式」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 |
' ' Option Explicit ' ' '######################################################### '「テーブル」機能を使わない場合の1行の選択や '挿入、新規追加、など。 'F8キーでのステップ実行で少しずつ確認してください。 '######################################################### Sub GyouSousa() Dim o_WS01 As Worksheet Dim i_Row As Long ' Set o_WS01 = Application. _ ' ActiveWorkbook. _ ' Worksheets.Item("普通の表") ' Set o_WS01 = Application. _ ActiveWorkbook. _ ActiveSheet Stop 'これ以降をF8キーのステップ実行してみてください。 Call o_WS01.Activate '★ 行を指定する処理 'http://www.niji.or.jp/home/toru/notes/8.html 'http://www.niji.or.jp/home/toru/notes/8-2.htmlを参照。 '(ぞれぞれの方法の欠点が分かります。) '▼任意の行を手動指定 ' Let i_Row = 3 '▼新規の行を自動指定(フィルタ考慮に入れてない) ' ↓End(xlUp)利用(表の上に空白セルがあっても無くても、セル書式がどうであっても関係なし。 Let i_Row = o_WS01.Cells(Rows.Count, "B").End(xlUp).Row + 1 '最終行に空白セルがある列はダメなので、連番列などの絶対に空白が無い列でやるしかない。 ' ' ↓UsedRange利用で表の上に空白が無い場合。 ' Let i_Row = o_WS01.UsedRange.Rows.Count + 1 '値の入っているセルのみ。ただし、行の高さやセル書式の変更された空白セルを含む ' Let i_Row = o_WS01.UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row + 1 '値の入っているセルのみ。 また、行の高さやセル設定の変更された空白セルを含まない ' ' ↓UsedRange利用で表の上に空白行がある場合。(空白行にセル書式が何も設定されてないことが前提) ' Let i_Row = o_WS01.UsedRange.Row + o_WS01.UsedRange.Rows.Count ' Let i_Row = o_WS01.UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row + 1 '★★ この式だと「End(xlUp)」みたいに、下からチェックするので、表の上に空白行があっても無関係なので大丈夫。 Call o_WS01.Range("A1").Select 'とりあえずA1セルを選択しておく '★ 1行分のセル範囲を選択する処理 '選んだ行で1行選択する(列数を明示的に指定して。起点のセルの「列」や選択するセル範囲の列数は手動設定。) '「Range.Resize」を使った場合。 '(表の右端の位置は手動設定になります。) ' 特に理由が無い限りは、「Range.Resizs」プロパティを使うほうが、 '「Range.Resizs」プロパティを使うよりも分かりやすいし変数ともからめやすいと思います。 Rem 行数も列数も、「1スタート」なので、わかりやすい。 '★★★ Call o_WS01.Range("B" & i_Row).Resize(1, 3).Select 'Worksheet.Rangeを使った場合。 Call o_WS01.Range("A1").Select '★★★ Call o_WS01.Cells(i_Row, 2).Resize(1, 3).Select 'Worksheet.Cellsを使った場合。 Call o_WS01.Range("A1").Select '↑「Range.Resize」は性格的に「1スタート」なので、新規行を表現するのには、 ' 「Range.Offset」の場合とは異なり、行の数値で「-1」をする必要はありません。 '「ActiveWindow.Selection(あるいはApplication.Selection)」と '「Range.Resize」を組み合わせて使った場合 ' こちらも、特に理由が無い限りは、「Range.Resizs」プロパティを使うほうが、 '「Range.Resizs」プロパティを使うよりも分かりやすいし変数ともからめやすいと思います。 Call o_WS01.Range("B" & i_Row).Select '★★★ Call ActiveWindow.Selection.Resize(1, 3).Select Call o_WS01.Range("A1").Select Call o_WS01.Range("B" & i_Row).Select '★★★ Call Selection.Resize(1, 3).Select '「ActiveWIndow.」を省略して「Selection」だけを書くと、Application.Selection と同様の結果になります。もちろん、オブジェクト階層構造が理解できるまでは、省略しないほうがです。 '↑ Selectionプロパティは、「ActiveSheet(Worksheet単一オブジェクト)」や ' 「ActiveWorkbook(Workbook単一オブジェクト)」では使えません。 ' それらのプロパティだと勘違いして使うと(=書くと)、エラーになるので注意が必要です。 ' Selectionプロパティは、もともと、「 ActiveWindow か あるいは Application 」でしか使えません。 Call o_WS01.Range("A1").Select '★★★ Call o_WS01.Range("B" & i_Row).Resize(1, 3).Select '↑ほんとはいちいち事前に B1セルをSelectするのはやめて、 ' こう書けばいい。 Call o_WS01.Range("A1").Select '「Range.Offset」を使った場合で、かつ、あえて「i_Row」の値を新規行の値として使いたい場合 '★★★ Call o_WS01.Range(Cells(2), Cells(4)).Offset(i_Row - 1, 0).Select '↑ Offsetは性格的に「0スタート」なので新規行を表現するのには「-1」が必要となります。 ' また、この例のように「i_RowとOffsetを両方同時に使いたいとき」は、 ' 基準のセル範囲を Range("B2:D2") ではなく、 ' 『 Range("B1:D1")とか Range(Cells(2), Cells(4)) など (つまり1行目)』、 ' にしないといけなくなります。 ' ' ★ なお、「 o_WS01.Range(Cells(2), Cells(4)) 」は ' 1行目の1列目のセルから順番に数えた数字を、カッコの中に入れています。 ' が、 ' 「o_WS01.Range(Cells(1, 2), Cells(1, 4)) 」と同じ意味になります。 ' 「カッコの中の数字が、列番号と ”イコール ”」なります。 ' ただ、、 ' 「 o_WS01.Range(Cells(2), Cells(4)) 」がそうなれるのは ' 「1行目に限って」、です。 ' (2行目以降はカッコの中の数字は列番号とイコールになりません。 ' 2行目の2列目と4列目を数字だけで表した場合は ' 「 o_WS01.Range(Cells(16386), Cells(16388)) 」になります。) ' よって、「o_WS01.Range(Cells(××, 2), Cells(××, 4)) 」と ' 書かないといけなくなります。 ' ' つまり、「空白行となってしまっている ”1行目 ”の2列目~4列目」を基準のセル範囲としています。 ' つまり、基準となるセル範囲については、「項目名の行」を無視して、 ' 「値があろうが無かろうが、1行目を基準に」、考えています。 ' もう少し言うと、「項目名の行」の「行の位置」は「無視」して、 ' 「列の位置だけ」を「意識」しています。 Call o_WS01.Range("A1").Select ' 「Range.Offset」を使った場合で、基準のセル範囲をRange("B2:D2")にしたい場合。 ' =「i_Row02」の値を新規行の値として使う場合。 Dim i_Row02 As Integer i_Row02 = (i_Row - 1) - (o_WS01.Range("B4").Row - 1) + 1 '←この場合でのラストの「+1」は「新規行」の意味です。 Rem ↑(o_WS01.Range("B2").Row - 1) の「-1」は、「その行の直前の行=1行差し引いた行」を表したいので、差し引いていて、 Rem (i_Row - 1)の「-1」は、今現在「i_Row」は「新規の空白行」になってしまってるので、そうじゃなくて、 Rem 「値の埋まった ”最後の行 ”」を表したいために、それの分の「1」を差し引いています。 Rem ということは、結局は、 Rem 『 i_Row - o_WS01.Range("B4").Row + 1 が表の「項目名の行」を基準にした新規の行の位置 』、 Rem ということと同じ事ですけど・・・。 Stop '★★★ Call o_WS01.Range("B4:D4").Offset(i_Row02 - 1, 0).Select Rem ↑「Range.Offset」は性格的に「0スタート」なので、 Rem 「-1」しないと新規行を表現できません。 Rem もしかしたら「配列」(これも基本 性格的に「0スタート」)でのセルの操作 Rem と相性がいいかも? Rem そういう用途じゃなければ、「Range.Resize」プロパティを使うほうが、 Rem 行数も列数も、「1スタート」なので、わかりやすい。 Stop '表の中の行を1行選択する '「End(xlToRight)」を使った場合。 '「End(xlToRight)」で表の右端の位置を自動設定。 '(自動設定はいいのですが、ただし、「表の右端に絶対に値が入っていないといけない」ので使えないこともあるので注意が必要です。Excelってデータベースソフトと違ってこういうところがマヌケというか面倒くさいです。他にも面倒くさいところが多いです。) Let i_Row = i_Row - 2 '操作対象の行の位置を、「 ”行挿入したい ”、独自に指定した行 」の位置に変更。設定。 Dim o_StartCel As Range Set o_StartCel = o_WS01.Range("B" & i_Row) '起点のセルを変数化して扱いやすくする。 '★★★ Call o_WS01.Range(o_StartCel, o_StartCel.End(xlToRight)).Select ' ↑ Call o_WS01.Range(起点セル, 起点セル.End(xlToRight)).Select ' という構文です。 ' つまり、 ' Call o_WS01.Range(起点セル, 終点セル).Select ' ということを表している構文です。 ' これも「1行」を表現する構文のひとつです。 '新規の行を選択 ' i_Row = o_WS01.UsedRange.Find("*", , xlFormulas, , xlByRows, xlPrevious).Row + 1 Stop '行を挿入して値を代入 Call o_WS01.Rows.Item(i_Row).Insert '↑もし複数行を挿入するには、 ' .Insert や Rows("3:5").Insert、Range("3:5").Insert 、 ' あるいは、Range("B4:D6").Insert など。 ' ただし、Range("B4:D4").Insertは「行」の挿入ではなく、 ' 「セル」の挿入になってしまうので注意。 ' あと、Range("3:5").Insertも少し性格が異なるかもなので、注意。 Let o_WS01.Cells(i_Row, 2).Resize(1, 3).Value = Array(9, 9, 9) '値を代入 End Sub '############################################################### '以下は、表を「テーブル」に変換した場合の、 '新しい行の追加、挿入。 '※「テーブル」にすると追加と挿入がラクになる。 '############################################################### Sub TableRowAdd01_NoWith_1Code() Dim o_WS01 As Worksheet Dim o_List01 As ListObject Set o_WS01 = Application. _ ActiveWorkbook. _ Worksheets.Item("テーブル機能の表") Set o_List01 = o_WS01.ListObjects.Item("テーブル1") Call o_WS01.Activate 'リストの列名を含めない2行目(つまり列名の下の下)に挿入追加 Let o_List01.ListRows.Add(Position:=2).Range = Array(1, 1) 'ラスト行の下の新規行に追加 Let o_List01.ListRows.Add.Range = Array(1, 1) End Sub Sub TableRowAdd02_ByWith01() Dim o_WS01 As Worksheet Dim o_List01 As ListObject Set o_WS01 = Application. _ ActiveWorkbook. _ Worksheets.Item("テーブル機能の表") Set o_List01 = o_WS01.ListObjects.Item("テーブル1") Call o_WS01.Activate 'リストの列名を含めない2行目(つまり列名の下の下)に挿入追加 ' Let o_List01.ListRows.Add(Position:=2).Range = Array(1, 1) 'Withを使ってやってみる。 '(5パターン。どれも結果は上記の1文の動きと同じ。また、3つ目以降は相対的なRange。 ' ※2つ目までのやつも、ListObject を使ってる時点で、すでに相対的なのかも。) ' With o_List01.ListRows.Add(Position:=2) ' Let .Range(1) = 1 ' Let .Range(2) = 1 ' End With ' With o_List01.ListRows.Add(Position:=2) ' Let .Range(1, 1) = 1 ' Let .Range(1, 2) = 1 ' End With ' With o_List01.ListRows.Add(Position:=2) ' Let .Range.Range("A1") = 1 ' Let .Range.Range("B1") = 1 ' End With ' With o_List01.ListRows.Add(Position:=2) ' Let .Range.Columns(1) = 1 ' Let .Range.Columns(2) = 1 ' End With With o_List01.ListRows.Add(Position:=2) Let .Range.Cells(1, 1) = 1 Let .Range.Cells(1, 2) = 1 End With 'ラスト行の下の新規行に追加 Let o_List01.ListRows.Add.Range = Array(7, 7) End Sub ' |
★ Range.Offsetで、1行ずつを、下へ、選択・移動の場合
※Range.Resizeでの「下への移動」の場合も、Offsetよりもラクかも??
ただ、カウンタ変数(繰り返しの値)は、「最初の複数行」を選択したい場合などは、「0スタート」になってしまう。
'1行分を i 行飛ばしで。
ActiveSheet.Range("A1:D1").Offset(i * 3, 0).Address
'1行ずつ基準セル範囲側で移動
? ActiveSheet.Range("A" & 2 & ":D" & 2).Offset(1 , 0).Address
? ActiveSheet.Range("A" & 3 & ":D" & 3).Offset(1 , 0).Address
? ActiveSheet.Range("A" & 4 & ":D" & 4).Offset(1 , 0).Address
? ActiveSheet.Range("A" & 5 & ":D" & 5).Offset(1 , 0).Address
? ActiveSheet.Range("A" & i & ":D" & i).Offset(1 , 0).Address
--
結局
? ActiveSheet.Range("A" & i & ":D" & i).Address
や
? ActiveSheet.Range(Cells(i,1),Cells(i,4)).Address
とやるか、以降のようにするかのどちらか?
'1行ずつを、基準セル範囲側の設定ではなく、Range.Offsetの側で設定して移動
表の列名のセルを指定して「i」を最新行の数字にする。
(表の周囲に空白の行や列があっても)
? ActiveSheet.Range("A1:D1").Offset(0 , 0).Address
? ActiveSheet.Range("A1:D1").Offset(1 , 0).Address
? ActiveSheet.Range("A1:D1").Offset(2 , 0).Address
? ActiveSheet.Range("A1:D1").Offset(3 , 0).Address
? ActiveSheet.Range("A1:D1").Offset(i , 0).Address
? ActiveSheet.Range(Cells(1,1),Cells(1,4)).Offset(i,0).Address
? ActiveSheet.Range(Cells(1),Cells(4)).Offset(i,0).Address
Range.Resizeで、1行ずつ下へ移動する場合
ActiveSheet.Cells(i,1).Resize(1,4).select
↑「起点のセル=起点のRangeオブジェクト」を表現するのに、Rangeプロパティを使わずに、Cellsプロパティを使います。
Offsetと違って「起点のセル範囲」の設定をするのに、「単一セルで済ませられる」=「1行分の全部のセルじゃなくてもよい」からです。
Offsetの起点セル範囲の場合は、セル範囲を「行の全部のセル」を指定しないといけません。
カウンタ変数の i は、1スタートで行けるので、これもラク。
※ただし、Offsetじゃないとダメなケースももちろんあると思いますのでResizeを妄信しいないようにご注意を。
===
★ Range.Offsetで、複数の行ずつを、下へ、選択・移動の場合
※Range.Resizeでの「下への移動」の場合は、
「1行ずつ」なら、Offsetよりもラクだけど、
「複数行ずつ」だと、ちょっと考え方が面倒くさい。逆に、Offsetの方がラク。
一番最後に事例があります。
列構成は変えずに、同じ列に 2行ずつの場合(i は 「2行ずつの i くくりめ」という意味です。)
? ActiveSheet.Range(Cells(1,1),Cells(2,4)).Offset(3*2,0).Address
$A$7:$D$8
$A$5:$D$6
$A$3:$D$4
$A$1:$D$2
つまり、
? ActiveSheet.Range(Cells(1,1),Cells(2,4)).Offset(i*2,0).Address
iには「0」を入れてもエラーにはならない。
===
列構成は変えずに、同じ列に 3行ずつの場合
? ActiveSheet.Range(Cells(1,1),Cells(3,4)).Offset(3*3,0).Address
$A$7:$D$8
$A$5:$D$6
$A$3:$D$4
$A$1:$D$2
つまり、
? ActiveSheet.Range(Cells(1,1),Cells(3,4)).Offset(i*3,0).Address
iには「0」を入れてもエラーにはならない。
===
列構成は変えずに、同じ列に x 行ずつの場合
? ActiveSheet.Range(Cells(1,1),Cells(3,4)).Offset(3*3,0).Address
$A$7:$D$8
$A$5:$D$6
$A$3:$D$4
$A$1:$D$2
つまり、
? ActiveSheet.Range(Cells(1,1),Cells(x,4)).Offset(i*x,0).Address
iには「0」を入れてもエラーにはならない。
※列も変数化したい場合は、
? ActiveSheet.Range(Cells(FirstCelNum,l_ClmnStrt),Cells(x,l_ClmnEnd)).Offset(i*x,0).Address
みたいな感じで?
FirstCelNum は複数行のセル範囲の左上のセルの行の位置
l_ClmnStrtは同じ左上のセルの列の位置
x はくくりたい行数(=右下のセルの行の位置)
l_ClmnEndは右下のセルの列の位置
もう少し簡単にすると、
? ActiveSheet.Range(Cells(AA,BB),Cells(x,CC)).Offset(i*x,0).Address
で、
AA は 複数行のセル範囲の左上のセルの行の位置
BB は 同じ左上のセルの列の位置
x はくくりたい行数(=右下のセルの行の位置)
CC は 右下のセルの列の位置
・・・・という感じ。
★ Range.Resizeで、複数の行ずつを、下へ、選択・移動の場合(列構成は固定)
※Range.Resizeでの「下への移動」の場合も、Offsetよりもラクかも??
ただ、カウンタ変数(繰り返しの値)の i は、「最初の複数行」を選択したい場合などは、「0スタート」になってしまう。
ActiveSheet.Cells(i * x + 1, 1).Resize(x, 4).Select
Cells(i*x+1,1) などの「+1」は、Range.Resize が「1スタートだから?」
「x」は複数行の行数指定。もちろん「1行」の意味で「1」で指定しもOK。
「i」は、「くくり」としての繰り返し回数の指定。ただし、服須行移動の場合は、『 i は「+1」しないといけなくなってしまう 』ため、それに引きずられて i の値は「0スタート」にしないといけない。
あと、「起点のセル=起点のRangeオブジェクト」を表現するのに、Rangeプロパティを使わずに、Cellsプロパティを使います。
Offsetと違って「起点のセル範囲」の設定をするのに、「単一セルで済ませられる」=「1行分の全部のセルじゃなくてもよい」から、OffsetじゃなくてResizaが使えます。
(Offsetの起点セル範囲の指定の場合は、セル範囲を「行の全部のセル」を指定しないといけません。)
※ただし、Offsetじゃないとダメなケースももちろんあると思いますのでResizeを妄信しいないようにご注意を。
なお、2列め~4列目までの「3列分」で下へ移動するなら、以下のようになります。
ActiveSheet.Cells(i * x + 1, 2).Resize(x, 3).Select
- 投稿タグ
- 「ニセモノ」への道, 「本物」に近づくために, AccessVBA, Accessの独学, Access操作の基礎, ADO/DAO, ExcelSQL, ExcelVBA, Excelの独学, Excel操作の基礎, Excel連携VBA, MicrosoftQuery, ODBC, SQL, パソコンでの自動化, ビジネスパソコンの基礎, ビジネス一般常識, マクロ, ワークシート関数, 独学, 自動化