
マクロ初心者です。
「K列の数字の変化ごとに行を一行挿入する」
マクロを作成致しました。
Sub 挿入()
Const NowCol = 11 'K列
Const InsRows = 1 '1行挿入
Dim NowRow
Dim NowVal, PreVal
PreVal = Range("K1")
NowRow = 1
Do
NowRow = NowRow + 1
NowVal = Cells(NowRow, NowCol).Value
If NowVal = 0 Then Exit Do
If PreVal <> NowVal Then
Rows(NowRow & ":" & NowRow + InsRows - 1).Select
Selection.Insert xlDown
PreVal = NowVal
NowRow = NowRow + InsRows - 1
End If
Loop
End Sub
(正しいか不安です。間違っていれば指摘下さい)
ただ、これではシート全体に適応してしまいます。
範囲指定した複数の行のみ(範囲は毎回変わります)
にだけマクロを実行したいのです。
例えば、データが1~100列まで入ってるとして、
その中の5~30列だけ指定しK列の数字の変化ごとに、
一行挿入をさせる。(指定列は毎回変わります)
まったくの初心者で上記のマクロを皆様を参考に、
やっと動くように出来た程度です。
どうかご教授お願いします。宜しくお願いします。
No.1ベストアンサー
- 回答日時:
同じことを私なりにやって見ました。
少数例ではOKのようです。K-->A列に直しています。Sub test01()
i = 2
m = Cells(1, "A")
Do
If Cells(i, "A") = "" Then Exit Do
If m <> Cells(i, "A") Then
m = Cells(i, "A")
Cells(i, "A").EntireRow.Insert
i = i + 2
Else
i = i + 1
End If
Loop
End Sub
朝で質問の答えを考える時間が無くてここまでにします。
No.4
- 回答日時:
#2です。
>要警戒とはどう意味なのでしょうか。
十分プログラムロジックを考えぬくことをお勧めしますと言うことで、正しく動けば、その後も心配せよと言うことではありません。私が苦労したと言うぐらいに受け取ってください。#3の方の工夫やご苦心の理由もそれを裏付けるものです。
>私の要求してる事はかなり無理があるのでしょうか
それは無いでしょう。ただ「初心者」(ご自分でおっしゃっているので。失礼。)のかたが、思いつく常識的な、「やりたいこと」がプログラムではAPIなどを使わないと実現できないことは、多々あるようです。
>別シートに出すとゆうのは・
Sheet1のA列の前行と当行を比較して、変らなければ、Sheet1のA列当行と同じものを,Sheet2
のA列の指定行に書く。変ったらSheet2の行を1行進める(従って空白行が出来る)と言うものです。Sheet2のデータをセットすべきポインタ的整数を持って指定行を管理する必要があります。
#3のtaisuke555さんへ
If (TypeName(Selection) = "Range") Then
など経験不足で、考慮できていません。ご教示ありがとうございました。プログラムは標準的なケースでは上手く行っても、色んなケースでは、油断ならない1例ですね。
No.3
- 回答日時:
私は、行の挿入や削除をする場合、下の行から処理していきます。
(imogasiさんの終了行が動くプログラムは要警戒と同じ理由だと思いますが)
上記プログラムなら以下の様に作ります。(私なら)
テストでは問題なかったですがバグがあったらすみません。
このプログラムの
For i = Range("K65536").End(xlUp).Row To 2 Step -1
の部分を
For i = 2 To Range("K65536").End(xlUp).Row
にして実行すると下の行から処理している理由が分かるかも。
(#2のプログラムの
i = i + 1 + 1 '1行ずれて、その次ぎの行を対象にする
l = l + 1 '最終行が下へ1行ずれる
のあたりも参考に)
Sub test()
Dim i As Long
'K列の入力されている最後の行から2行目まで(シートの最後の行からではない)
For i = Range("K65536").End(xlUp).Row To 2 Step -1
'入力されている行のみ処理
If (Cells(i, "K") <> "") Then
'1行上の値と違っていて1行上に入力がある場合
If (Cells(i, "K") <> Cells(i - 1, "K") And Cells(i - 1, "K") <> "") Then
'1行挿入
Range(i & ":" & i).Insert xlUp
'Cells(i, "K").EntireRow.Insert xlUp 'こちらでも可
End If
End If
Next i
End Sub
範囲指定するのは、imogasiさんも書かれているように
Selectionを使用しますが、
Selectionは結構広範囲の使用が可能ですので、いくつか注意しなければいけないと思います。
(1)選択されているものがSelectionに入ってくるので、
例えば図を選択して実行すると、エラーになってしまいます。
If (TypeName(Selection) = "Range") Then
で、セルが選択されているか確認
(2)例えば、10~13行、15~20行(Ctrlを押して選択)した場合、
Selection.Areas.Count = 2
Selection.Areas(1).Row = 10
Selection.Areas(1).Rows.Count = 4
Selection.Areas(2).Row = 15
Selection.Areas(2).Rows.Count = 6
になります。
15~20行、10~13行の順に選択すれば、
Areas(1)とAreas(2)が入れ替わります。
私がSelectionを使ってみて気になる所なので、他にもあるかもしれません。
サンプル作ったのですが、今1つ納得いく作りにならなかったので、記載するのはあきらめました。
何故、範囲指定したいのかわかりませんが、
私の記述したプログラムは、シート全体に適応していますが、数字が変わった時に、
行を挿入していない所だけ、行を挿入するようにしてありますので参考になればと思います。
No.2
- 回答日時:
#1です。
ご質問の内容はこうだろうと推測して、下記を作りました。(<-範囲指定した複数の行のみ(範囲は毎回変わります) にだけマクロを実行したいのです)A列に,同じ文字列が連続したり、単独だったりと並んでいるとします。
例えばA9:A15に
g
g
h
h
k
f
k
とします。
このA9:A15を範囲指定(任意指定の1つの例)して、下記を実行すると
g
g
h
h
k
f
k
となります。
Sub test01()
i = Selection.Row '選択範囲の最上行
l = i + Selection.Rows.Count '選択範囲の最下行+1
' MsgBox i & "," & l
m = Cells(i, "A") '第1行目を前行とする
i = i + 1 '次行に注目を進める
Do
If i = l Then Exit Do
If m <> Cells(i, "A") Then '前の行と比較して変わったか
'変ったとき
m = Cells(i, "A")
Cells(i, "A").EntireRow.Insert
i = i + 1 + 1 '1行ずれて、その次ぎの行を対象にする
l = l + 1 '最終行が下へ1行ずれる
Else
'---変らないとき->何もしない
i = i + 1 '次ぎの行を対象にする。
End If
Loop
' MsgBox l
End Sub
Selection.Rowは500ページの解説本にさえも載ってないかも。初等的ではないと思う。また終了行が動くプログラムは要警戒で私は好きでない。私は別シートに出します。その方がロジック的に安定していると思う。
ありがとうございます。
>また終了行が動くプログラムは要警戒で私は好きでない。私は別シートに出します。その方がロジック的に安定していると思う。
すいません。内容がよく分かりません。
要警戒とはどう意味なのでしょうか?
私の要求してる事はかなり無理があるのでしょうか?
別シートに出すとゆうのは・・・?
詳しく教えていただけますでしょうか?
初心者な上、勉強不足ですいません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/13 08:41
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/12 10:10
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロで最終行を取得してコピ...
-
【VBA】条件に一致しない行を削...
-
Excel VBAでオートフィルタで抽...
-
列から特定の文字列検索→該当以...
-
エクセルで空白行を削除する ...
-
VBA 複数列コンボボックス 値の...
-
EXCEL VBAでA列にある空白行よ...
-
数値に見えるものはすべて数値...
-
エクセルVBAでデータの蓄積方法?
-
【VBA】条件に一致しない行を削...
-
コマンドボタンでの自動計算マ...
-
エクセルで階層図を作る方法
-
vbaエクセルマクロについて she...
-
Excel 別ブックから該当データ...
-
テキストファイル読み込みにお...
-
複数セルの入れ替え方法 excel vba
-
【至急】Excel 同一人物の情報...
-
Excel97 指定した行だけマク...
-
Excel VBA オートフィルタの結...
-
VBAで保存しないで閉じると空の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロで最終行を取得してコピ...
-
数値に見えるものはすべて数値...
-
Excel VBAでオートフィルタで抽...
-
エクセルで空白行を削除する ...
-
VB.net
-
【VBA】条件に一致しない行を削...
-
エクセルのデータがない行には...
-
列から特定の文字列検索→該当以...
-
エクセルで階層図を作る方法
-
Excel97 指定した行だけマク...
-
Excel マクロ 検索結果を別シ...
-
【VBA】条件に一致しない行を削...
-
マクロにて指定の文字間の文字...
-
エクセルのVBAで指定した行数の...
-
空白を複数行一気に挿入するには?
-
vbaエクセルマクロについて she...
-
VBA 複数列コンボボックス 値の...
-
excel2021で実行できないマクロ...
-
関数入りの行挿入。。。上書き...
-
オートフィルターの複数条件検...
おすすめ情報