2010-04-19 3 views
0

все. Вот небольшая функция VBA (Excel), которую я написал, полная MsgBoxes для отладки.Целочисленное переполнение в проекте VBA

Я передаю числа 10 и 1 в качестве аргументов и получаю ошибку переполнения, когда программа достигает вершины цикла For, прежде чем она начнет первую итерацию.

Любые мысли приветствуются.

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Function PerformanceTest(iterations As Integer, interval As Integer) As Double 
    Dim st, tot, k As Double 
    Dim n As Integer 
    tot = 0# 
    MsgBox "ok" 
    k = iterations + tot 
    MsgBox "ookk" 
    n = 1 
    MsgBox "assigned" 
    For n = 1 To iterations 
     MsgBox n 
     st = Timer 
     Application.Calculate 
     tot = tot + (Timer - st) 
     Sleep (1000 * interval) 
    Next n 
    'MsgBox (tot/k) 
    PerformancTest = tot/k 
End Function 
+0

Как и другие, я не могу сделать «переполнение». Я согласен с Томалаком, который может указывать на проблему вне функции. Но если ваш код стоит в том месте, о котором вы говорите, то идея Томалака трудно принять. – Smandoli

ответ

2

Избыточность удалена, по существу, неизменная функция выполняется без ошибок в моем Excel 2003

Function PerformanceTest(iterations As Integer, interval As Integer) As Double 
    Dim st, tot As Double 
    Dim n As Integer 

    For n = 1 To iterations 
    st = Timer 
    Application.Calculate 
    tot = tot + Timer - st 
    ''# Sleep (1000 * interval) 
    Next n 

    PerformanceTest = tot/(iterations + tot) 
End Function 

Итак ... ошибка, которую вы видите, вероятно, не в самой функции.

P.S .: Pro tip: ;-) Используйте Debug.Print вместо MsgBox для вывода отладки.

+0

То же самое для меня ..: o) – CResults

+0

@mcoolbeth: Не могли бы вы сообщить нам, в чем была ошибка? – Tomalak

+2

Общие комментарии: Я всегда использую Long, а не Integer, потому что он быстрее. Dim St, карапуз, как двойная 'St была серая, как вариант для набора точных таймеров для различных вкусов Excel Расчета смотрите: http://msdn.microsoft.com/en-us/library /aa730921.aspx –

0

С другой стороны, рискуя выглядеть снова как дурак, вот какой вклад.

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

И если он бежал без переполнения, то это был бы хороший плюс.

Function PerformanceTest(iterations As Integer, interval As Integer) As Double 

Dim st, tot, k As Double 
Dim n As Integer 

PerformanceTest = Timer 
k = iterations + tot 
n = 1 

For n = 1 To iterations 
    '' insert operation that takes time 
    Sleep (1000 * interval) 
Next n 

PerformanceTest = Timer - PerformanceTest 
PerformanceTest = PerformanceTest/k 
End Function