/ / vba - 範囲からチェックボックスを動的に削除する - excel、vba、excel-vba

vba - 範囲からチェックボックスを動的に削除する - excel、vba、excel-vba

私はシートを持っています。範囲は空ではありません。 しかし、私が望むのは、この範囲が値を減少させると(例えば5から3へ)、これらの他のチェックボックスを削除したいということです。

たとえば、4行の行があり、コードに4つのチェックボックスが追加されています。 ここに画像の説明を入力

しかし、私は2行を削除しましたので、これらのチェックボックスも削除されることを期待していましたが、コードをもう一度実行すると、これらのチェックボックスが表示されます。 ここに画像の説明を入力

これは私がこれまで試みてきたもので、 この 答え、それは働かなかった:

Option Explicit
Sub AddCheckbox()
Dim i As Long, lastrow As Long, rng As Range
Dim ws As Worksheet
Dim obj As OLEObject, cb As MSForms.CheckBox

Set ws = Sheets("Consulta")
lastrow = ws.Cells(Rows.Count, "E").End(xlUp).Row

For i = 5 To lastrow
If Not IsEmpty(ws.Range("E" & i, "J" & i)) Then
For Each rng In ws.Range("D" & i)
ws.OLEObjects.Add "Forms.CheckBox.1", Left:=rng.Left, Top:=rng.Top, Width:=rng.Width, Height:=rng.Height
Next
ElseIf IsEmpty(ws.Range("E" & i, "J" & i)) Then
For Each obj In ws.OLEObjects
If TypeOf obj.Object Is MSForms.CheckBox Then
Set cb = obj.Object
If cb.ShapeRange.Item(1).TopLeftCell.Address = _
ActiveCell.Address Then obj.Delete
End If
Next
End If
Next

End Sub

どんな提案も役に立ちます!私は本当にこの問題が以下の部分であると信じています:

If cb.ShapeRange.Item(1).TopLeftCell.Address = _
ActiveCell.Address Then obj.Delete
End If

回答:

回答№1は2

これは素晴らしいことではありませんが動作します:

Sub AddCheckbox()

Const RW_START As Long = 5
Dim i As Long, lastrow As Long, rng As Range
Dim ws As Worksheet, o As Object, v
Dim obj As OLEObject, cb "As MSForms.CheckBox

Set ws = Sheets("Consulta")
lastrow = 500 "ws.Cells(Rows.Count, "E").End(xlUp).Row
"^^^ not sure what would be the best approach here...

For i = RW_START To lastrow

If Application.CountA(ws.Range("E" & i & ":J" & i)) > 0 Then
With ws.Range("D" & i)
"not already added a checkbox?
If Len(.Value) = 0 Then
Set o = ws.OLEObjects.Add("Forms.CheckBox.1", _
Left:=.Left, Top:=.Top, _
Width:=.Width, Height:=.Height)
"create a name for the checkbox and link it to the cell
v = Application.Max(ws.Cells(RW_START, "D").Resize(1000, 1))
v = v + 1
o.Name = "cbx_" & v
.Value = v
.Font.Color = vbWhite
Debug.Print i, v
End If
End With
Else
On Error Resume Next
ws.Shapes(ws.Range("D" & i).Value).Delete
On Error GoTo 0
ws.Range("D" & i).Value = ""
End If
Next

End Sub