質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

419閲覧

VBA エクセルで挿入はできなくして 行コピーしてコピーしたセルの挿入はしたいです。

wada3

総合スコア103

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2022/11/08 07:33

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Columns.Count = Me.Columns.Count And _ Target.CountLarge Mod Me.Columns.Count = 0 And _ Target.Row = Selection.Row Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True MsgBox ("行の削除・追加不可です。") Exit Sub End If If Target.Rows.Count = Me.Rows.Count And _ Target.CountLarge Mod Me.Rows.Count = 0 And _ Target.Column = Selection.Column Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True MsgBox ("列の削除・追加不可です。") Exit Sub End If

l_end:

End Sub

行の挿入は禁止できますがコピーして挿入もできなくなってしまいます。
良い方法はないでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Application.CutCopyModeはどうでしょうか

if(Application.CutCopyMode) がtrueのとき、切り取りorコピーの何れかが行われていると判定できます

投稿2022/11/08 07:47

pig_vba

総合スコア807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wada3

2022/11/09 07:20

Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Columns.Count = Me.Columns.Count And _ Target.CountLarge Mod Me.Columns.Count = 0 And _ Target.Row = Selection.Row Then '切り取りorコピー以外の挿入の場合は操作を取り消す If Application.CutCopyMode = 0 Then Application.EnableEvents = False 'ユーザーが最後に実行した操作を取り消します。 Application.Undo Application.EnableEvents = True MsgBox ("行の削除・追加不可です。") End If End If l_end: End Sub 上記のコードで挿入か切り取りorコピーでの挿入の制御が可能になりました。ありがとうございます
pig_vba

2022/11/09 07:28

ふむ。その処理では少し無駄がありますね。 Private Sub Worksheet_Change(ByVal Target As Range) If Application.CutCopyMode then Exit Sub として、「一番最初にコピー状態だったらさっさと終了する」としましょう。処理速度と可読性、安全性の向上が見込めます。 この考え方を「早期リターン」といいます。暇があればぜひ調べてみてください
wada3

2022/11/10 07:24

ありがとうございます。下記のように修正しました。 また、今のコードだと挿入と削除両方ともできなくなっています。 コピーなしの挿入はしたくないですが削除はしたいですが、そのようにするにはどうしたらよいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) '対象セルの列数=シート全体のセルの列数の比較(行全体が対象か確認) '対象セルの総数がシート全体のセルの列数で割り切れるかどうか(対象が複数行ある可能性を考慮) If Target.Columns.Count = Me.Columns.Count And _ Target.CountLarge Mod Me.Columns.Count = 0 And _ Target.Row = Selection.Row Then 'コピー状態だったら終了する If Application.CutCopyMode Then Exit Sub Application.EnableEvents = False 'ユーザーが最後に実行した操作を取り消します。 Application.Undo Application.EnableEvents = True MsgBox ("行の追加不可です") End If End Sub
pig_vba

2022/11/10 08:13 編集

軽く調べてみましたが、削除そのものを検知するイベントはありませんでしたが、こちらのコードを利用すれば削除かどうかの判定はできそうです。弊環境に移植してみたところ挿入では反応しませんでした https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1290411357 ちなみに、私が言ってた早期リターンはこういうことです Private Sub Worksheet_Change(ByVal Target As Range) 'コピー状態だったらなにもしない If Application.CutCopyMode Then Exit Sub '対象セルの列数=シート全体のセルの列数の比較(行全体が対象か確認) '対象セルの総数がシート全体のセルの列数で割り切れるかどうか(対象が複数行ある可能性を考慮) If Target.Columns.Count = Me.Columns.Count And _ Target.CountLarge Mod Me.Columns.Count = 0 And _ Target.Row = Selection.Row Then Application.EnableEvents = False 'ユーザーが最後に実行した操作を取り消します。 Application.Undo Application.EnableEvents = True MsgBox ("行の追加不可です") End If End Sub
wada3

2022/11/10 23:43

なるほどです。削除のほうも見てみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問