Проходя через итератор в качестве даты - PullRequest
0 голосов
/ 20 июня 2019

Привет (прошу прощения за плохое форматирование и условности, я не кодер)

У меня есть функция VBA, которая вычисляет средневзвешенное время с учетом таблицы дат и значений . Проблема в том, что я не могу передать итератор через одну из функций Excel.

Проблема возникает в следующей строке:

totalWeighting = totalWeighting + Cells(Application.Match(start_date, dateRange, 1), userCodeColumn)

При использовании start_date функция работает нормально (обратите внимание, что у меня есть куча другого кода для Dim variables, который я исключил). Однако, когда вы заменяете start_date на «d», возвращается #value.

Function TimeWeightedAverage(start_date As Date, end_date As Date, user_code) As Double

Dim d As Date
Dim totalWeighting As Double
Dim userCodeColumn As Integer
Dim dateRange As Range
Dim denominator As Integer
Dim startRow As Integer

If Mid(user_code, 3, 1) = 2 Then
    Set dateRange = ActiveSheet.Range("A:A")
    Else
        Set dateRange = ActiveSheet.Range("H:H")
End If

totalWeighting = 0
denominator = WorksheetFunction.NetworkDays(start_date, end_date)
Let userCodeColumn = user_code.Column
Let startRow = Application.Match(start_date, dateRange, 1)

For d = start_date To end_date
    If WorksheetFunction.Weekday(d, 11) < 6 Then
        totalWeighting = totalWeighting + Cells(Application.Match(d, dateRange, 1), userCodeColumn)
    End If
Next



TimeWeightedAverage = totalWeighting / denominator

Любые мысли будут с благодарностью.

Данные:

data

1 Ответ

0 голосов
/ 20 июня 2019

Хорошо, думаю, я разобрался с твоей проблемой.

Прежде всего, цикл, подобный тому, который вы использовали, работает с целыми числами / longs / singles / doubles ... не датами, поэтому вы не можете использовать d в качестве даты, потому что это не так.

С другой стороны, вы объявили startrow, который не использовался, как denominator, который вычислял рабочие дни между двумя датами. Вместо этого вычислите все дни между двумя датами и просмотрите все их, увеличивая 1 день до startdate за один раз и передавая этот день переменной Date, ваш оператор If будет обрабатывать, если это рабочий день или нет.

Option Explicit
Function TimeWeightedAverage(start_date As Date, end_date As Date, user_code As Range) As Double

    Dim d As Long
    Dim userCodeColumn As Long
    Dim dateRange As Range
    Dim denominator As Long
    Dim CheckDate As Date

    If Mid(user_code, 3, 1) = 2 Then
        Set dateRange = ActiveSheet.Range("A:A")
    Else
        Set dateRange = ActiveSheet.Range("H:H")
    End If

    denominator = DateDiff("d", start_date, end_date)
    Let userCodeColumn = user_code.Column

    For d = 1 To denominator
        If d = 1 Then
            CheckDate = start_date
        Else
            CheckDate = start_date + d
        End If
        If WorksheetFunction.Weekday(CheckDate, 11) < 6 Then
            TimeWeightedAverage = TimeWeightedAverage + ActiveSheet.Cells(Application.Match(CheckDate, dateRange, 1), userCodeColumn)
        End If
    Next

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