Страницы: 1
RSS
передача параметров в процедуру, при передача параметров в процедуру выдает ошибку
 
Добрый день.
Написал две процедуры. Одна (нижняя) вызывает другую (верхняя) с передачей четырех значений (dt_nach, kt_nach, dt_kon, kt_kon   )

Private Sub Perenos_saldo_i_obnulit_strok1(dt1 As String, kt1 As String, dt2 As String, kt2 As String)
 MsgBox "  столбец=" & dt1
End Sub

Private Sub CommandButton2_Click()
Dim dt_nach, kt_nach, dt_kon, kt_kon As String
dt_nach = "e"
kt_nach = "f"
dt_kon = "r"
kt_kon = "s"
  Perenos_saldo_i_obnulit_strok1(dt_nach, kt_nach, dt_kon, kt_kon)  ' ошибка компиляции: Syntax error
  Perenos_saldo_i_obnulit_strok1("e","f","r","s")  ' тоже ошибка компиляции: Syntax error
End Sub

Не пойму в чем ошибся.

Пробовал верхнюю процедуру писать так
Private Sub Perenos_saldo_i_obnulit_strok1(ByVal dt1 As String, ByVal kt1 As String, ByVal dt2 As String, ByVal kt2 As String)
и так
Private Sub Perenos_saldo_i_obnulit_strok1(dt1 , kt1 , dt2 , kt2 As String)
и так
Private Sub Perenos_saldo_i_obnulit_strok1(ByVal  dt1 , kt1 , dt2 , kt2 As String)

Помогите!
 
Вызов процедуры с параметрами должен быть: если через Call - то со скобками, если без Call - без скобок.
Код
Call Perenos_saldo_i_obnulit_strok1(dt_nach, kt_nach, dt_kon, kt_kon)

или
Код
Perenos_saldo_i_obnulit_strok1 dt_nach, kt_nach, dt_kon, kt_kon
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
Private Sub Perenos_saldo_i_obnulit_strok1(ByVal dt1 As String, ByVal kt1 As String, ByVal dt2 As String, ByVal kt2 As String)
MsgBox " столбец=" & dt1
End Sub

Код
Private Sub CommandButton2_Click()
Dim dt_nach, kt_nach, dt_kon, kt_kon As String
dt_nach = "e"
kt_nach = "f"
dt_kon = "r"
kt_kon = "s"
Call Perenos_saldo_i_obnulit_strok1(dt_nach, kt_nach, dt_kon, kt_kon)
End Sub
 
Вот пробовал передавать только один параметр без применения Call , срабатывает без ошибки :


Private Sub Perenos_saldo_i_obnulit_strok1(dt1 As String)
 MsgBox "  столбец=" & dt1
End Sub

Private Sub CommandButton2_Click()
Dim dt_nach, kt_nach, dt_kon, kt_kon As String
dt_nach = "e"
kt_nach = "f"
dt_kon = "r"
kt_kon = "s"
  Perenos_saldo_i_obnulit_strok1 (dt_nach)
End Sub


А если параметров два и более, то ошибка. Как это объясняется?
 
Подскажите еще какой тип данных в экселе по аналогии с REAL ?
 
А что такое REAL ?
 
Real  это тип данных - Вещественные числа — это числа, которые могут иметь знаки после запятой.
Уже нашел Single.
Всем спасибо.

Но все-таки хотел бы понять чё так получилось ? (пост4, А если параметров два и более, то ошибка. Как это объясняется?)
 
Объявляйте  типы переменных одинаково в обеих процедурах. Вариант в одной, а стринг в другой работать не будет.
 
Обратите внимание на пробел в этой строке перед круглой скобкой:
Perenos_saldo_i_obnulit_strok1 (dt_nach)

А в синтаксисе с Сall пробела нет.

Приведенная строка кода равносильна вот этой:
Perenos_saldo_i_obnulit_strok1 CVar(dt_nach)

Другими словами, (dt_nach) или CVar(dt_nach) в данном случае создают вспомогательную (runtime) переменную с типом Variant

По поводу вещественных чисел - в VBA кроме Single для вещественных чисел есть Double с большей точностью.
А переменная с типом Variant может использоваться для значений и объектов любых типов
Изменено: ZVI - 12.03.2013 18:19:30
 
Если речь идет о нижней процедуре (см. пост1) , то я испробовал варианты и с пробелом и без пробела - выдавало ошибку. Ошибка перестала выскакивать когда я оставил только один параметр.
 
Ясно. Тогда дополню ответ Владимира.
Если всего один параметр и перед ним скобки, то VBA считает, что это указывает на преобразование к типу Variant через функцию CVar. Т.е. это будет равносильно передачи параметра без скобок, т.к. скобки VBA в этом случае относит к функции CVar, а не к Call.
Если же не указывать скобки - то это вполне документированный вызов через Call. А вот когда два аргумента, то VBA уже считает это именно аргументами и не примет со скобками без указателя Call.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо всем. Довольно доходчиво объяснили. Google курит в коридоре :)
 
Цитата
ZVI: Другими словами, (dt_nach) или CVar(dt_nach) в данном случае создают вспомогательную (runtime) переменную с типом Variant
я не перестаю диву даваться с VBA  :D
    Большое спасибо за подробный разбор!  :idea:
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх