2017-01-11 10 views
0

シートをトレースし、ブランク値または0値(または "NaN")値として戻ってくるセルを強調表示しようとしています。私はこれを行うためにネストされたforループを書いたが、私は奇妙なアイテムを見ている。VBAでゼロ値が欠損値として読み込まれています

値が0の場合、セルは赤に変わります。ただし、マクロを実行すると、if statementの条件をパスするすべてのセルが0になっても黄色で終了します。空白のセルを0にするか、セルが真に空白ではないのですか?私は間違いを犯したのですか、あるいは私はVBAの論理について間違っていますか? Excelで

'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 
+0

私はあなたが正しいと信じています - あなたの最初の「IF」は、セルの値が空白の場合でも真です。 – vknowles

+0

好奇心:それを使用しているときに「NaN」とは何ですか? AFAIKでは、データに「NaN」という文字列が含まれていない限り、ExcelにはNaN値(「数字ではない」)がありません。 – vknowles

+0

あなたのコードは、空のセル、 '" "'を含むセル、 '' NaN ''を含むセルを黄色に(非常に短い時間空のセルを最初に赤に変更した後)設定します。しかし、あなたの質問で言うように、あなたのコードが「0」を含むセルを黄色に変えなければならない理由はありません(「if文の条件を通過するすべてのセルが0になっても黄色で終わる」)。 '0'を含むセルが黄色になることを100%確信していますか? – YowE3K

答えて

3

空のセルのデフォルト値はゼロであるので、あなたがチェックする必要がゼロのためにチェックする前に、いくつかのコンテンツが実際にあります:

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 
1

あなたがTextプロパティを使用して0に対してそれを確認することができますあなたはまた、タイピングやメモリを減らすために、いくつかのWith - End Withを使用することができます

(「生産停止」)と「」または「NaNの」(「COMM停止」)は、アクセス

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

2つのテスト(長さと値)を行う必要がなく、空と0を区別する1つのプロパティを利用するため、このようにしています。 – vknowles

関連する問題