Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


154 / 13645 ツリー ←次へ | 前へ→

【81734】行のを削除・行の挿入について TDS 21/4/21(水) 15:49 質問[未読]
【81735】Re:行のを削除・行の挿入について 山内 21/4/21(水) 16:24 回答[未読]
【81747】Re:行のを削除・行の挿入について TDS 21/4/23(金) 18:56 お礼[未読]
【81750】Re:行のを削除・行の挿入について sinzo 21/4/24(土) 22:39 回答[未読]
【81752】Re:行のを削除・行の挿入について TDS 21/4/25(日) 13:55 お礼[未読]
【81751】Re:行のを削除・行の挿入について γ 21/4/25(日) 7:41 回答[未読]
【81753】Re:行のを削除・行の挿入について TDS 21/4/25(日) 13:58 お礼[未読]
【81758】Re:行のを削除・行の挿入について γ 21/4/25(日) 15:37 発言[未読]

【81734】行のを削除・行の挿入について
質問  TDS  - 21/4/21(水) 15:49 -

引用なし
パスワード
   Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  
  If Target.Row > 0 Or Target.Row < 66 Then
   '*** 1行目〜66行目 行の削除/行の挿入をさせたくない。

  End If

End Sub

シートの1行目〜66行目の行のを削除・挿入をさせないチェックは、ございますか?
できれば、シートの保護以外で解決したいです。よろしくお願いしますmm

【81735】Re:行のを削除・行の挿入について
回答  山内  - 21/4/21(水) 16:24 -

引用なし
パスワード
   適当ですがA66が押し出されてA67に値が入ったら戻るを実行します

Private Sub Worksheet_Change(ByVal Target As Range)
  If Range("A67").Value <> "" Then
    Application.Undo
  End If
End Sub

【81747】Re:行のを削除・行の挿入について
お礼  TDS  - 21/4/23(金) 18:56 -

引用なし
パスワード
   ▼山内 さん:
>適当ですがA66が押し出されてA67に値が入ったら戻るを実行します
>
>Private Sub Worksheet_Change(ByVal Target As Range)
>  If Range("A67").Value <> "" Then
>    Application.Undo
>  End If
>End Sub

1行の削除と挿入に有効ですね。
複数行まもめての削除で試したら、削除されてしましました。

山内さんの情報をもとに、色々試してみます。
ありがとうございましたmm

【81750】Re:行のを削除・行の挿入について
回答  sinzo  - 21/4/24(土) 22:39 -

引用なし
パスワード
   検証願います。

Option Explicit
Dim ListCnt

Private Sub Worksheet_Change(ByVal Target As Range)
Dim c
Dim Rng, Rng2

Set Rng = ActiveCell
Set Rng2 = Intersect(Rng, Range("1:16"))

If Rng2 Is Nothing Then Exit Sub
  Set c = CommandBars("Standard").Controls(14)
  If ListCnt < c.ListCount Then  '履歴がふえたら
    If c.TooltipText = "元に戻す(&U) クリア (Ctrl+Z)" Then
      MsgBox "クリアをキャンセルします。"
      Application.Undo
    End If
  End If
  ListCnt = c.ListCount

End Sub

【81751】Re:行のを削除・行の挿入について
回答  γ  - 21/4/25(日) 7:41 -

引用なし
パスワード
   1行目から66行目までに「名前定義」をしておき(例:下記test)、
これを利用して、その範囲の行の挿入・削除が行われたら、その動作を元に戻します。

<<シートモジュール>>
Private Sub Worksheet_Change(ByVal Target As Range)
  If Intersect(Target, Rows("1:66")) Is Nothing Then Exit Sub
  If Range("myRange").Rows.Count <> 66 Then
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
  End If
End Sub
# Application.EnableEventsを操作しているのは、
# Undoによって再度Changeイベントプロシージャが
# 呼ばれることを回避するため。

(*)標準モジュールで一度だけ実行します。(もちろん手作業でも可)
Sub test()
  ActiveWorkbook.Names.Add Name:="myRange", RefersToR1C1:="=Sheet1!R1:R66"
End Su

【81752】Re:行のを削除・行の挿入について
お礼  TDS  - 21/4/25(日) 13:55 -

引用なし
パスワード
   ▼sinzo さん:
>検証願います。
>
>Option Explicit
>Dim ListCnt
>
>Private Sub Worksheet_Change(ByVal Target As Range)
>Dim c
>Dim Rng, Rng2
>
>Set Rng = ActiveCell
>Set Rng2 = Intersect(Rng, Range("1:16"))
>
>If Rng2 Is Nothing Then Exit Sub
>  Set c = CommandBars("Standard").Controls(14)
>  If ListCnt < c.ListCount Then  '履歴がふえたら
>    If c.TooltipText = "元に戻す(&U) クリア (Ctrl+Z)" Then
>      MsgBox "クリアをキャンセルします。"
>      Application.Undo
>    End If
>  End If
>  ListCnt = c.ListCount
>
>End Sub

sinzo さんご回答ありがとうございます。
行の削除・行の挿入でなっかったですが、
入力欄の削除などできないようにするようですが、勉強になりました。
ありがとうございますm(__)m

【81753】Re:行のを削除・行の挿入について
お礼  TDS  - 21/4/25(日) 13:58 -

引用なし
パスワード
   ▼γ さん:
>1行目から66行目までに「名前定義」をしておき(例:下記test)、
>これを利用して、その範囲の行の挿入・削除が行われたら、その動作を元に戻します。
>
><<シートモジュール>>
>Private Sub Worksheet_Change(ByVal Target As Range)
>  If Intersect(Target, Rows("1:66")) Is Nothing Then Exit Sub
>  If Range("myRange").Rows.Count <> 66 Then
>    Application.EnableEvents = False
>    Application.Undo
>    Application.EnableEvents = True
>  End If
>End Sub
># Application.EnableEventsを操作しているのは、
># Undoによって再度Changeイベントプロシージャが
># 呼ばれることを回避するため。
>
>(*)標準モジュールで一度だけ実行します。(もちろん手作業でも可)
>Sub test()
>  ActiveWorkbook.Names.Add Name:="myRange", RefersToR1C1:="=Sheet1!R1:R66"
>End Su

γ さん、やりたかったことができました。
少し手直しして行の削除と行の挿入ができました。ありがとうございますm(__)m

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim ctr As Integer
  Dim ctc As Integer
  Dim mystr As String
  Dim myrange As Range

  'オブジェクト変数 myrange にセル範囲を放り込みます
  Set myrange = Target.CurrentRegion

  'セル範囲の行数と列数を数えます
  ctr = myrange.Rows.Count
  ctc = myrange.Columns.Count
  
  If Intersect(Target, Rows("1:66")) Is Nothing Then Exit Sub
  If ctr < 66 Then
    Application.EnableEvents = False
    Application.Undo
    Application.EnableEvents = True
  End If
  
End Sub

【81758】Re:行のを削除・行の挿入について
発言  γ  - 21/4/25(日) 15:37 -

引用なし
パスワード
   ちょっとお尋ねするが、
修正版のコードは、
例えば、A1セルに値を入力するだけでも対象となって取消が行われますよ。
それは、されたいことだったんですか?

当然ながら、一行全体に1を入力しても
(これは行を挿入しているわけではない)、
取消の対象になりますよ。

まあ、されたいことと違ったとしても、満足されているなら、
"それも一局"かも知れませんが。

154 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free