Функция удаляет строки, которые она не должна - PullRequest
0 голосов
/ 05 февраля 2020

Когда я выполняю это, он удаляет «уточненные» строки, а когда я комментирую эту функцию, «очищенные» строки не удаляются. Я унаследовал этот код и добавил, что каждый раздел имеет «Уточненный», потому что я пытаюсь добавить дополнительные продукты, помимо «газ» и «нефть», но я действительно не знаю VBA или программирование. Я только что сделал это, и это в основном работает, кроме этого раздела.

Мой вопрос: что не так с тем, что я добавил в код? Я отредактировал или добавил каждую строку, в которой есть слово «уточнено». Он работает так, как предназначено для нефти и газа, но всегда удаляет очищенную колонну. Когда он выполняет данные для нефти, газа и рафинированного, заполняет рабочий лист, но он мгновенно удаляет все рафинированные столбцы, которые он извлек.

У меня нет опыта, чтобы переписать его как другое, пока я oop без какого-либо шаблона кода.

This function checks the Current Prices tab for any columns that are duplicates of the day before or weekends and deletes the column
Function PricesCleanup() As Boolean

    Dim r, c As Integer
    Dim removeCount As Integer
    Dim removeColumn As Boolean
    Dim isGas, isOil, isRefined As Boolean

    c = FIRSTDATA_COL
    removeCount = 0

    Do Until IsEmpty(ws_currentprices.Cells(COMMODITY_ROW, c)) 'check every col of prices
        'Start at the row of the first date and reset remove flag
        r = FIRSTDATE_ROW
        removeColumn = True

        'Check each column, at least until there is a discrepancy between prices so we know it's not a holiday
        Do Until ((r > 12 And IsEmpty(ws_currentprices.Cells(r, c))) Or r > 60 Or Not removeColumn)
            'If the prices don't match, we know it's not a holiday
            If (ws_currentprices.Cells(r, c) <> ws_currentprices.Cells(r, c + 1)) Then
                'If the first row is empty or matches second row, it's likely due to near EoM index shifting and requires special handling
                If r = FIRSTDATE_ROW Then
                    If IsEmpty(ws_currentprices.Cells(r, c)) Then
                        'Oil index swap
                        removeColumn = False
                    End If
                    If (ws_currentprices.Cells(r, c) = ws_currentprices.Cells(r + 1, c) And ws_currentprices.Cells(MARKETTYPE_ROW, c) = "Gas") Then
                        'Gas index swap so clear cell and allow to continue but only if within the last few workdays of the month
                        If (DateDiff("d", WorksheetFunction.WorkDay(ws_currentprices.Cells(r, BUCKET_COL), -1), ws_currentprices.Cells(ASOFDATE_ROW, c)) > -3) Then
                            ws_currentprices.Cells(r, c).ClearContents
                        End If
                    End If
                Else
                    'Not index related and no match, so don't remove column
                    removeColumn = False
                End If
            End If
            r = r + 1
        Loop

        'Check for weekend dates or dates from prior month
        If Weekday(ws_currentprices.Cells(ASOFDATE_ROW, c)) = 1 Or Weekday(ws_currentprices.Cells(ASOFDATE_ROW, c)) = 7 Or Month(ws_currentprices.Cells(ASOFDATE_ROW, c)) <> Month(ws_currentprices.Cells(ASOFDATE_ROW, BUCKET_COL)) Then
            removeColumn = True
        End If

        'Remove column if flagged
        If removeColumn Then
            removeCount = removeCount + 1
            ws_currentprices.Columns(c).EntireColumn.Delete
            c = c - 1
        End If

        'Copy up spot price
        If Not IsEmpty(ws_currentprices.Cells(FIRSTDATE_ROW, c)) Then
            ws_currentprices.Cells(SPOT_ROW, c) = ws_currentprices.Cells(FIRSTDATE_ROW, c)
        ElseIf Not IsEmpty(ws_currentprices.Cells(FIRSTDATE_ROW + 1, c)) Then
            ws_currentprices.Cells(SPOT_ROW, c) = ws_currentprices.Cells(FIRSTDATE_ROW + 1, c)
        Else
            ws_currentprices.Cells(SPOT_ROW, c) = ""
        End If


        c = c + 1
    Loop

    'Check if any columns are left and return bool value
    isGas = False
    isOil = False
    isRefined = False
    c = FIRSTDATA_COL
    Do Until IsEmpty(ws_currentprices.Cells(COMMODITY_ROW, c))
        If (ws_currentprices.Cells(MARKETTYPE_ROW, c) = "Gas") Then
            isGas = True
        ElseIf (ws_currentprices.Cells(MARKETTYPE_ROW, c) = "Oil") Then
            isOil = True
        ElseIf (ws_currentprices.Cells(MARKETTYPE_ROW, c) = "Refined") Then
            isRefined = True
        End If

        c = c + 1
    Loop

    If (isGas And isOil And isRefined) Then
        PricesCleanup = True
    Else
        PricesCleanup = False
    End If

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...