Дата конвертации в рабочую неделю в Excel VBA - PullRequest
0 голосов
/ 06 февраля 2019

Привет У меня есть столбцы, в которых даты присутствуют в формате гггг-мм-дд ч: мм: сс.Я хочу преобразовать их в рабочие недели.

Я пробовал это как

For DateCounter = 1 To UBound(All_Submitted_Dates)
    All_workweek(DateCounter) = WorksheetFunction.WeekNum(All_Submitted_Dates(DateCounter))
Next DateCounter

Но я получаю индекс за исключением диапазона.Кто-нибудь может сказать мне, в чем ошибка?

1 Ответ

0 голосов
/ 06 февраля 2019

Присвоение массива из диапазона напрямую приводит к массиву 2D, а не 1D.Чтобы преодолеть это, вы можете ссылаться на него, например, All_Submitted_Dates(DateCounter, 1) или Transpose ваш ввод.

Если ваши входные данные хранятся в одном столбце, вам просто нужно Transpose один раз

With Application
    All_Submitted_Dates = .Transpose(Range("K2", Range("K1").End(xlDown)))
End With

Однако, если ваши данные находятся в нескольких столбцах, вам потребуется удвоить Transpose это, чтобы получить массив 1D

With Application
    All_Submitted_Dates = .Transpose(.Transpose(Range("K2", Range("K1").End(xlDown))))
End With

Затем вы можете ссылаться на ваш массив, как вы сделали востальная часть вашего кода

Обновление после комментариев Я думаю, что ваша проблема связана с комбинацией вещей (однако это может быть просто из-за того, что вы не включилиинформация в вашем вопросе).Можете ли вы взглянуть на код ниже.

Я объявил All_Submitted_Dates и All_WorkWeek как варианты.Затем я установил All_Submitted_Dates с явной ссылкой на лист (ваш запрос взял бы из ActiveSheet, возможно, вызывающего ошибки), а также Transpos[e] из значений, чтобы код работал с массивом 1D.Затем я ReDim отредактировал массив All_WorkWeek, чтобы его размер совпадал с All_Submitted_Dates.Затем я использовал вашу петлю For, как вы написали выше.Тем не менее, я бы предложил использовать Lbound(All_Submitted_Dates) вместо 1, хотя это не должно иметь большого значения, но это хорошая практика.

Вам нужно будет обновить блок With Sheet1 со ссылкой на свой лист, где вашВходные данные хранятся, однако, это в моих тестах работает как задумано.

Dim All_Submitted_Dates As Variant, All_WorkWeek As Variant
Dim DateCounter As Long
' Update with your sheet reference
With Sheet1
    All_Submitted_Dates = Application.Transpose(.Range(.Range("K2"), .Cells(.Rows.Count, "K").End(xlUp)))
End With

ReDim All_WorkWeek(LBound(All_Submitted_Dates) To UBound(All_Submitted_Dates))
For DateCounter = 1 To UBound(All_Submitted_Dates)
    All_WorkWeek(DateCounter) = WorksheetFunction.WeekNum(All_Submitted_Dates(DateCounter))
Next DateCounter

Проблемы, которые я обнаружил:

  • Массив объявляется как 2D и упоминается как 1D
  • Слабый диапазон указывает на то, что код ссылалсяв ActiveSheet возможно, что приведет к ошибкам
  • Выбор диапазона с использованием End(xlDown), но начиная с первой ячейки, в результате чего Range будет выбирать только одну ячейку (следовательно, возможно, по умолчанию будет использоваться значение ячейки вместо создания массива)
  • All_WorkWeek возможно, неправильно инициализирован, чтобы не принимать значения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...