Макрос EXCEL

Программирование на Visual Basic for Applications
ishimcity
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 07.06.2012 (Чт) 10:45

Макрос EXCEL

Сообщение ishimcity » 07.06.2012 (Чт) 11:00

Добрый день уважаемые друзья! Подскажите по коду, что и где я неверно сделал?
Задача такова. Есть 2 массива G[15] и H[17] они имеют числа как положительные так и отрицательные, вот собственно отрицательные нужно суммировать
Написал код но работает толи криво толи что то я не понимаю, код запускается и выполняется НО иногда правильно а иногда с ошибкой.
Код: Выделить всё
1. объявил разные переменные

Dim G(15), i As Integer, sumG, tyG As Integer, numG As Integer, tyH As Integer, num As Integer
Dim H(17), j As Integer, sumH
Dim g1 As String
Dim s
Dim h1 As String, check As Boolean
g1 = ""
h1 = ""

2. Сделал цикл массива G[i] =15 и тут же генерит цифры от 100 до -50

For i = 1 To 15                                                        // цикл
tyG = 0                                                                 // очищаю переменную
G(i) = Fix(100 * Rnd) - 50                                      // генерирую 15 разных чисел
g1 = g1 & "G[" & i & "]=" & G(i) & " "                     // тут для красивости
tyG = G(i)
s = proverka(tyG, tyH, numG, numH)                       // переход на функцию проверки
Next i

3. Собственно код что и предыддущий

For j = 1 To 17
tyH = 0
H(j) = Fix(100 * Rnd) - 50
h1 = h1 & "H[" & j & "]=" & H(j) & " "
tyH = H(j)
s = proverka(tyG, tyH, numG, numH)

Next j

MsgBox "Массив G " & Chr(13) & g1 & Chr(13) & Chr(13) & "Массив H " & Chr(13) & h1 & Chr(13) & Chr(13) & "Сумма G= " & numG & Chr(13) & Chr(13) & "Сумма H= " & numH

End Sub

Function proverka(tyG As Integer, tyH As Integer, numG As Integer, numH)
check = False
If tyG > 0 Then
check = True
Else
numG = numG + tyG
End If

If tyH > 0 Then
check = True
Else
numH = numH + tyH
End If
End Function


Изображение
вот пример ошибки
Долго голову ломал и нашел примерно ошибку , иногда код прогоняет G[15]+H[17] в итоге сумма G не совпадает или я неправ
[Viper] :: Для выделения многострочного кода необходимо использовать тэг CODE, а не ICODE!

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: Макрос EXCEL

Сообщение Alec » 07.06.2012 (Чт) 17:27

Гм, а если у тебя будет не два массива, а 55? Тогда функция "proverka" будет получать 110 аргументов? :shock:
У тебя последний элемент массива G во втором цикле 17 раз участвует в проверке, и, когда отрицателен, то и прибавляется к результату.
Как в скриншоте: последнее значение -40, 17 раз = -680, прибавляем к правильному результату -223-680=-903.
Все логично. Кроме подхода.
Иногда лучше вовремя остановиться...
И начать заново!

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Макрос EXCEL

Сообщение Sam777e » 07.06.2012 (Чт) 19:13

Кушайте с маслом

Код: Выделить всё
Option Explicit


Public G(15) As Long ' а лучше определись - какой тип тебе нужен !
Public H(17) As Long


Public Sub GmGm_TestSummirovanija()
    ' Генерим G i H
  G(1) = 0: G(2) = 220: G(3) = -10: G(4) = -20 ' . . .
  H(1) = -1000: H(2) = 220: H(3) = 10: H(4) = -205 ' . . .
 
  Debug.Print Summa(G), Summa(H), Summa(G) + Summa(H)
End Sub

'  190          -975          -785



Public Function Summa(A() As Long) As Long
  Dim i As Long, S As Long
 
  S = 0
  For i = LBound(A, 1) To UBound(A, 1)
    S = S + A(i)
  Next i
 
  Summa = S
End Function
Здоровья и удачи


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList  
cron