Страницы: 1
RSS
ошибка в коде
 
Доброго времени суток всем увлеченным экселем людям.

В одной теме мне посоветовали заменить свой код на код ниже, но он по-какой-то причине не работает - синтаксическая ошибка, хотя логика кажется вполне нормальной. Кто поможет разобраться :)?

Function count_rate(val1, val2)
Dim prng(1 To 4)
prng = Worksheets("Eo?nu" ;) .Range(Worksheets("Eo?nu" ;) .Cells(2, 1), Worksheets("Eo?nu" ;) .Cells(5, 1)).Value
checker = 0

For i = 1 To 4
If val1 = prng(i) Then
val1 = i + 1
checker1 = checker1 + 1
End If
If val2 = prng(i) Then
val2 = i + 1
checker2 = checker2 + 1
End If
If checker1 =1 and checker2 =1 Then
count_rate = Worksheets("Eo?nu" ;) .Cells(val1, val2)
Exit Function
End If
Next i
 
А где End Function?
И массив неверно объявляете для присвоения ему значений из ячеек:
Код
Dim prng(1 To 4, 1 to 1)


далее будет:
Код
If val1 = prng(i, 1) Then


и нельзя изменять в функции значения параметра, переданного в функцию как ссылку:
Код
val1 = i + 1

для этого передавать надо как копию ссылки(и назначать тип переменной не мешало бы, раз он известен):
Код
Function count_rate(ByVal val1 as long, ByVal val2 as long)



ну и напоследок: не первое сообщение на форуме - неужели не научились пользоваться тегами? Код надо оформлять соответствующим тегом, чтобы его было удобнее читать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
The_Prist пишет:
ну и напоследок: не первое сообщение на форуме - неужели не научились пользоваться тегами? Код надо оформлять соответствующим тегом, чтобы его было удобнее читать.
Спасибо большое за подробное объяснение.
Теги освою!
 
Для присвоения значений из ячеек массив нужно объявлять динамическим. Так
Код
Dim a(1 To 4, 1 To 1)
a = Range("A1:A4")
работать не будет.

можно:
Код
Dim a()
a = Range("A1:A4")

Код
Dim a
a = Range("A1:A4")

Код
ReDim a(0)
a = Range("A1:A4")
Изменено: Михаил С. - 22.01.2013 10:46:31
 
Цитата
Михаил С. пишет:
Для присвоения значений из ячеек массив нужно объявлять динамическим. Так
Код
 Dim a(1 To 4, 1 To 1)
a = Range("A1:A4") 
работать не будет.

можно:
Код
 Dim a()
a = Range("A1:A4") 

Код
 Dim a
a = Range("A1:A4") 

Код
 ReDim a(0)
a = Range("A1:A4") 
спасибо!
 
Да, Михаил, спасибо за поправку.
Код
Dim avArr: ReDim avArr(1 To 4, 1 To 1)
avArr = Range("A1:A4").Value

или
Код
Dim avArr
avArr = Range("A1:A4").Value
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Oleg, попробуйте в следующий раз отвечать без цитат.
 
Ещё такого варианта не было :)
Код
Dim avArr()
avArr = Range("A1:A4").Value

Я обычно объявляю так. Правда не знаю, как правильнее/лучше...
 
Dim avArr()

выигрыш во времени в отличие от Dim avArr. Вы даете понять VBA, что это массив для значений любого типа, а не переменная типа Variant. И при дальнейшем обращении VBA не требуется определять, что Вы хотите в переменную записать - уже известно, что необходимо просто записывать значения в массив.
Есть еще одно преимущество: при попытке назначить данной переменной значение всего одной ячейки получите ошибку:
Код
Dim avArr()
avArr = Range("A1").Value

и придется записывать так:
Код
Dim avArr()
ReDim avArr(1 To 1, 1 To 1)
avArr(1, 1) = Range("A1").Value

в то время как при объявлении
Код
Dim avArr
avArr = Range("A1").Value


все запишется без ошибок, но это будет не массив, а просто переменная, содержащая значение ячейки. А это может привести к непредвиденным ошибкам в дальнейшем при обращении к переменной, как к массиву.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх