Excel VBA質問箱 IV

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

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


38344 / 76738 ←次へ | 前へ→

【43532】Re:ワークシート上のチェックボックス
回答  bykin  - 06/10/18(水) 22:37 -

引用なし
パスワード
   こんばんわ。

最初のご質問は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列のセルにリンク先を「再設定」する・・・
くらいしかできへんのとちゃうかな?
リンク先の設定はマクロの自動記録を使えばわかると思います。

ほな。

0 hits

【43510】ワークシート上のチェックボックス ゆう 06/10/18(水) 14:29 質問
【43519】Re:ワークシート上のチェックボックス Jaka 06/10/18(水) 17:23 発言
【43532】Re:ワークシート上のチェックボックス bykin 06/10/18(水) 22:37 回答
【43543】Re:ワークシート上のチェックボックス ゆう 06/10/19(木) 9:13 お礼
【43546】Re:ワークシート上のチェックボックス Jaka 06/10/19(木) 9:43 発言

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