【问题标题】:Zero values being read-in as missing values in VBA在 VBA 中将零值作为缺失值读入
【发布时间】:2017-01-12 04:58:55
【问题描述】:

我正在尝试跟踪工作表并突出显示以空白值或 0 值(或“NaN”)值返回的单元格。我编写了一个嵌套的 for 循环来为我执行此操作,但是,我看到了一个奇怪的项目。

如果值等于 0,则有问题的单元格应变为红色。但是,当我运行宏时,最终结果是所有通过 if statement 条件的单元格都以黄色结尾,即使为 0。也许是 VBA将空白单元格读取为 0,或者单元格不是真正的空白?我犯了错误,还是我对 VBA 的逻辑不正确?

    'i is for the columns
For i = 2 To 4 'lastColumn

    totalCounter = 0
    outageCounter = 0
    missingCounter = 0

    'j is for the rows
    For j = 6 To lastRow

        'highlight if production outage
        If mainSheet.Cells(j, i).Value = 0 Then
            mainSheet.Cells(j, i).Interior.Color = vbRed
            outageCounter = outageCounter + 1
        End If

        'highlight if comm outage
        If mainSheet.Cells(j, i).Value = "" Or mainSheet.Cells(j, i).Value = "NaN" Then
            mainSheet.Cells(j, i).Interior.Color = vbYellow
            missingCounter = missingCounter + 1
        End If

        totalCounter = totalCounter + 1

    Next j

    mainSheet.Cells(lastRow + 2, i).Value = missingCounter
    mainSheet.Cells(lastRow + 3, i).Value = outageCounter
    mainSheet.Cells(lastRow + 4, i).Value = totalCounter

【问题讨论】:

  • 我相信你是对的——即使单元格中的值为空白,你的初始 IF 也会为真。
  • 好奇:您使用的“NaN”是什么? AFAIK,Excel 没有 NaN 值(如“不是数字”),除非您的数据中只有字符串“NaN”。
  • 您的代码会将空单元格、包含"" 的单元格和包含"NaN" 的单元格设置为黄色(在第一次将空单元格更改为红色很短时间之后)。但是,正如您在问题中所说的那样,您的代码没有理由将包含 0 的单元格更改为黄色(“所有通过 if 语句条件的单元格都以黄色结尾,即使为 0”)。您是否 100% 确定包含 0 的单元格最终会显示为黄色?!?
  • @YowE3K 我想我可以回答 OP。当单元格中没有任何内容时,.Value 将匹配 If 语句中的 0 或 "",因此,是的,这两个条件都会满足。
  • @vknowles - 但这并不能解释 0 如何以黄色结束 - 只是为什么空单元格以黄色结束(在短时间内变为红色后)。

标签: vba excel


【解决方案1】:

在 Excel 中,空单元格的默认值为 0,因此在检查是否为零之前,您需要先检查是否有内容:

 Dim c As Range

 For j = 6 To lastRow

    Set c = mainSheet.Cells(j, i)

    'highlight if production outage
    If Len(c.Value) > 0 And c.Value = 0 Then
        c.Interior.Color = vbRed
        outageCounter = outageCounter + 1
    End If

    'highlight if comm outage
    If c.Value = "" Or c.Value = "NaN" Then
        c.Interior.Color = vbYellow
        missingCounter = missingCounter + 1
    End If

    totalCounter = totalCounter + 1

Next j

【讨论】:

    【解决方案2】:

    您可以使用Text 属性并对照0(“生产中断”)和“”或“NaN”(“通信中断”)检查它

    您还可以使用一些With - End With 来减少打字和内存访问

    With mainSheet
        For i = 2 To 4 'lastColumn
    
            totalCounter = 0
            outageCounter = 0
            missingCounter = 0
    
            'j is for the rows
            For j = 6 To lastrow
    
                With .Cells(j, i)
                    Select Case .Text
                        Case 0
                            'highlight if production outage
                            .Interior.Color = vbRed
                            outageCounter = outageCounter + 1
    
                        Case "", "NaN"
                            'highlight if comm outage
                            .Interior.Color = vbYellow
                            missingCounter = missingCounter + 1
                    End Select
    
                    totalCounter = totalCounter + 1
                End With
            Next j
    
            .Cells(lastrow + 2, i).value = missingCounter
            .Cells(lastrow + 3, i).value = outageCounter
            .Cells(lastrow + 4, i).value = totalCounter
        Next i
    End With
    

    【讨论】:

    • 我喜欢这个,因为它利用了一个可以区分空和 0 的属性,而不必进行两次测试(长度和值)。
    猜你喜欢
    • 2016-07-12
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2019-05-07
    • 2014-12-10
    • 2020-01-15
    • 1970-01-01
    • 2021-10-22
    相关资源
    最近更新 更多