Как я могу решить ошибку переполнения в VBA? - PullRequest
0 голосов
/ 24 января 2020

Мне нужно проанализировать очень большой файл данных, получить некоторые данные и поместить их на другой лист, он работает до тех пор, пока у меня не будет около 20 000 строк, но после этого он выдаст мне ошибку переполнения, и мне понадобится проанализировать ее 200 000 строк, это возможно?

Sub prueba()

Dim i As Double, j As Double, k As Double, l As Double
Dim i2 As Double
Dim lrow As Integer
Dim LastRow As Double


lrow = Cells(Rows.Count, 1).End(xlUp).Row
LastRow = Range("E" & Rows.Count).End(xlUp).Row

i = 1
While Sheet1.Cells(18, i) <> "Suma de Máximo"

    i = i + 1

Wend

j = 1
While Sheet1.Cells(18, j) <> "Suma de Stock"

    j = j + 1

Wend

k = 1
While Sheet1.Cells(18, k) <> "Sum of Mínimo"

    k = k + 1

Wend

If Sheet1.Cells(18, k) = "Sum of Mínimo" And Sheet1.Cells(18, j) = "Suma de Stock" Then

    For i2 = 18 To LastRow - 1

        If Sheet1.Cells(i2, k) <> Sheet1.Cells(i2, j) Then

            Sheet2.Cells(i2 - 17, 1) = Sheet1.Cells(i2, 1)
            Sheet2.Cells(i2 - 17, 2) = Sheet1.Cells(i2, 2)
            Sheet2.Cells(i2 - 17, 3) = Sheet1.Cells(i2, i)
            Sheet2.Cells(i2 - 17, 4) = Sheet1.Cells(i2, k)
            Sheet2.Cells(i2 - 17, 5) = Sheet1.Cells(i2, j)

        End If

    Next i2

End If

End Sub

Ответы [ 2 ]

2 голосов
/ 24 января 2020
Dim lrow As Integer

Это 16-разрядный целочисленный тип со знаком, с максимальным значением 32 767 (2 ^ 15-1): он переполнится, как только вы назначите его 32 768 или выше. Любая рабочая таблица содержит в разы больше строк, чем это, и это делает Integer неподходящим типом данных для использования для хранения номеров строк рабочей таблицы.

Вместо этого используйте Long, это 32-разрядный целочисленный тип со знаком с максимальное значение 2 ^ 31-1, что больше, чем количество строк в таблицах Excel.

Double - это тип данных с плавающей запятой, который не имеет большого смысла использовать для номеров строк , Попробуйте использовать значимые имена вместо однобуквенных переменных, но учтите, что эти циклы крайне неэффективны:

k = 1
While Sheet1.Cells(18, k) <> "Sum of Mínimo"

    k = k + 1

Wend

Используйте Range.Find, когда вам нужно быстро найти ячейку с указанными c содержание.

0 голосов
/ 24 января 2020

Заменить:

Dim i As Double, j As Double, k As Double, l As Double
Dim i2 As Double
Dim lrow As Integer
Dim LastRow As Double

на:

Dim i As Long, j As Long, k As Long, l As Long
Dim i2 As Long
Dim lrow As Long
Dim LastRow As Long
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...