使用多个命名范围的迭代

Iteration using multiple named ranges

我想做的是创建一个日记电子表格,记录从用户窗体提交条目时的时间和日期,然后更新“Splash”工作表上的日历以更改单元格内部和字体颜色显示已为该特定日期创建日记条目。

我创建了一个模块来遍历今年早些时候从旧日记条目中导入的内容,我想更改以月份命名的命名范围内单元格的内部颜色和文本颜色。在下图中,月份名称不在命名范围内,只是数字列表。

日历视图

基本上,我想搜索日期,select 并更改日历中这些日期的单元格颜色(见上文)。我可以很好地度过命名范围的第一个月,但是当它变成新的月份时,它会给我 运行-time error 91.

Sub updateCells()
    Dim rCell As Range
    Dim rRng As Range: Set rRng = Worksheets("Journals").Range("A2:A44")
    Dim thisDate, thisMonth, thisDay
    Dim thisMonthRange As Range
    
    For Each rCell In rRng.Cells
        thisDate = Split(rCell.Text, " ")(0)
        thisMonth = MonthName(month(thisDate))
        thisDay = day(thisDate)
        Range(thisMonth).Find(what:=thisDay).Interior.ColorIndex = 10
        Range(thisMonth).Find(what:=thisDay).Font.Color = vbWhite
    Next rCell

我对 VBA 比较陌生,所以我不明白什么会导致 运行-time 错误。

我认为问题很可能是您指定的范围之一没有涵盖整个日期范围。 2 月肯定没有,你错过了 28 日!

无论如何,结果(显然只有在第二个回合(Feb 28?)),你 运行 进入 Run-time error '91',因为 Range(thisMonth).Find(what:=thisDay) 解析为 Nothing 而不是预期的 Range 对象,一旦您无法在命名范围内找到 thisDay

显然,代码无法执行Nothing.Interior.ColorIndex = 10

如果正确,您的解决方案应该是 double-check 并修复不正确的命名范围。

顺带一提,Range(thisMonth).Find(what:=thisDay)也是多余的。出于显而易见的原因,每个范围简单地从 1 开始并以 1 递增。因此我们可以简单地使用 thisDay 作为索引。而不是这个:

        Range(thisMonth).Find(what:=thisDay).Interior.ColorIndex = 10
        Range(thisMonth).Find(what:=thisDay).Font.Color = vbWhite

只需使用这个:

        With Range(thisMonth).Cells(thisDay)
            .Interior.ColorIndex = 10
            .Font.Color = vbWhite
        End With

更新:想一想,如果你想坚持使用Range(thisMonth).Find(what:=thisDay),你至少应该把代码片段改成Range(thisMonth).Find(what:=thisDay, LookAt:=xlWhole)

与直觉相反,Range.Find(...) 似乎默认接受部分匹配 (xlPart),它实际上会记住您在上次查找时使用的设置(在同一个 Excel 'session').此外,它不会总是从您期望的位置开始(进一步参见 documentation and this post: )。例如。根据您的设置/活动单元格位置的实际错误可能是您的代码(顺便说一下,还有 Cyril 提供的代码)将更改一天的格式 10,而实际上您正在尝试更改格式一天 1.

这需要命名范围,这些范围是月份的实际名称,例如,Range("January") 引用了“一月”日期列表 (1-31)。 我将使用以下代码在我的 Range("May") 中突出显示今天日期 (2022-05-18) 中的“18”:

Sub markCurrentDate()
    Cells.ClearFormats
    Dim currentMonth As String
    currentMonth = Format(Date, "mmmm")
    Dim currentDay As Long
    currentDay = Format(Date, "dd")
    Dim foundDate As Range
    Set foundDate = Range(currentMonth).Find(currentDay)
    foundDate.Interior.ColorIndex = 27
End Sub

由于我们无法根据当前 post 判断您所指日期的源单元格是什么,因此我使用了 Date 而不是对单元格的引用。可以通过引用更新,类似于可以使用With foundDate添加多个格式更改。