powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ByRef argument type mismatch (не пойму отчего)
10 сообщений из 10, страница 1 из 1
ByRef argument type mismatch (не пойму отчего)
    #34625177
detail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал 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
ByRef argument type mismatch (не пойму отчего)
    #34625208
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Dim firstLine As Long, lastLine As Long
...
Рейтинг: 0 / 0
ByRef argument type mismatch (не пойму отчего)
    #34625223
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Optional checkValue As Variant = False, в которое передается значение 39256 - это жесть.
...
Рейтинг: 0 / 0
ByRef argument type mismatch (не пойму отчего)
    #34625229
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Постарайтесь определять тип данных всегда явно. Там где используется 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
ByRef argument type mismatch (не пойму отчего)
    #34625232
detail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил, заработало.

А в чём проблема с Variant? Очень медленно?
...
Рейтинг: 0 / 0
ByRef argument type mismatch (не пойму отчего)
    #34625244
detail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@Worobjoff спасибо. CheckValue - это значение, оно не может быть булевым. Ладно, я это переделаю при помощи IsMissing.
...
Рейтинг: 0 / 0
ByRef argument type mismatch (не пойму отчего)
    #34625563
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
detailА в чём проблема с Variant? Очень медленно?Нет, замедление мелкое, почти не измерить.
Проблема в том что компилятор не будет вам "помогать" избежать ошибки. В Variant можно передать все что угодно и True-False и строку и Word.Application.
...
Рейтинг: 0 / 0
ByRef argument type mismatch (не пойму отчего)
    #34625623
detail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот проблема: если в заголовке функции написать Optional checkValue (без типа), тогда, если параметр пропущен, он будет = Missing. Но если прописать тип данных, по умолчанию он будет = 0. Как тогда строго отличать, указан параметр или нет?
...
Рейтинг: 0 / 0
ByRef argument type mismatch (не пойму отчего)
    #34625835
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну например так:
Optional x as Long = -1
Если x<0, значит значение не было указано. И если х не может принимать отрицательные значения по условию задачи.
...
Рейтинг: 0 / 0
ByRef argument type mismatch (не пойму отчего)
    #34625883
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вы используете параметр 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
10 сообщений из 10, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ByRef argument type mismatch (не пойму отчего)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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