[[20070702161822]] 『VBAで、指定範囲内で指定行ごとに空白行を挿入しax(としまる) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBAで、指定範囲内で指定行ごとに空白行を挿入したい 』(としまる)

 いつも大変お世話になります。
 標題の件にかんしまして、
 以下の内容にて指定行ごとに空白行を挿入することは出来るようになったのですが、
 指定範囲内のみ有効にする方法がわかりません。
 御教授よろしくお願いいたします。

 尚、指定範囲補足として、
 例えば10行目から1000行までを全範囲指定とかというようにしたいです。
 →行指定できると最高!
 (つまり9行目までは挿入したくないデータがある際に役立てたい。)

 Sub 挿入()
 Dim i As Long, a As Long, 設定 As Long

 設定 = InputBox("何行毎に入れるか指定してください。", , 2)
 a = Range("A" & Rows.Count).End(xlUp).Row Mod 設定 - 1
 For i = Range("A" & Rows.Count).End(xlUp).Row - a To 設定 Step -設定
    Rows(i).Insert Shift:=xlDown
 Next i
 End Sub

 よくわからないけど
To 設定 + 10 Step -設定
とかしたらなんか希望に近づくのかしら。
(ご近所PG)


 返信遅れました。
 (ご近所PG)さんご回答ありがとうございました。

 質問を若干変更させていただきます。
 (質問が途中から変わり、まことに申し訳ありません。)
 24行目までは挿入したくないデータがあり25行目からを挿入対象範囲とし
 100行以内の行挿入の繰り返しを実行させるにはどうしたらよろしいでしょうか。
 以前ご指導いただいたVBAではうまく実行できません。
 ちなみに以前のVBAは以下となります。

 Sub 挿入()
 Dim i As Long, a As Long, 設定 As Long

 設定 = InputBox("何行毎に入れるか指定してください。", , 2)
 a = Range("A" & Rows.Count).End(xlUp).Row Mod 設定 - 1
 For i = Range("A" & Rows.Count).End(xlUp).Row - a To 設定 + 25 Step -設定
    Rows(i).Insert Shift:=xlDown
 Next i
 End Sub


 相変わらず私にはよく分からないんだけども、

 >例えば10行目から1000行までを全範囲指定とかというようにしたいです。
 >→行指定できると最高!
誰が、どのタイミングで設定するの?
マクロ書いてる人?
操作してる人?
設定できるとうれしいのは開始行?終了行?両方?

 >100行以内の行挿入の繰り返しを実行させるにはどうしたらよろしいでしょうか。
100行以内の行の挿入ってどいうこと?
例えば、
既に1行目から100行目までデータが入ってたとします。
これに2行毎に行を挿入した場合、どういう結果になれば良いの?
とか。

 追記
 >以前ご指導いただいたVBAではうまく実行できません。
どんなデータに対して実行して、
その実行結果のどこが「うまく」ないのか提示するとなんか分かるかもね。
 
(ご近所PG)いまいちイメージ湧かないの。どんな場面で必要なのかも。


 挿入行数も入れようかと思ったけどやんぴ。
 多分創造しているだろうものとは違います。(挿入する行数が少ないと思う)
 BJ

 Dim myRow As Long, StartRow As Long, EndG As Long
 StartRow = 20
 EndG = 200
 ins = 3
 For myRow = StartRow To EndG Step ins
    Rows(myRow).Insert
 Next


 わかりにくい表現で皆様には大変ご迷惑をおかけしていると思われますが、
 もう少し細かく説明します。本当にすみません。

 実は20,000行位あるデータをデータベースみたいな形で扱っているのですが、
 そのデータは24行目までは挿入したくないデータがあり、
 A製品が60行(25行目〜84行目)、
 B製品が60行(85行目〜144行目)、
 C製品が60行(145行目〜204行目)、
 D製品が60行(205行目〜264行目)、
 E製品、F製品と続く・・・
 というような形となっております。

 そこに行を追加したいわけですが、
 追加の形としては、上記条件に1行追加なら、
 すべての製品に60行おきに1行つかすることになり、
 A製品が60行+1行で(25行目〜85行目)、
 B製品が60行+1行で(86行目〜146行目)、
 C製品が60行+1行で(147行目〜206行目)、
 D製品が60行+1行で(207行目〜268行目)、

 また、上記条件に12行行追加したい場合は
 A製品が61行+12行で(25行目〜97行目)、
 B製品が61行+12行で(98行目〜170行目)、
 C製品が61行+12行で(171行目〜243行目)、
 D製品が61行+12行で(244行目〜316行目)、
 というようになります。

 つまり、各製品群は増えつづける傾向にあるため何行目に何行挿入する?
 というように操作している人が可変して行挿入を実施したいと考えております。

 尚、この12行追加したデータ結果を以下のように添付してみました。
 追記 列はB列と同様のデータがCA列まであるものとします。
 *見にくくなるので下記データはB列まで添付としました。

 	A	B
 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	A製品	1
 26	A製品	2
 27	A製品	3
 28	A製品	4
 29	A製品	5
 30	A製品	6
 31	A製品	7
 32	A製品	8
 33	A製品	9
 34	A製品	10
 35	A製品	11
 36	A製品	12
 37	A製品	13
 38	A製品	14
 39	A製品	15
 40	A製品	16
 41	A製品	17
 42	A製品	18
 43	A製品	19
 44	A製品	20
 45	A製品	21
 46	A製品	22
 47	A製品	23
 48	A製品	24
 49	A製品	25
 50	A製品	26
 51	A製品	27
 52	A製品	28
 53	A製品	29
 54	A製品	30
 55	A製品	31
 56	A製品	32
 57	A製品	33
 58	A製品	34
 59	A製品	35
 60	A製品	36
 61	A製品	37
 62	A製品	38
 63	A製品	39
 64	A製品	40
 65	A製品	41
 66	A製品	42
 67	A製品	43
 68	A製品	44
 69	A製品	45
 70	A製品	46
 71	A製品	47
 72	A製品	48
 73	A製品	49
 74	A製品	50
 75	A製品	51
 76	A製品	52
 77	A製品	53
 78	A製品	54
 79	A製品	55
 80	A製品	56
 81	A製品	57
 82	A製品	58
 83	A製品	59
 84	A製品	60
 85	A製品	61
 86		
 87		
 88		
 89		
 90		
 91		
 92		
 93		
 94		
 95		
 96		
 97		
 98	B製品	1
 99	B製品	2
 100	B製品	3
 101	B製品	4
 102	B製品	5
 103	B製品	6
 104	B製品	7
 105	B製品	8
 106	B製品	9
 107	B製品	10
 108	B製品	11
 109	B製品	12
 110	B製品	13
 111	B製品	14
 112	B製品	15
 113	B製品	16
 114	B製品	17
 115	B製品	18
 116	B製品	19
 117	B製品	20
 118	B製品	21
 119	B製品	22
 120	B製品	23
 121	B製品	24
 122	B製品	25
 123	B製品	26
 124	B製品	27
 125	B製品	28
 126	B製品	29
 127	B製品	30
 128	B製品	31
 129	B製品	32
 130	B製品	33
 131	B製品	34
 132	B製品	35
 133	B製品	36
 134	B製品	37
 135	B製品	38
 136	B製品	39
 137	B製品	40
 138	B製品	41
 139	B製品	42
 140	B製品	43
 141	B製品	44
 142	B製品	45
 143	B製品	46
 144	B製品	47
 145	B製品	48
 146	B製品	49
 147	B製品	50
 148	B製品	51
 149	B製品	52
 150	B製品	53
 151	B製品	54
 152	B製品	55
 153	B製品	56
 154	B製品	57
 155	B製品	58
 156	B製品	59
 157	B製品	60
 158	B製品	61
 159		
 160		
 161		
 162		
 163		
 164		
 165		
 166		
 167		
 168		
 169		
 170		
 171	C製品	1
 172	C製品	2
 173	C製品	3
 174	C製品	4
 175	C製品	5
 176	C製品	6
 177	C製品	7
 178	C製品	8
 179	C製品	9
 180	C製品	10
 181	C製品	11
 182	C製品	12
 183	C製品	13
 184	C製品	14
 185	C製品	15
 186	C製品	16
 187	C製品	17
 188	C製品	18
 189	C製品	19
 190	C製品	20
 191	C製品	21
 192	C製品	22
 193	C製品	23
 194	C製品	24
 195	C製品	25
 196	C製品	26
 197	C製品	27
 198	C製品	28
 199	C製品	29
 200	C製品	30
 201	C製品	31
 202	C製品	32
 203	C製品	33
 204	C製品	34
 205	C製品	35
 206	C製品	36
 207	C製品	37
 208	C製品	38
 209	C製品	39
 210	C製品	40
 211	C製品	41
 212	C製品	42
 213	C製品	43
 214	C製品	44
 215	C製品	45
 216	C製品	46
 217	C製品	47
 218	C製品	48
 219	C製品	49
 220	C製品	50
 221	C製品	51
 222	C製品	52
 223	C製品	53
 224	C製品	54
 225	C製品	55
 226	C製品	56
 227	C製品	57
 228	C製品	58
 229	C製品	59
 230	C製品	60
 231	C製品	61
 232		
 233		
 234		
 235		
 236		
 237		
 238		
 239		
 240		
 241		
 242		
 243		
 244	D製品	1
 245	D製品	2
 246	D製品	3
 247	D製品	4
 248	D製品	5
 249	D製品	6
 250	D製品	7
 251	D製品	8
 252	D製品	9
 253	D製品	10
 254	D製品	11
 255	D製品	12
 256	D製品	13
 257	D製品	14
 258	D製品	15
 259	D製品	16
 260	D製品	17
 261	D製品	18
 262	D製品	19
 263	D製品	20
 264	D製品	21
 265	D製品	22
 266	D製品	23
 267	D製品	24
 268	D製品	25
 269	D製品	26
 270	D製品	27
 271	D製品	28
 272	D製品	29
 273	D製品	30
 274	D製品	31
 275	D製品	32
 276	D製品	33
 277	D製品	34
 278	D製品	35
 279	D製品	36
 280	D製品	37
 281	D製品	38
 282	D製品	39
 283	D製品	40
 284	D製品	41
 285	D製品	42
 286	D製品	43
 287	D製品	44
 288	D製品	45
 289	D製品	46
 290	D製品	47
 291	D製品	48
 292	D製品	49
 293	D製品	50
 294	D製品	51
 295	D製品	52
 296	D製品	53
 297	D製品	54
 298	D製品	55
 299	D製品	56
 300	D製品	57
 301	D製品	58
 302	D製品	59
 303	D製品	60
 304	D製品	61
 305		
 306		
 307		
 308		
 309		
 310		
 311		
 312		
 313		
 314		
 315		
 316		


 ちょこっと整形しました。
とりあえずそんだけ。時間なし。
イメージは分かりました。
けど、運用方法の見直しとかは無しなのかな……うーん。

 ちなみに
 >100行以内の行挿入の繰り返しを実行させるにはどうしたらよろしいでしょうか。
これについては、追加行数の上限が100行って事なのかしら?
 
(五斤jp)……みすった
(ご近所ぴ)…………orz
(ご近所PG)

 あ、ご近所はんとガチンコした(笑
 こんな塩梅でどうでっか?
     (弥太郎)
 '-----------------------
 Sub 行挿入()
    Dim i As Long, mxrow As Long, result, a_data As Integer, b_data As Integer, n As Integer
    On Error Resume Next
    Application.ScreenUpdating = False
    result = StrConv(InputBox("何行挿入しますか?" & Chr(10) & _
                    "挿入行数と間隔行数を , で区切って指定してくらはい。"), vbNarrow)
    If result = "" Then Exit Sub
    a_data = Split(result, ",")(0) * 1
    b_data = Split(result, ",")(1) * 1
    mxrow = Range("a" & Rows.Count).End(xlUp).Row
    For i = 25 + b_data To mxrow + a_data * ((mxrow - 25) \ b_data) Step b_data
        Rows(i + n & ":" & i + n + a_data - 1).Insert
        n = n + a_data
    Next i
    Application.ScreenUpdating = True
    On Error GoTo 0
 End Sub


 おっと、追加質問しようとしたらもうなんか出てきてた。仕事早いですね。
で、
ちと思ったのが、製品名のブレイクで行を挿入すりゃいいの?
と。
それなら行数を指定するよりは、単純なんじゃないかな?
と言うか間違いも無いんじゃないかなと。
(ご近所PG)思った

 >間違いも無いんじゃないかなと
 さいでんなぁ。これやと間違う可能性大いに有りですわなぁ。
 製品別となるとなんとなく面倒・・・(笑
     (弥太郎) 

 ちと試し。
バックアップした上で試してみてください。
動作:製品名が切り替わる所に指定行数をInsertする。
Sub test()
    Const DataStartRow As Integer = 25
    Dim i As Long
    Dim intInsertRowCount As Integer
    Dim strBreakKey As String
    strBreakKey = vbNullChar
    intInsertRowCount = InputBox("追加行数指定", , 2)
    For i = Range("A" & Rows.Count).End(xlUp).Row To DataStartRow Step -1
        If Range("A" & CStr(i)).Value <> strBreakKey Then
            Rows(CStr(i + 1) & ":" & CStr(i + intInsertRowCount)).Insert
            strBreakKey = Range("A" & CStr(i)).Value
        End If
    Next
End Sub
追記:空行は無視する動きを入れると便利かも
(ご近所PG)昼飯

 様々なご回答ありがとうございます。
 さて、今までのご質問順番にご回答いたします。

 1.100行以内の行挿入についての回答
 →上記例で製品別データを60行の場合と、追加時61行の場合、追加時73行の場合を例にしましたが、
 私は最初まさか100行を超えることはないだろうと思い掲示しましたが、
 100行を超えた場合使えなくなるので無視していただけると幸いです。

 2.製品別のブレイクの回答→今回すべてのデータを見ていただけないのが残念ですが、
 一部製品名の欄に空白がある場合があり、やはり行単位で挿入検討願います。

 3.運用について→(弥太郎)様のVBAで以下のような運用にしていただけると幸いです。

 3−1マクロを実行すると、何行挿入しますか?ということで挿入行数と間隔行数を , で
 区切って指定、を12,61などと入力しますが、,ではなくて/に変更していただきたい。

 3−2これはできればでかまいませんが、24行目までは挿入したくない行が存在すると書きましたが
 万が一この24行が増減した際も使用していきたいので、
 最初に”挿入禁止行は何行ありますが?”という内容をを、"何行挿入しますか?”の前に
 "何行挿入しますか?”と同じような形で操作者に聞いていただき、
 任意の数(24とか)を入力し挿入禁止行を任意に変更できると幸いです。

 *本当にお手数だとは思われますがなにとぞよろしくお願いいたします。

 ご希望とは違って単なるこう、データの在り方での意見と言うか疑問ですけれども
 
製品名に空欄がある
ってのはデータベース的な扱いをする上でどういう意図があるんだろう?
あまり好ましい状態ではないと思うけれども。
人が見やすくするため?
 
挿入禁止行について
手入力で数値を入力させるより、
「これより上はいじっちゃだめよと」と言う識別のためのセルを設ける方が
良いのではないかしらと思うのだけどどうだろう。
今回例示された物で言えば、
 >24	製品名	データ
の、A列の"製品名"がユニークであるのならば、
その行より上は処理しないと言ったような。
 
間隔行数について
人が判断して入力するのだろうけど、それは機械的な判断は出来ないのかしら。
ここを見て、こうなってたら、こう入れる。
と言う感じで。
それを例示できれば、入力するよりはこんぴゅーたさんに判断させたほうが良いと思ってみた。
(ご近所PG)んだけども

 んだけども、ここはとしまるはんに最適なマクロやないことを認識して貰うしかしょう
 おまへんなぁ。(笑

 でもって、ご要望の件、以下の様にしゅうせぇすればとりあえずご希望に叶うと思われ
 ます。

 3-1先ず/に変更の件ですが、,が3ヶ所ある筈ですからそれを/に書き換えてくらはい。
 3-2はApplication.ScreenUpdating = Falseの一行下に
 limt = Val(StrConv(InputBox("挿入禁止行は何行でっか?"), vbNarrow)) + 1
 を挿入し、25と数値を書き込んで有るヶ所が2ヶ所ほどありますから、limtに置き換え
 ませう。
 最後に変数宣言セクションに,をつけてlimt as longとしてくらはい。
 いぜうでうまくいく筈ですワ。
      (弥太郎)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.