Форум по VBA и MS Office

VBA, Excel => VBA, макросы в Excel => Тема начата: postrelll от 25 марта 2016, 18:00

Название: Excel: Странная проблема при обработке процедуры - ByRef argument type mismatch
Отправлено: postrelll от 25 марта 2016, 18:00
Уважаемые форумчане, буду благодарен за подсказку в решении проблемки, причину которой я не понимаю.

Есть основная процедура в которой определен тип одной переменной, которая передаем имя открытой книги
-----------
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.

И я не понимаю, почему несовпадение типов? Ведь в обоих случаях четко определено, что переменная строковая.
Название: Excel: Странная проблема при обработке процедуры - ByRef argument type mismatch
Отправлено: Администратор от 25 марта 2016, 18:16
Сделайте вот так в 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".
Название: Excel: Странная проблема при обработке процедуры - ByRef argument type mismatch
Отправлено: postrelll от 25 марта 2016, 18:27
Спасибо! Помогло, не обратил внимания, что опечатка была в sourSe вместо sourCe.