Прежде всего, «заморозка» означает, что в большинстве случаев ваш код все еще выполняется (что может занять больше времени, чем вы ожидаете).
Проблема в вашем коде заключается в том, что вы запускаете циклчерез все строки / столбцы, даже если они не используются (пусто).
For x = 5 To Rows.Count
Ограничьте количество циклов фактическим объемом данных.Найдите последнюю использованную строку, например
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 'last used row in column A
, и используйте ее в цикле
Dim iRow As Long
For iRow = 5 To LastRow
Вы также можете найти последний использованный столбец с тем же методом
Dim LastCol As Long
LastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column 'last used column in row 1
и используйте это в другом цикле
Dim iCol As Long
For iCol = 2 To LastCol
Таким образом, вы получите что-то вроде
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 'last used row in column A
Dim LastCol As Long
LastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column 'last used column in row 1
Dim iRow As Long, iCol As Long
For iCol = 2 To LastCol
For iRow = 5 To LastRow
If Application.WorksheetFunction.IsNumber(ws.Cells(iRow, iCol)) = True Then
ws.Cells(iRow, iCol).NumberFormat = "0.00"
ws.Cells(iRow, iCol).HorizontalAlignment = xlCenter
ws.Cells(iRow, iCol).VerticalAlignment = xlCenter
Else
Exit For
End If
Next iRow
Next iCol
Обратите внимание, что я дал переменные вашего счетчикаx
и y
более значимых имен, чтобы вы всегда знали, какой счетчик строк и какой счетчик столбцов.
Альтернатива вашему циклу
Использование Range.SpecialCells метод , чтобы найти все ячейки с числами и отформатировать их сразу , что должно быть удивительно быстрее.
Dim CellsWithNumbers As Range
Set CellsWithNumbers = ws.Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
If Not CellsWithNumbers Is Nothing Then
With CellsWithNumbers
.NumberFormat = "0.00"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
End With
Если вы хотите найти все формулы свместо числового результата используйте xlCellTypeFormulas
.
Dim CellsWithNumbers As Range
Set CellsWithNumbers = ws.Cells.SpecialCells(xlCellTypeFormulas, xlNumbers)
If Not CellsWithNumbers Is Nothing Then
With CellsWithNumbers
.NumberFormat = "0.00"
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
End With
Если вы хотите, чтобы числа с постоянными и формулами использовали оба по порядку.