Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ByRef argument type mismatch (не пойму отчего) / 10 сообщений из 10, страница 1 из 1
28.06.2007, 09:22
    #34625177
detail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByRef argument type mismatch (не пойму отчего)
Сделал 2 функции, чтобы найти границы нужного мне диапазона. getFirstLine ищет первую строку, подходящуюю под критерий, getLastLine ищет последнюю. Если аналогичное уже есть написанное, подскажите, буду благодарен.

Вызов первой функции проходит нормально. Вызов функции getLastLine выдаёт ошибку ByRef argument type mismatch, в аргументе firstLine. Как бороться?

Код: plaintext
1.
2.
3.
4.
Dim firstLine, lastLine As Long

firstLine = getFirstLine(myWorkSheet,  2 ,  3 ,  39256 )
lastLine = getLastLine(myWorkSheet, firstLine,  3 ,  39256 )

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
Public Function getFirstLine(ByRef sheet, firstLine As Long, checkColumn As Integer,
Optional checkValue As Variant = False, Optional checkValue2 = False) As Long

Dim i As Long
With sheet

If checkValue = False Then
    For i = firstLine To  65535 
        If Not (IsEmpty(.cells(i, checkColumn).Value)) Then Exit For
    Next i
ElseIf checkValue2 <> False Then
    For i = firstLine To  65535 
        If .cells(i, checkColumn).Value >= checkValue And
        .cells(i, checkColumn).Value <= checkValue2 Then Exit For
    Next i
Else
    For i = firstLine To  65535 
        If .cells(i, checkColumn).Value = checkValue Then Exit For
    Next i
End If

End With

getFirstLine = i

End Function

Public Function getLastLine(ByRef sheet, firstLine As Long, checkColumn As Integer,
Optional checkValue As Variant = False, Optional checkValue2 = False) As Long

Dim i As Long
With sheet

If checkValue = False Then
    For i = firstLine To  65535 
        If IsEmpty(.cells(i, checkColumn).Value) Then Exit For
    Next i
ElseIf checkValue2 <> False Then
    For i = firstLine To  65535 
        If .cells(i, checkColumn).Value >= checkValue
        And .cells(i, checkColumn).Value <= checkValue2 Then Exit For
    Next i
Else
    For i = firstLine To  65535 
        If .cells(i, checkColumn).Value <> checkValue Then Exit For
    Next i
End If
End With

getLastLine = i -  1 

End Function
...
Рейтинг: 0 / 0
28.06.2007, 09:36
    #34625208
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByRef argument type mismatch (не пойму отчего)
Код: plaintext
Dim firstLine As Long, lastLine As Long
...
Рейтинг: 0 / 0
28.06.2007, 09:41
    #34625223
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByRef argument type mismatch (не пойму отчего)
Optional checkValue As Variant = False, в которое передается значение 39256 - это жесть.
...
Рейтинг: 0 / 0
28.06.2007, 09:45
    #34625229
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByRef argument type mismatch (не пойму отчего)
Постарайтесь определять тип данных всегда явно. Там где используется boolean не использовать variant.
И не использовать ByRef где попало (а только там где надо вернуть ссылку в параметре).
Код: plaintext
1.
2.
3.
4.
Public Function GetFirstLine(ByVal Sheet As Object, _
                             ByVal firstLine As Long, _
                             ByVal checkColumn As Integer, _
                             Optional ByVal checkValue As Boolean = False, _
                             Optional ByVal checkValue2 As Boolean = False) As Long
...
Рейтинг: 0 / 0
28.06.2007, 09:46
    #34625232
detail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByRef argument type mismatch (не пойму отчего)
Исправил, заработало.

А в чём проблема с Variant? Очень медленно?
...
Рейтинг: 0 / 0
28.06.2007, 09:49
    #34625244
detail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByRef argument type mismatch (не пойму отчего)
@Worobjoff спасибо. CheckValue - это значение, оно не может быть булевым. Ладно, я это переделаю при помощи IsMissing.
...
Рейтинг: 0 / 0
28.06.2007, 11:25
    #34625563
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByRef argument type mismatch (не пойму отчего)
detailА в чём проблема с Variant? Очень медленно?Нет, замедление мелкое, почти не измерить.
Проблема в том что компилятор не будет вам "помогать" избежать ошибки. В Variant можно передать все что угодно и True-False и строку и Word.Application.
...
Рейтинг: 0 / 0
28.06.2007, 11:41
    #34625623
detail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByRef argument type mismatch (не пойму отчего)
А вот проблема: если в заголовке функции написать Optional checkValue (без типа), тогда, если параметр пропущен, он будет = Missing. Но если прописать тип данных, по умолчанию он будет = 0. Как тогда строго отличать, указан параметр или нет?
...
Рейтинг: 0 / 0
28.06.2007, 12:35
    #34625835
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByRef argument type mismatch (не пойму отчего)
Ну например так:
Optional x as Long = -1
Если x<0, значит значение не было указано. И если х не может принимать отрицательные значения по условию задачи.
...
Рейтинг: 0 / 0
28.06.2007, 12:54
    #34625883
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ByRef argument type mismatch (не пойму отчего)
Если вы используете параметр Optional Variant то кроме IsMissing надо делать еще такую проверку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
If IsObject(Prm) Then
   'Работаем с объектной ссылкой
Else
   If IsArray(Prm) Then
      'работаем с массивом
   ElseiF IsNumeric(Prm) Then
      'и т.д.
   End If
End If
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ByRef argument type mismatch (не пойму отчего) / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]