Excel VBA возвращает странные результаты с большими вычислениями - PullRequest
2 голосов
/ 19 сентября 2009

Я создал функцию в Excel, которая в основном ищет динамический диапазон в инструкции For для строки и возвращает значение ячейки, превышающей один столбец. Это в основном функция бюджетирования, но это не относится к делу.

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

У кого-нибудь были такие проблемы?

Вот код вопроса:

Function Material(item As String, Optional sheetType As String) As Integer

Dim wSheet As Worksheetr
Dim count As Integer
Dim offSet As Integer
Dim ref As Integer
Dim bottomRight As Integer
Dim upperLeft As Integer
Dim rng As Range
Dim cVal As Integer

For Each wSheet In Worksheets
    If wSheet.Name = "Drywall Pricing" Then
        dwIndex = wSheet.Index - 1
    End If
Next wSheet

If IsMissing(sheetType) Then
    sheetType = " "
Else
    sheetType = UCase(sheetType)
End If
For i = 1 To dwIndex
    wSheetName = Sheets(i).Name
    If InStr(UCase(wSheetName), sheetType) > 0 Then
        count = 9
        offSet = 44
        ref = 27
        For wall = 0 To count - 1
            On Error Resume Next
            Err.Clear
            upperLeft = (ref + 12) + (offSet * wall)
            bottomRight = (ref + 30) + (offSet * wall)
            Set rng = Sheets(i).Range("A" & upperLeft & ":B" & bottomRight)
            cVal = Application.WorksheetFunction.VLookup(item, rng, 2, False)
            If Err.Number > 0 Then
                cVal = 0
            End If
            units = units + cVal
        Next wall
    Else
        units = units + 0
    End If
Next i

If units > 0 Then
    Material = units
Else
    Material = 0
End If

End Function

Я настроил электронную таблицу для ручного подсчета определенного количества элементов (т. Е. «= A13 + B5 + B26» и т. Д.) И сравнил ее с результатом запуска рассматриваемой функции и с низким уровнем результатов , они равны друг другу, поэтому я знаю, что сама функция работает правильно. Это проблема с памятью, тогда?

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

Заранее спасибо!

Ответы [ 4 ]

12 голосов
/ 19 сентября 2009

Целочисленное значение в VBA составляет 16 бит, что означает максимальное значение 32 767 (и минимум -32 768).

Вместо Integer используйте Long для хранения ваших результатов, что дает вам более 2 миллиардов, прежде чем оно достигнет предела.

0 голосов
/ 19 сентября 2009

максимальное значение для целого числа (2 ^ 15), что составляет 32 768. Ваша ошибка перехвата заставляет cVal = 0. Попробуйте изменить тип данных с целого на длинный. Max Long равен (2 ^ 31 -1), что составляет 2 147 483 647, что должно легко обрабатывать ваши значения.

0 голосов
/ 19 сентября 2009

В VBA и "Integer" не является целым 16 бит? То есть, от -32,768 до +32,767? Если это так, то этот код прямо здесь ваш виновник:

Dim cVal As Integer
...
        cVal = Application.WorksheetFunction.VLookup(item, rng, 2, False)
        If Err.Number > 0 Then
            cVal = 0
        End If

Кроме того, я бы предложил использовать "Option Explicit".

0 голосов
/ 19 сентября 2009

Вы можете опубликовать выдержку из содержимого документа для поиска в Excel?

два маленьких комментария:

по линиям

If wSheet.Name = "Drywall Pricing" Then
    dwIndex = wSheet.Index - 1
End If

Возможно, вы захотите Exit For, поскольку нашли свой лист и не хотите продолжать поиск.

Есть ли причина, по которой вы хотите найти лист MINUS 1?

и другой комментарий заключается в том, что units = units + 0 в предложении Else вообще ничего не делает.

привет

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