Excel: Странная проблема при обработке процедуры - ByRef argument type mismatch

Автор postrelll, 25 марта 2016, 18:00

postrelll

Уважаемые форумчане, буду благодарен за подсказку в решении проблемки, причину которой я не понимаю.

Есть основная процедура в которой определен тип одной переменной, которая передаем имя открытой книги
-----------
Sub analyse()
'так определена переменная
   Dim book_with_source As String
   ...
'так эта переменная в основной программе получает своё значение
   book_with_source = ActiveWorkbook.name
End Sub
-----------

Далее есть процедура в которую я передаю эту переменную
-----------
Private Sub IndividualReportFormer(book_with_source As String, _
                                   Optional book_with_report As String, _
                                   Optional sheet_of_source As Integer, _
                                   Optionalsource_letter As String, _
                                   Optional prefix_type As String)
-----------

Далее вот так из основной программы я обращаюсь к вышеприведенной процедуре
-----------
IndividualReportFormer book_with_sourse
-----------

Однако при выполнении я получаю:
Compile error: ByRef argument type mismatch
и выделяется вот эта переменная - book_with_sourse.

И я не понимаю, почему несовпадение типов? Ведь в обоих случаях четко определено, что переменная строковая.

Администратор

Сделайте вот так в VBA:
Tools - Options... - поставьте галочку "Require Variable Declaration".
Теперь у вас в новых модулях сверху будет появляться "Option Explicit". Этот параметр будет проверять, создали (в справках вместо термина "создали" используется термин "объявили") ли вы переменную.

Сейчас в уже имеющемся модуле в самом верху вставьте этот текст:
Option Explicit
и запустите макрос. VBA выдаст сообщение, что у вас не создана переменная.

То есть вы передаёте в процедуру переменную, которую не создали. Здесь:
IndividualReportFormer book_with_sourse

происходит два действия:
1) создаётся переменная "book_with_sourse" и 2) эта переменная отправляется в процедуру. При этом у переменной "book_with_sourse" будет тип данных "Variant" (этот тип данных присваивается автоматически, если явно не задавать тип данных). Из-за этого вы и видите ошибку "несоответствие типов", т.к. у переменной тип данных "Variant", а у аргумента процедуры - "String".

postrelll

Спасибо! Помогло, не обратил внимания, что опечатка была в sourSe вместо sourCe.