|
こんばんわ。
最初のご質問はChangeイベントってのは行の削除や挿入以外に、セルのデータを
変更したときにも起動されるイベントやから、完璧にはできへんと思うよ。
一応考えてみたけど、セルをフィルドラッグした場合なんかが、標準の動きと
違ってまいます。
他にも不具合が隠れてる可能性めっちゃ大です。
イベントがしょっちゅう起動するのも鬱陶しいし。
参考程度でっけど・・・
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cnt As New Collection
Dim Ad1 As String
Dim Ad2 As String
Dim Chk As CheckBox
Dim Buf As Variant
Dim i As Long
On Error GoTo Error_Handler
If Target.Areas.Count > 1 Then Exit Sub
If ActiveSheet.CheckBoxes.Count = 0 Then Exit Sub
Buf = Target.Formula
Ad1 = Target.Address
Application.EnableEvents = False
Application.Undo
On Error Resume Next
Ad2 = Target.Address
If Err.Number = 0 Then
On Error GoTo Error_Handler
If Ad1 <> Ad2 Then
For Each Chk In ActiveSheet.CheckBoxes
Cnt.Add Array(Chk.TopLeftCell.EntireRow.Address, _
Chk.BottomRightCell.EntireRow.Address, _
Chk.Name)
Next
Application.Repeat
For i = 1 To Cnt.Count
If Not Intersect(Range(Cnt(i)(0)), Target) Is Nothing Then
If Not Intersect(Range(Cnt(i)(1)), Target) Is Nothing Then
ActiveSheet.CheckBoxes(Cnt(i)(2)).Delete
End If
End If
Next
Else
Target.Formula = Buf
Target.Select
If Application.MoveAfterReturn Then
SendKeys "{Enter}"
End If
End If
Else
Application.Repeat
End If
Error_Handler:
Set Cnt = Nothing
Application.EnableEvents = True
End Sub
やっぱりイベント使うより、行の削除自体をマクロで行うほうがええと思います。
チェック項目も少ないからコードも短くて済むし。
たとえば・・・
Sub test()
Dim Rng As Range
Dim Chk As CheckBox
Dim Cnt As New Collection
Dim i As Long
If Selection.Address <> Selection.EntireRow.Address Then Exit Sub
For Each Rng In Selection.Areas
For Each Chk In ActiveSheet.CheckBoxes
If Not Intersect(Chk.TopLeftCell, Rng) Is Nothing Then
If Not Intersect(Chk.TopLeftCell, Rng) Is Nothing Then
Cnt.Add Chk
End If
End If
Next
Next
On Error Resume Next
Selection.Delete
If Err.Number = 0 Then
For i = 1 To Cnt.Count
Cnt(i).Delete
Next
Else
MsgBox "選択範囲が重複しています", vbExclamation
End If
Set Cnt = Nothing
End Sub
次のご質問は難しいねー
コピーしたってイベント発生するわけやなし・・・
コピー先がどこになるかなんて操作してる本人にしかわからんしねー
イベントやない通常のマクロで、全部のチェックボックスを順番に調べて、
A列にあったら同じ行のB列のセルにリンク先を「再設定」する・・・
くらいしかできへんのとちゃうかな?
リンク先の設定はマクロの自動記録を使えばわかると思います。
ほな。
|
|