为什么某些行而不是其他行存在不一致和损坏的单元格公式?

时间:2018-11-06 17:49:40

标签: excel vba

目标:根据一个块的总PROD-TIME,用适当的公式填充F和G列

这是我之前的一个问题提出的另一个问题: How to loop through "blocks" of rows in excel dataset instead of each row individually (VBA)?

我已经能够遍历行的块,并且现在可以获得该特定块的PROD-TIME的总和。此和对于确定F和G列中需要使用哪个公式是必不可少的。

这是本工作簿中最好的说明, https://www.dropbox.com/s/vgnqi00h8xosja3/wip%20Gantt%20Template.xlsx?dl=0,在这里我展示了如何让公式最终显示在F和G列中。但是由于某种原因,当我运行宏时,它完全崩溃了。有些公式甚至不使用参考单元格,而是使用单元格值,或者甚至不显示参考单元格。空白的F和G列会混淆宏吗?我如何确保每个F和G细胞都充满了某种东西?错误很好

Sub getStartEndDate()
    Dim WrkSht As Excel.Worksheet
    Dim RngColumn As Range, RngBlock As Range
    Dim totalHrs As Integer 'total PROD-TIME for the given RngBlock
    Dim lastRow As Long

    lastRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row
    Set WrkSht = ActiveWorkbook.Worksheets(1)

    ' Populate the last row by itself first since the With-statement below needs to reference rows below current row
    Range("E" & lastRow).Formula = "=ROUNDUP(D" & lastRow & "/12,0)"
    Range("G" & lastRow).Value = Range("C" & lastRow).Value
    Range("F" & lastRow).Formula = "=WORKDAY(G" & lastRow & ", -E" & lastRow & ")"
    Columns("F:F").NumberFormat = "yyyy-mm-dd"

    With WrkSht
        Set RngColumn = .Range("B2:B" & lastRow)
        'Starts the first block with the first cell in a column.
        Set RngBlock = RngColumn.Cells(1)

        'Checks every cell in a column.
        For Each rngcell In RngColumn
            If rngcell.Offset(0,1).Value <> "" Then
                'Checks whether a cell's value equals the cell below it.
                If rngcell.Value = rngcell.Offset(1, 0).Value Then
                    'If equal, includes the cell below in the block.
                    Set RngBlock = Union(RngBlock, rngcell.Offset(1, 0))
                Else
                    'If not equal, that means the block RngBlock ends
                    ' totalHrs is the sum of the "PROD-TIME" for that particular block
                    totalHrs = WorksheetFunction.Sum(Range(CStr(Trim(Chr(64 + RngBlock.Column + 2))) _
                                & CStr(Trim(Str(RngBlock.Row))) & ":" _
                                & CStr(Trim(Chr(64 + 2 + RngBlock.Column + RngBlock.Columns.Count - 1))) _
                                & CStr(Trim(Str(RngBlock.Row + RngBlock.Rows.Count - 1)))))

                    If totalHrs < 12 Then
                        ' If total production time (PROD-TIME) is less than 12 hours, then the start and end date should be the same for all rows in that block
                        rngcell.Offset(0, 4).Value = rngcell.Offset(0, 1).Value
                        rngcell.Offset(0, 5).Value = rngcell.Offset(0, 1).Value
                    Else
                        ' If total production time is greater than 12 hours, then start and end dates are based on a different formula 
                        ' e.g. Given row 11, F column formula looks like: =WORKDAY(G11, -E11), G column looks like: =IF(B11=B12,F12,C11) 
                        rngcell.Offset(0, 4).Formula = "=WORKDAY(" & rngcell.Offset(0, 5) & ", -" & rngcell.Offset(0, 3) & ")"
                        rngcell.Offset(0, 5).Formula = "=IF(" & rngcell & "=" & rngcell.Offset(1, 0) & "," & rngcell.Offset(1, 4) & "," & rngcell.Offset(0, 1) & ")"
                    End If

                    'Starts the next block with the cell below.
                    Set RngBlock = rngcell.Offset(1, 0)
                End If
            End If 

        Next rngcell
    End With
End Sub

0 个答案:

没有答案