ExcelBanter

ExcelBanter (https://www.excelbanter.com/)
-   Excel Programming (https://www.excelbanter.com/excel-programming/)
-   -   Delete an OLE Check Box in COde when a deleting a row (https://www.excelbanter.com/excel-programming/421971-delete-ole-check-box-code-when-deleting-row.html)

BG Lad

Delete an OLE Check Box in COde when a deleting a row
 
Functionality: To Remove an OLE check box in the row when the user deletes a
row.
This is my current attempt. I get an error message "Can't enter break mode
at this time".
The CheckBox is not linked, it is for visual and print only. There are
remmed statements from previous attempts. Any ideas on this one?

'** Snipped ******************
Dim rowcount As Long
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Err_Worksheet_Change

Dim llCanDeleteTheBox As Boolean
Dim lcCheckBoxToDelete As String
'Application.EnableEvents = False 'should be part of Change macro

If IsEmpty(rowcount) Then
'* First time through ... *'
Else

If ActiveSheet.UsedRange.Rows.Count = rowcount - 1 Then
'* A row was deleted *'

lcCheckBoxToDelete = "CheckBox" + Trim(Str(ActiveSheet.Range("A"
+ Trim(Str(Target.Row))).Value))

For Each Obj In ThisWorkbook.ActiveSheet.OLEObjects
'* Find the Relative Checkbox *'
Stop
If Obj.Name = lcCheckBoxToDelete Then
Stop
'Obj.Delete
llCanDeleteTheBox = True
'lcCheckBoxToDelete = Obj.Name
'ThisWorkbook.ActiveSheet.OLEObjects(Obj.Name).Del ete
Exit For
End If
Next
End If
End If

If llCanDeleteTheBox Then
Stop
'* Delete the Check Box *'
ThisWorkbook.ActiveSheet.OLEObjects(lcCheckBoxToDe lete).Delete
End If

rowcount = ActiveSheet.UsedRange.Rows.Count
'** End of SNIPPED *****************

--
B Good Lad

Dave Peterson

Delete an OLE Check Box in COde when a deleting a row
 
I didn't test your code, but when you step through code that works with
OLEObjects, you can get that error.

I'd put a break point above the row that does the work and after the row. Then
RUN (not Step) through the code.

Some other notes:

#1. VBA's syntax is very nice, you could use:

lcCheckBoxToDelete = "CheckBox" _
+ Trim(Str(ActiveSheet.Range("A" + Trim(Str(Target.Row))).Value))

lcCheckBoxToDelete = "CheckBox" & me.cells(target.row,"A").value)
or
lcCheckBoxToDelete = "CheckBox" & me.range("A" & target.row).value)

#2. VBA is forgiving, but it's better to use + to add numbers and & to
concatenate strings. You could get in trouble if the strings look like numbers
and they're added, not concatentated.

#3. Since you're in the worksheet_change event, it's better to use the keyword
Me instead of Activesheet. Me refters to the thing that owns the code. In this
case, it's the worksheet.

#4. You can check for a single/entire row being deleted by:
if target.address = target.cells(1).entirerow.address then

And check for multiple rows
if target.address = target.entirerow.address then

#5. If you know the name of the single checkbox to delete--but not sure if it's
there, you can use:

on error resume next
me.oleobjects(lccheckboxtodelete).delete
on error goto 0

#6. You may want to consider an alternative. Maybe give the user a dedicated
macro that would delete the rows (and checkboxes). Then you don't have to
struggle with the worksheet_event.

#7. In fact, you may want to rethink the checkboxes and use something
else/easier.

(saved from a previous post)

Select the range that would have held the checkboxes.
Format|cells|number tab|custom category
In the "type:" box, put this:
alt-0252;alt-0252;alt-0252;alt-0252

But hit and hold the alt key while you're typing the 0252 from the numeric
keypad.

It should look something like this when you're done.
ü;ü;ü;ü
(umlaut over the lower case u separated by semicolons)

And format that range of cells as Wingdings (make it as large as you want)

Now, no matter what you type (spacebar, x, anyoldtextatall), you'll see a check
mark.

Hit the delete key on the keyboard to clear the cell.

If you have to use that "checkmark" in later formulas:
=if(a1="","no checkmark","Yes checkmark")

Or you can filter by blanks and non-blanks.

BG Lad wrote:

Functionality: To Remove an OLE check box in the row when the user deletes a
row.
This is my current attempt. I get an error message "Can't enter break mode
at this time".
The CheckBox is not linked, it is for visual and print only. There are
remmed statements from previous attempts. Any ideas on this one?

'** Snipped ******************
Dim rowcount As Long
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Err_Worksheet_Change

Dim llCanDeleteTheBox As Boolean
Dim lcCheckBoxToDelete As String
'Application.EnableEvents = False 'should be part of Change macro

If IsEmpty(rowcount) Then
'* First time through ... *'
Else

If ActiveSheet.UsedRange.Rows.Count = rowcount - 1 Then
'* A row was deleted *'

lcCheckBoxToDelete = "CheckBox" + Trim(Str(ActiveSheet.Range("A"
+ Trim(Str(Target.Row))).Value))

For Each Obj In ThisWorkbook.ActiveSheet.OLEObjects
'* Find the Relative Checkbox *'
Stop
If Obj.Name = lcCheckBoxToDelete Then
Stop
'Obj.Delete
llCanDeleteTheBox = True
'lcCheckBoxToDelete = Obj.Name
'ThisWorkbook.ActiveSheet.OLEObjects(Obj.Name).Del ete
Exit For
End If
Next
End If
End If

If llCanDeleteTheBox Then
Stop
'* Delete the Check Box *'
ThisWorkbook.ActiveSheet.OLEObjects(lcCheckBoxToDe lete).Delete
End If

rowcount = ActiveSheet.UsedRange.Rows.Count
'** End of SNIPPED *****************

--
B Good Lad


--

Dave Peterson

BG Lad

Delete an OLE Check Box in COde when a deleting a row
 
Great Job Dave!
I am using the plus sign as a habit, I prefer it as it errors well with nulls.
I did use the On Error Resume Next, and the "Me.", and thanks for the
multi-row sensor, I will be using that too. I had thought of it but was not
there yet.
The spreadsheet is being created programatically so the reliability of the
cell contents is very high.
I put the 'Stop's after the .Delete and that seems to have been the problem.
Appreaciated muchly,
Bill
--
B Good Lad


"Dave Peterson" wrote:

I didn't test your code, but when you step through code that works with
OLEObjects, you can get that error.

I'd put a break point above the row that does the work and after the row. Then
RUN (not Step) through the code.

Some other notes:

#1. VBA's syntax is very nice, you could use:

lcCheckBoxToDelete = "CheckBox" _
+ Trim(Str(ActiveSheet.Range("A" + Trim(Str(Target.Row))).Value))

lcCheckBoxToDelete = "CheckBox" & me.cells(target.row,"A").value)
or
lcCheckBoxToDelete = "CheckBox" & me.range("A" & target.row).value)

#2. VBA is forgiving, but it's better to use + to add numbers and & to
concatenate strings. You could get in trouble if the strings look like numbers
and they're added, not concatentated.

#3. Since you're in the worksheet_change event, it's better to use the keyword
Me instead of Activesheet. Me refters to the thing that owns the code. In this
case, it's the worksheet.

#4. You can check for a single/entire row being deleted by:
if target.address = target.cells(1).entirerow.address then

And check for multiple rows
if target.address = target.entirerow.address then

#5. If you know the name of the single checkbox to delete--but not sure if it's
there, you can use:

on error resume next
me.oleobjects(lccheckboxtodelete).delete
on error goto 0

#6. You may want to consider an alternative. Maybe give the user a dedicated
macro that would delete the rows (and checkboxes). Then you don't have to
struggle with the worksheet_event.

#7. In fact, you may want to rethink the checkboxes and use something
else/easier.

(saved from a previous post)

Select the range that would have held the checkboxes.
Format|cells|number tab|custom category
In the "type:" box, put this:
alt-0252;alt-0252;alt-0252;alt-0252

But hit and hold the alt key while you're typing the 0252 from the numeric
keypad.

It should look something like this when you're done.
ü;ü;ü;ü
(umlaut over the lower case u separated by semicolons)

And format that range of cells as Wingdings (make it as large as you want)

Now, no matter what you type (spacebar, x, anyoldtextatall), you'll see a check
mark.

Hit the delete key on the keyboard to clear the cell.

If you have to use that "checkmark" in later formulas:
=if(a1="","no checkmark","Yes checkmark")

Or you can filter by blanks and non-blanks.

BG Lad wrote:

Functionality: To Remove an OLE check box in the row when the user deletes a
row.
This is my current attempt. I get an error message "Can't enter break mode
at this time".
The CheckBox is not linked, it is for visual and print only. There are
remmed statements from previous attempts. Any ideas on this one?

'** Snipped ******************
Dim rowcount As Long
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Err_Worksheet_Change

Dim llCanDeleteTheBox As Boolean
Dim lcCheckBoxToDelete As String
'Application.EnableEvents = False 'should be part of Change macro

If IsEmpty(rowcount) Then
'* First time through ... *'
Else

If ActiveSheet.UsedRange.Rows.Count = rowcount - 1 Then
'* A row was deleted *'

lcCheckBoxToDelete = "CheckBox" + Trim(Str(ActiveSheet.Range("A"
+ Trim(Str(Target.Row))).Value))

For Each Obj In ThisWorkbook.ActiveSheet.OLEObjects
'* Find the Relative Checkbox *'
Stop
If Obj.Name = lcCheckBoxToDelete Then
Stop
'Obj.Delete
llCanDeleteTheBox = True
'lcCheckBoxToDelete = Obj.Name
'ThisWorkbook.ActiveSheet.OLEObjects(Obj.Name).Del ete
Exit For
End If
Next
End If
End If

If llCanDeleteTheBox Then
Stop
'* Delete the Check Box *'
ThisWorkbook.ActiveSheet.OLEObjects(lcCheckBoxToDe lete).Delete
End If

rowcount = ActiveSheet.UsedRange.Rows.Count
'** End of SNIPPED *****************

--
B Good Lad


--

Dave Peterson


BG Lad

Delete an OLE Check Box in COde when a deleting a row
 
Any quickies on stepping through the deleted rows?
--
B Good Lad


"Dave Peterson" wrote:

I didn't test your code, but when you step through code that works with
OLEObjects, you can get that error.

I'd put a break point above the row that does the work and after the row. Then
RUN (not Step) through the code.

Some other notes:

#1. VBA's syntax is very nice, you could use:

lcCheckBoxToDelete = "CheckBox" _
+ Trim(Str(ActiveSheet.Range("A" + Trim(Str(Target.Row))).Value))

lcCheckBoxToDelete = "CheckBox" & me.cells(target.row,"A").value)
or
lcCheckBoxToDelete = "CheckBox" & me.range("A" & target.row).value)

#2. VBA is forgiving, but it's better to use + to add numbers and & to
concatenate strings. You could get in trouble if the strings look like numbers
and they're added, not concatentated.

#3. Since you're in the worksheet_change event, it's better to use the keyword
Me instead of Activesheet. Me refters to the thing that owns the code. In this
case, it's the worksheet.

#4. You can check for a single/entire row being deleted by:
if target.address = target.cells(1).entirerow.address then

And check for multiple rows
if target.address = target.entirerow.address then

#5. If you know the name of the single checkbox to delete--but not sure if it's
there, you can use:

on error resume next
me.oleobjects(lccheckboxtodelete).delete
on error goto 0

#6. You may want to consider an alternative. Maybe give the user a dedicated
macro that would delete the rows (and checkboxes). Then you don't have to
struggle with the worksheet_event.

#7. In fact, you may want to rethink the checkboxes and use something
else/easier.

(saved from a previous post)

Select the range that would have held the checkboxes.
Format|cells|number tab|custom category
In the "type:" box, put this:
alt-0252;alt-0252;alt-0252;alt-0252

But hit and hold the alt key while you're typing the 0252 from the numeric
keypad.

It should look something like this when you're done.
ü;ü;ü;ü
(umlaut over the lower case u separated by semicolons)

And format that range of cells as Wingdings (make it as large as you want)

Now, no matter what you type (spacebar, x, anyoldtextatall), you'll see a check
mark.

Hit the delete key on the keyboard to clear the cell.

If you have to use that "checkmark" in later formulas:
=if(a1="","no checkmark","Yes checkmark")

Or you can filter by blanks and non-blanks.

BG Lad wrote:

Functionality: To Remove an OLE check box in the row when the user deletes a
row.
This is my current attempt. I get an error message "Can't enter break mode
at this time".
The CheckBox is not linked, it is for visual and print only. There are
remmed statements from previous attempts. Any ideas on this one?

'** Snipped ******************
Dim rowcount As Long
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Err_Worksheet_Change

Dim llCanDeleteTheBox As Boolean
Dim lcCheckBoxToDelete As String
'Application.EnableEvents = False 'should be part of Change macro

If IsEmpty(rowcount) Then
'* First time through ... *'
Else

If ActiveSheet.UsedRange.Rows.Count = rowcount - 1 Then
'* A row was deleted *'

lcCheckBoxToDelete = "CheckBox" + Trim(Str(ActiveSheet.Range("A"
+ Trim(Str(Target.Row))).Value))

For Each Obj In ThisWorkbook.ActiveSheet.OLEObjects
'* Find the Relative Checkbox *'
Stop
If Obj.Name = lcCheckBoxToDelete Then
Stop
'Obj.Delete
llCanDeleteTheBox = True
'lcCheckBoxToDelete = Obj.Name
'ThisWorkbook.ActiveSheet.OLEObjects(Obj.Name).Del ete
Exit For
End If
Next
End If
End If

If llCanDeleteTheBox Then
Stop
'* Delete the Check Box *'
ThisWorkbook.ActiveSheet.OLEObjects(lcCheckBoxToDe lete).Delete
End If

rowcount = ActiveSheet.UsedRange.Rows.Count
'** End of SNIPPED *****************

--
B Good Lad


--

Dave Peterson


BG Lad

Delete an OLE Check Box in COde when a deleting a row
 
Guessed it, it is ...
For Each ER In Me.Rows(Target.EntireRow.Address)
Next
Thanks again, great motivation!
Happy New Year to ALL
Bill
--
B Good Lad


"BG Lad" wrote:

Any quickies on stepping through the deleted rows?
--
B Good Lad


"Dave Peterson" wrote:

I didn't test your code, but when you step through code that works with
OLEObjects, you can get that error.

I'd put a break point above the row that does the work and after the row. Then
RUN (not Step) through the code.

Some other notes:

#1. VBA's syntax is very nice, you could use:

lcCheckBoxToDelete = "CheckBox" _
+ Trim(Str(ActiveSheet.Range("A" + Trim(Str(Target.Row))).Value))

lcCheckBoxToDelete = "CheckBox" & me.cells(target.row,"A").value)
or
lcCheckBoxToDelete = "CheckBox" & me.range("A" & target.row).value)

#2. VBA is forgiving, but it's better to use + to add numbers and & to
concatenate strings. You could get in trouble if the strings look like numbers
and they're added, not concatentated.

#3. Since you're in the worksheet_change event, it's better to use the keyword
Me instead of Activesheet. Me refters to the thing that owns the code. In this
case, it's the worksheet.

#4. You can check for a single/entire row being deleted by:
if target.address = target.cells(1).entirerow.address then

And check for multiple rows
if target.address = target.entirerow.address then

#5. If you know the name of the single checkbox to delete--but not sure if it's
there, you can use:

on error resume next
me.oleobjects(lccheckboxtodelete).delete
on error goto 0

#6. You may want to consider an alternative. Maybe give the user a dedicated
macro that would delete the rows (and checkboxes). Then you don't have to
struggle with the worksheet_event.

#7. In fact, you may want to rethink the checkboxes and use something
else/easier.

(saved from a previous post)

Select the range that would have held the checkboxes.
Format|cells|number tab|custom category
In the "type:" box, put this:
alt-0252;alt-0252;alt-0252;alt-0252

But hit and hold the alt key while you're typing the 0252 from the numeric
keypad.

It should look something like this when you're done.
ü;ü;ü;ü
(umlaut over the lower case u separated by semicolons)

And format that range of cells as Wingdings (make it as large as you want)

Now, no matter what you type (spacebar, x, anyoldtextatall), you'll see a check
mark.

Hit the delete key on the keyboard to clear the cell.

If you have to use that "checkmark" in later formulas:
=if(a1="","no checkmark","Yes checkmark")

Or you can filter by blanks and non-blanks.

BG Lad wrote:

Functionality: To Remove an OLE check box in the row when the user deletes a
row.
This is my current attempt. I get an error message "Can't enter break mode
at this time".
The CheckBox is not linked, it is for visual and print only. There are
remmed statements from previous attempts. Any ideas on this one?

'** Snipped ******************
Dim rowcount As Long
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Err_Worksheet_Change

Dim llCanDeleteTheBox As Boolean
Dim lcCheckBoxToDelete As String
'Application.EnableEvents = False 'should be part of Change macro

If IsEmpty(rowcount) Then
'* First time through ... *'
Else

If ActiveSheet.UsedRange.Rows.Count = rowcount - 1 Then
'* A row was deleted *'

lcCheckBoxToDelete = "CheckBox" + Trim(Str(ActiveSheet.Range("A"
+ Trim(Str(Target.Row))).Value))

For Each Obj In ThisWorkbook.ActiveSheet.OLEObjects
'* Find the Relative Checkbox *'
Stop
If Obj.Name = lcCheckBoxToDelete Then
Stop
'Obj.Delete
llCanDeleteTheBox = True
'lcCheckBoxToDelete = Obj.Name
'ThisWorkbook.ActiveSheet.OLEObjects(Obj.Name).Del ete
Exit For
End If
Next
End If
End If

If llCanDeleteTheBox Then
Stop
'* Delete the Check Box *'
ThisWorkbook.ActiveSheet.OLEObjects(lcCheckBoxToDe lete).Delete
End If

rowcount = ActiveSheet.UsedRange.Rows.Count
'** End of SNIPPED *****************

--
B Good Lad


--

Dave Peterson


Dave Peterson

Delete an OLE Check Box in COde when a deleting a row
 
If they're gone, you won't be able to step through them.

But you could use the row numbers in the target range to delete the checkboxes.

dim iCtr as long
'your check to see if the target is the entire range here
'and your code to check to see if the rows were deleted

if thatIsTrue then
with target
for ictr = .row to .rows(.rows.count).row
'determine the checkbox name here
lccheckboxtodelete = "CheckBox" & me.cells(ictr,"A").value)
on error resume next
me.oleobjects(lccheckboxtodelete).delete
on error goto 0
next ictr
end with
end if


==
Untested and uncompiled.



BG Lad wrote:

Any quickies on stepping through the deleted rows?
--
B Good Lad

"Dave Peterson" wrote:

I didn't test your code, but when you step through code that works with
OLEObjects, you can get that error.

I'd put a break point above the row that does the work and after the row. Then
RUN (not Step) through the code.

Some other notes:

#1. VBA's syntax is very nice, you could use:

lcCheckBoxToDelete = "CheckBox" _
+ Trim(Str(ActiveSheet.Range("A" + Trim(Str(Target.Row))).Value))

lcCheckBoxToDelete = "CheckBox" & me.cells(target.row,"A").value)
or
lcCheckBoxToDelete = "CheckBox" & me.range("A" & target.row).value)

#2. VBA is forgiving, but it's better to use + to add numbers and & to
concatenate strings. You could get in trouble if the strings look like numbers
and they're added, not concatentated.

#3. Since you're in the worksheet_change event, it's better to use the keyword
Me instead of Activesheet. Me refters to the thing that owns the code. In this
case, it's the worksheet.

#4. You can check for a single/entire row being deleted by:
if target.address = target.cells(1).entirerow.address then

And check for multiple rows
if target.address = target.entirerow.address then

#5. If you know the name of the single checkbox to delete--but not sure if it's
there, you can use:

on error resume next
me.oleobjects(lccheckboxtodelete).delete
on error goto 0

#6. You may want to consider an alternative. Maybe give the user a dedicated
macro that would delete the rows (and checkboxes). Then you don't have to
struggle with the worksheet_event.

#7. In fact, you may want to rethink the checkboxes and use something
else/easier.

(saved from a previous post)

Select the range that would have held the checkboxes.
Format|cells|number tab|custom category
In the "type:" box, put this:
alt-0252;alt-0252;alt-0252;alt-0252

But hit and hold the alt key while you're typing the 0252 from the numeric
keypad.

It should look something like this when you're done.
ü;ü;ü;ü
(umlaut over the lower case u separated by semicolons)

And format that range of cells as Wingdings (make it as large as you want)

Now, no matter what you type (spacebar, x, anyoldtextatall), you'll see a check
mark.

Hit the delete key on the keyboard to clear the cell.

If you have to use that "checkmark" in later formulas:
=if(a1="","no checkmark","Yes checkmark")

Or you can filter by blanks and non-blanks.

BG Lad wrote:

Functionality: To Remove an OLE check box in the row when the user deletes a
row.
This is my current attempt. I get an error message "Can't enter break mode
at this time".
The CheckBox is not linked, it is for visual and print only. There are
remmed statements from previous attempts. Any ideas on this one?

'** Snipped ******************
Dim rowcount As Long
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Err_Worksheet_Change

Dim llCanDeleteTheBox As Boolean
Dim lcCheckBoxToDelete As String
'Application.EnableEvents = False 'should be part of Change macro

If IsEmpty(rowcount) Then
'* First time through ... *'
Else

If ActiveSheet.UsedRange.Rows.Count = rowcount - 1 Then
'* A row was deleted *'

lcCheckBoxToDelete = "CheckBox" + Trim(Str(ActiveSheet.Range("A"
+ Trim(Str(Target.Row))).Value))

For Each Obj In ThisWorkbook.ActiveSheet.OLEObjects
'* Find the Relative Checkbox *'
Stop
If Obj.Name = lcCheckBoxToDelete Then
Stop
'Obj.Delete
llCanDeleteTheBox = True
'lcCheckBoxToDelete = Obj.Name
'ThisWorkbook.ActiveSheet.OLEObjects(Obj.Name).Del ete
Exit For
End If
Next
End If
End If

If llCanDeleteTheBox Then
Stop
'* Delete the Check Box *'
ThisWorkbook.ActiveSheet.OLEObjects(lcCheckBoxToDe lete).Delete
End If

rowcount = ActiveSheet.UsedRange.Rows.Count
'** End of SNIPPED *****************

--
B Good Lad


--

Dave Peterson


--

Dave Peterson


All times are GMT +1. The time now is 04:09 PM.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
ExcelBanter.com