每个循环的Excel VBA跳过checkbox

我在Excel中正在做的待办事项列表有问题。 目前,我正在尝试创build一个VBA代码,只要单元格中的值发生更改,就会更新单元格内部填充颜色。 换句话说,F列包含项目的到期date。 如果该项目到期,那么整行的颜色应该是红色的。 如果该项目从那时起超过30天,应该是绿色的,并在两者之间不同的停留。 待办事项列表应该是dynamic的。 即用户可以随时添加新的行。 由于VBA无法知道最后一行数据的位置,因此我已将代码设置为依赖列表最左侧的checkbox的位置。 我会张贴一个图片,但是我刚刚开始,所以我还没有这个能力。 本质上,行2中有一个标题行,从列B开始有6个列,转到列G,“检查,状态,任务,注释,到期date”。

有12个参赛作品的列表。 条目1-11工作正常,并代表一行可以11种不同的可能颜色。 第12行从第11行拖放,并包含所有function和checkbox。 在调用VBA时,行12不会更新。

我的代码使用For Each循环遍历列表中的每个checkbox,并根据截止date更新颜色。 对于大多数的checkbox,它的工作正常,并始终位于msgbox表明它正在通过循环罚款。 但是,当我添加一个新行时,通过select整个行并在工作表中拖动它,VBA代码停止只识别新的checkbox。 它可以遍历所有的框,除了新的框。 我也附加了我的VBA代码。 如果任何人可以告诉我如何解决无法识别的(非爱)checkbox,我将不胜感激!

检查更新的代码此代码位于VBA的Worksheet1部分中,不在其他模块中。

Private Sub Worksheet_Change(ByVal Target As Range) Application.Volatile True Application.ScreenUpdating = False Call Checkbox_Due_Color Application.ScreenUpdating = True End Sub 

代码设置范围和作为决策处理程序我相信问题是在这个代码中的循环。 MsgBox myCheckboxLoc.Address最后一个checkbox不会触发。 这位于第2单元。

 Option Explicit Sub Checkbox_Due_Color() '=============================================================== 'Determines how to update the color to indicate days left. '=============================================================== Application.Volatile True Dim myCheckbox As CheckBox Dim myCheckboxLoc As Range Dim myDaysLeft As Integer Dim myCheckboxName As String For Each myCheckbox In ActiveSheet.CheckBoxes Set myCheckboxLoc = Range(myCheckbox.TopLeftCell.Address & ":" & myCheckbox.TopLeftCell.Offset(0, 5).Address) MsgBox myCheckboxLoc.Address If IsEmpty(myCheckbox.TopLeftCell.Offset(0, 4)) = True Then 'MsgBox "IF TRUE" myCheckboxLoc.Interior.ColorIndex = xlNone Else 'MsgBox "IF False" myDaysLeft = myCheckbox.TopLeftCell.Offset(0, 4).Value - Date 'MsgBox myDaysLeft Call Update_Color(myCheckboxLoc, myDaysLeft) End If Next myCheckbox End Sub 

代码来确定使用什么颜色这段代码工作正常,为了清楚起见,包括在内。 也位于模块2。

 Sub Update_Color(myCheckboxLoc As Range, myDaysLeft As Integer) '=============================================================== 'Change background color of cell related to days left until due. '=============================================================== Select Case myDaysLeft Case Is <= 0 myCheckboxLoc.Interior.Color = RGB(255, 0, 0) Case 1 myCheckboxLoc.Interior.Color = RGB(255, 50, 0) Case 2 myCheckboxLoc.Interior.Color = RGB(255, 100, 0) Case 3 To 4 myCheckboxLoc.Interior.Color = RGB(255, 150, 0) Case 5 To 6 myCheckboxLoc.Interior.Color = RGB(255, 200, 0) Case 7 To 9 myCheckboxLoc.Interior.Color = RGB(255, 210, 0) Case 10 To 13 myCheckboxLoc.Interior.Color = RGB(255, 230, 0) Case 14 To 20 myCheckboxLoc.Interior.Color = RGB(255, 255, 0) Case 21 To 29 myCheckboxLoc.Interior.Color = RGB(175, 255, 0) Case Else myCheckboxLoc.Interior.Color = RGB(0, 255, 0) End End Select End Sub 

您的代码在Update_Color子过程中被破坏。 您不需要在“结束select”之前放置“结束”。 您的案例陈述应该如下所示:

  Select Case myDaysLeft Case Is <= 0 myCheckboxLoc.Interior.Color = RGB(255, 0, 0) Case 1 myCheckboxLoc.Interior.Color = RGB(255, 50, 0) Case 2 myCheckboxLoc.Interior.Color = RGB(255, 100, 0) Case 3 To 4 myCheckboxLoc.Interior.Color = RGB(255, 150, 0) Case 5 To 6 myCheckboxLoc.Interior.Color = RGB(255, 200, 0) Case 7 To 9 myCheckboxLoc.Interior.Color = RGB(255, 210, 0) Case 10 To 13 myCheckboxLoc.Interior.Color = RGB(255, 230, 0) Case 14 To 20 myCheckboxLoc.Interior.Color = RGB(255, 255, 0) Case 21 To 29 myCheckboxLoc.Interior.Color = RGB(175, 255, 0) Case Else myCheckboxLoc.Interior.Color = RGB(0, 255, 0) End Select 

我重新创build了你的工作表,一切工作正常后,我删除了该行。 我也build议你使用“Debug.print”而不是“MsgBox”来进行debugging。

你还说:“因为VBA不能知道最后一行数据在哪里,所以我把代码设置为依赖于列表最左边的checkbox的位置。 这不太准确。 您可以使用End属性来确定最后一行数据。 喜欢这个:

 Sub getTaskRange() Dim cell As Range Dim taskRange As Range 'Set the range object dynamically Set taskRange = ActiveSheet.Range(Cells(2, "d"), Cells(Rows.Count, "d").End(xlUp)) 'Print the contents of each cell to the immediate window For Each cell In taskRange Debug.Print cell.Value Next cell End Sub