Powershell — форматирование Excel очень медленно

#excel #powershell #datetime

#excel #powershell #дата и время

Вопрос:

У меня есть файл Excel, в котором у меня возникли проблемы с преобразованием формата времени из чч: мм AM / PM в чч: мм (24 часа). Поскольку столбцы форматируются в текст, применение свойства number format вообще не будет работать (оно просто ничего не делает).

Однако я заметил, что формула «=TEXT (C1;»H: MM»)» работает хорошо. Итак, я создал сценарий powershell, который выполняет цикл на каждом листе и переходит к применению формулы в новых столбцах, чтобы создать исправленные значения:

 $rows = $WorkSheet.UsedRange.Rows.Count
for ($i = 8; $i -le $rows ; $i  )
{
    $formula1 = '=TEXTE(C' $i ';"H:MM")'
    $formula2 = '=TEXTE(E' $i ';"H:MM")'
    $WorkSheet.Cells.Item($i,4).Formula = $formula1
    $WorkSheet.Cells.Item($i,6).Formula = $formula2
}
  

Несмотря на то, что этот цикл выполняет трюк, для его выполнения требуется огромное время.
Мои файлы Excel содержат около 37 листов и около 100 строк на листе. Весь процесс занимает более 20 минут.

Что я здесь пропустил и как я могу это оптимизировать?

Комментарии:

1. Вам все еще нужна помощь в этом?

2. Если я смогу получить некоторое «да», потому что на данный момент мой алгоритм все еще мучительно медленный

3. Я предполагаю, что вы используете последнюю версию Powershell (v5), поскольку каждое обновление улучшало скорость. ~ 3700 строк — это немного, и Powershell может считывать данные довольно быстро. Есть ли здесь какие-либо другие рабочие листы, которые вы не используете? Powershell должен анализировать весь документ, и если у вас есть огромное количество данных, даже неиспользуемых, это значительно замедлит обработку.

4. Ну, нет, аппарт из 2 дополнительных бесполезных небольших листов, которые я не использую, других данных нет. Я действительно использую последнюю версию powershell. Может быть, это связано с последней версией office?

Ответ №1:

Вы можете сделать что-то подобное, что должно ускорить процесс. Конечно, вам нужно перебирать свои листы.

 Sub DoThis()

    Sheet3.Range("M:M").Select
    Selection.NumberFormat = "h:mm;@"
    Selection.FormulaR1C1 = Selection.Value

End Sub
  

Комментарии:

1. Я думаю, вы не читали мой пост: сначала я обрабатываю свой файл с помощью powershell, а не vba, затем я просто указал, что свойство number format не работает, поскольку ячейки форматируются как текст. Пожалуйста, прочитайте, прежде чем отвечать