简体   繁体   中英

Excel VBA: each empty cell in range = 0

I've been trying to run the following code without luck. Nothing happens:

dim Dim OutputDataBordyRange As Range
Dim OutputCell As Range

For Each OutputCell In OutputDataBordyRange.Cells

    If OutputCell Is Nothing Then

        OutputCell.Value = 0

    End If

Next OutputCell

Any suggestions?

Edit. I've tried below suggestions without luck. therefore, as requested, find below full code:

Sub Output_SBTB()

Dim InputDataRange As Range
Dim InputCountryRange As Range
Dim InputSiteRange As Range
Dim InputServiceLineRange As Range
Dim InputCalcHourlySalaryRateRange As Range
Dim InputRegionRange As Range
Dim OutputDataBodyRange As Range
Dim OutputHearderRowRange As Range

Dim OutputArrayColumns As Long
Dim OutputArrayRows As Long

Dim OutputArray() As Variant
Dim OutputArrayCounter As Long

Dim InputRowCounter As Long

Dim MatchRegion As Long

Dim InputCurrentSiteRowsCount As Long
Dim i As Long

Dim OutputCell As Range

Set InputDataRange = ThisWorkbook.Worksheets(Sheet3.Name).PivotTables("PivotTableData").DataBodyRange
Set InputCountryRange = ThisWorkbook.Worksheets(Sheet3.Name).PivotTables("PivotTableData").PivotFields("Country").DataRange
Set InputSiteRange = ThisWorkbook.Worksheets(Sheet3.Name).PivotTables("PivotTableData").PivotFields("Site").DataRange
Set InputServiceLineRange = ThisWorkbook.Worksheets(Sheet3.Name).PivotTables("PivotTableData").PivotFields("Serviceline").DataRange
Set InputCalcHourlySalaryRateRange = ThisWorkbook.Worksheets(Sheet3.Name).PivotTables("PivotTableData").PivotFields("CalcHourlySalaryRate").DataRange
Set InputRegionRange = ThisWorkbook.Worksheets(Sheet4.Name).PivotTables("PivotTableRegion").PivotFields("Country").DataRange
Set OutputDataBodyRange = ThisWorkbook.Worksheets(Sheet2.Name).ListObjects("TableOutput").DataBodyRange
Set OutputHearderRowRange = ThisWorkbook.Worksheets(Sheet2.Name).ListObjects("TableOutput").HeaderRowRange

OutputArrayColumns = InputDataRange.Rows.Count
OutputArrayRows = OutputHearderRowRange.Columns.Count

ReDim Preserve OutputArray(OutputArrayRows, 1)
OutputArrayCounter = 0

If Not OutputDataBodyRange Is Nothing Then

    OutputDataBodyRange.Delete

End If

For InputRowCounter = 1 To InputDataRange.Rows.Count

    If InputSiteRange(InputRowCounter) <> InputSiteRange(InputRowCounter - 1) Then

        OutputArrayCounter = OutputArrayCounter + 1
        ReDim Preserve OutputArray(OutputArrayRows, OutputArrayCounter)


        MatchRegion = Application.WorksheetFunction.Match(InputCountryRange(InputRowCounter), InputRegionRange, 0)
        OutputArray(1, OutputArrayCounter) = InputRegionRange(MatchRegion).Offset(0, -1)
        OutputArray(2, OutputArrayCounter) = InputCountryRange(InputRowCounter)
        OutputArray(3, OutputArrayCounter) = InputSiteRange(InputRowCounter)

        InputCurrentSiteRowsCount = Application.WorksheetFunction.CountIf(InputSiteRange, OutputArray(3, OutputArrayCounter)) - 1

        For i = 0 To InputCurrentSiteRowsCount

            ' *** Landscaping & Irrigation System ***
            If InputServiceLineRange(InputRowCounter + i) = "3.2.3-3.2.4 Landscaping & Irrigation System" Or InputServiceLineRange(InputRowCounter + i) = "Landscaping & Irrigation System - SBTB" Then

                If InputCalcHourlySalaryRateRange(InputRowCounter + i) = "(blank)" Then

                    OutputArray(4, OutputArrayCounter) = OutputArray(4, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 1)
                    OutputArray(5, OutputArrayCounter) = OutputArray(5, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 2)
                    OutputArray(6, OutputArrayCounter) = OutputArray(6, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 3)

                Else

                    OutputArray(4, OutputArrayCounter) = OutputArray(4, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 1) + InputCalcHourlySalaryRateRange(InputRowCounter + i) * InputDataRange(InputRowCounter + i, 4)
                    OutputArray(5, OutputArrayCounter) = OutputArray(4, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 2) + InputCalcHourlySalaryRateRange(InputRowCounter + i) * InputDataRange(InputRowCounter + i, 5)
                    OutputArray(6, OutputArrayCounter) = OutputArray(4, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 3) + InputCalcHourlySalaryRateRange(InputRowCounter + i) * InputDataRange(InputRowCounter + i, 6)

                End If

            End If

            ' *** Interior Plant and Tree Maintenance ***
            If InputServiceLineRange(InputRowCounter + i) = "3.2.11 Interior Plant and Tree Maintenance" Or InputServiceLineRange(InputRowCounter + i) = "Interior Plant and Tree Maintenance - SBTB" Then

                If InputCalcHourlySalaryRateRange(InputRowCounter + i) = "(blank)" Then

                    OutputArray(7, OutputArrayCounter) = OutputArray(7, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 1)
                    OutputArray(8, OutputArrayCounter) = OutputArray(8, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 2)
                    OutputArray(9, OutputArrayCounter) = OutputArray(9, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 3)

                Else

                    OutputArray(7, OutputArrayCounter) = OutputArray(7, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 1) + InputCalcHourlySalaryRateRange(InputRowCounter + i) * InputDataRange(InputRowCounter + i, 4)
                    OutputArray(8, OutputArrayCounter) = OutputArray(8, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 2) + InputCalcHourlySalaryRateRange(InputRowCounter + i) * InputDataRange(InputRowCounter + i, 5)
                    OutputArray(9, OutputArrayCounter) = OutputArray(9, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 3) + InputCalcHourlySalaryRateRange(InputRowCounter + i) * InputDataRange(InputRowCounter + i, 6)

                End If

            End If

            ' *** Interior Pest Control ***
            If InputServiceLineRange(InputRowCounter + i) = "3.3.10 Interior Pest Control" Or InputServiceLineRange(InputRowCounter + i) = "Pest Control - SBTB" Then

                If InputCalcHourlySalaryRateRange(InputRowCounter + i) = "(blank)" Then

                    OutputArray(10, OutputArrayCounter) = OutputArray(10, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 1)
                    OutputArray(11, OutputArrayCounter) = OutputArray(11, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 2)
                    OutputArray(12, OutputArrayCounter) = OutputArray(12, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 3)

                Else

                    OutputArray(10, OutputArrayCounter) = OutputArray(10, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 1) + InputCalcHourlySalaryRateRange(InputRowCounter + i) * InputDataRange(InputRowCounter + i, 4)
                    OutputArray(11, OutputArrayCounter) = OutputArray(11, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 2) + InputCalcHourlySalaryRateRange(InputRowCounter + i) * InputDataRange(InputRowCounter + i, 5)
                    OutputArray(12, OutputArrayCounter) = OutputArray(12, OutputArrayCounter) + InputDataRange(InputRowCounter + i, 3) + InputCalcHourlySalaryRateRange(InputRowCounter + i) * InputDataRange(InputRowCounter + i, 6)

                End If

            End If

        Next i

    End If

Next InputRowCounter

ThisWorkbook.Worksheets(Sheet2.Name).Range("A3:L" & OutputArrayCounter) = Application.WorksheetFunction.Transpose(OutputArray)

For Each OutputCell In OutputDataBodyRange.Cells

    If OutputCell.Value = vbNullString Then

        OutputCell.Value = 0

    End If

Next OutputCell

End Sub

If anything needs to be specified, please let me know.

If the cells are actually empty, you could skip the loop and just use:

On Error Resume Next
OutputDataBordyRange.SpecialCells(xlcelltypeblanks).Value2 = 0
On Error Goto 0

The Nothing keyword is not used to see if a cell is empty, it is used to see if a variable holds the default value for it's declared data type, or assign the default value to it (see this for more information) .

Try the following:

For Each OutputCell In OutputDataBordyRange.Cells
    If OutputCell.Value = vbNullString Then
        OutputCell.Value = 0
    End If
Next OutputCell

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM