Добрый день. У меня есть функция, в которую по необходимости может быть передано до 50-ти разных параметров. Подскажите как сделать такой вариант красиво, чтобы и переменная функции называлась не p1,p2...p50. И собственно как вообще туда их столько упихать. У меня при попытке создать более 25 ругается на длину строки. Хотел найти решение как сделана дистрибутивная функция в excel "СРЗНАЧ" у нее с легкостью можно передать и больше 50.
Передача параметров в функцию имеет следующий:
[vba]
Код
Public Function Set_Param( ByVal PictureName As String, _ ByVal Name As String, _ ByVal PersonalAcc As String, _ ByVal BankName As String, _ ByVal BIC As String, _ ByVal CorrespAcc As String, _ ByVal Sum As String, _ ByVal PayeeINN As String, _ ByVal LastName As String, _ ByVal FirstName As String, _ ByVal MiddleName As String, _ ByVal PayerAddress As String, _ ByVal PersAcc As String, _ ................ ByVal PaymPeriod As String) As Variant
........ End Function
[/vba]
Добрый день. У меня есть функция, в которую по необходимости может быть передано до 50-ти разных параметров. Подскажите как сделать такой вариант красиво, чтобы и переменная функции называлась не p1,p2...p50. И собственно как вообще туда их столько упихать. У меня при попытке создать более 25 ругается на длину строки. Хотел найти решение как сделана дистрибутивная функция в excel "СРЗНАЧ" у нее с легкостью можно передать и больше 50.
Передача параметров в функцию имеет следующий:
[vba]
Код
Public Function Set_Param( ByVal PictureName As String, _ ByVal Name As String, _ ByVal PersonalAcc As String, _ ByVal BankName As String, _ ByVal BIC As String, _ ByVal CorrespAcc As String, _ ByVal Sum As String, _ ByVal PayeeINN As String, _ ByVal LastName As String, _ ByVal FirstName As String, _ ByVal MiddleName As String, _ ByVal PayerAddress As String, _ ByVal PersAcc As String, _ ................ ByVal PaymPeriod As String) As Variant
Судя по количеству передаваемых параметров и по их названиям... Не будет ли Вам проще передать не 50 параметров, а один параметр - массив типа ArrX(1 to 50)?
На сколько обоснована необходимость использования такого большого количества параметров? Какая решается задача? Например, LastName, FirstName, MiddleName можно передать одним стрингом и, при необходимости, уже внутри процедуры "расцепить".
Wind, здравствуйте.
Судя по количеству передаваемых параметров и по их названиям... Не будет ли Вам проще передать не 50 параметров, а один параметр - массив типа ArrX(1 to 50)?
На сколько обоснована необходимость использования такого большого количества параметров? Какая решается задача? Например, LastName, FirstName, MiddleName можно передать одним стрингом и, при необходимости, уже внутри процедуры "расцепить".Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Rioran, Смысл такой. Мне необходимо написать программу формирования QR-кода. По ГОСТу есть 50 параметров которые в него можно передать (ГОСТ чисто по нашему направлению). Объединять ФИО не целесообразно, поскольку при разделении может возникнуть раскосяк (взякие ибн, заде и т.д. могут попасться). Я не оч. опытен в коде vba, подскажите синтаксис, как правильно передать массив параметров в функцию.
Rioran, Смысл такой. Мне необходимо написать программу формирования QR-кода. По ГОСТу есть 50 параметров которые в него можно передать (ГОСТ чисто по нашему направлению). Объединять ФИО не целесообразно, поскольку при разделении может возникнуть раскосяк (взякие ибн, заде и т.д. могут попасться). Я не оч. опытен в коде vba, подскажите синтаксис, как правильно передать массив параметров в функцию.Wind
один из возможных вариантов - объявить в программе составной пользовательский тип с нужными полями далее работать с переменными этого типа. например: [vba]
Код
Type TParam PictureName As String Name As String PersonalAcc As String BankName As String BIC As String CorrespAcc As String Sum As String PayeeINN As String LastName As String FirstName As String MiddleName As String PayerAddress As String PersAcc As String ' .... PaymPeriod As String End Type
Function set_param(cur As TParam) Debug.Print cur.FirstName ' просто тест ' ... End Function
Sub main() Dim something As TParam With something .Name = "abc" .FirstName = "Xyz" .PayeeINN = "1234567890" End With Call set_param(something) End Sub
[/vba]
один из возможных вариантов - объявить в программе составной пользовательский тип с нужными полями далее работать с переменными этого типа. например: [vba]
Код
Type TParam PictureName As String Name As String PersonalAcc As String BankName As String BIC As String CorrespAcc As String Sum As String PayeeINN As String LastName As String FirstName As String MiddleName As String PayerAddress As String PersAcc As String ' .... PaymPeriod As String End Type
Function set_param(cur As TParam) Debug.Print cur.FirstName ' просто тест ' ... End Function
Sub main() Dim something As TParam With something .Name = "abc" .FirstName = "Xyz" .PayeeINN = "1234567890" End With Call set_param(something) End Sub
ikki, Попробовал метод. В принципе тоже о нем думал, но тогда получается при использовании формулы надо знать в какой последовательности необходимо передать параметры (данные мне необходимо передать не программно, поскольку у меня задача написать пользовательский модуль который будет запускаться чисто как формула), а иначе будет раскосяк информации, что недопустимо. А зная человеческий фактор, юзвери полюбому накасячат. Я именно поэтому и хотел чтобы параметры прописывались в разные строки. Так и контролировать корректность проще. А что касается передачи моим методом параметров, я обманул, он не ругается на длину строки, это как Вы правильно сказали из-за количество переносов. В моем же случае просто после определенного количества (около 15 шт) параметров описанных во входящих параметрах появляется глюк, при использовании функции вместо всех перечисленных параметров выдает только одну строку без названия, и все. Все пытаюсь понять, как в Excel реализован код функции СРЗНАЧ(), там параметры вводятся вполне спокойно. Может кто знает как в ней реализован способ передачи параметров. Мне бы прям очень подошло.
ikki, Попробовал метод. В принципе тоже о нем думал, но тогда получается при использовании формулы надо знать в какой последовательности необходимо передать параметры (данные мне необходимо передать не программно, поскольку у меня задача написать пользовательский модуль который будет запускаться чисто как формула), а иначе будет раскосяк информации, что недопустимо. А зная человеческий фактор, юзвери полюбому накасячат. Я именно поэтому и хотел чтобы параметры прописывались в разные строки. Так и контролировать корректность проще. А что касается передачи моим методом параметров, я обманул, он не ругается на длину строки, это как Вы правильно сказали из-за количество переносов. В моем же случае просто после определенного количества (около 15 шт) параметров описанных во входящих параметрах появляется глюк, при использовании функции вместо всех перечисленных параметров выдает только одну строку без названия, и все. Все пытаюсь понять, как в Excel реализован код функции СРЗНАЧ(), там параметры вводятся вполне спокойно. Может кто знает как в ней реализован способ передачи параметров. Мне бы прям очень подошло.Wind
Сообщение отредактировал Wind - Среда, 26.11.2014, 17:32
потому что неважно. в каком порядке Вы будете перечислять поля в блоке With да и перечень может быть меньше общего. я же привёл пример: [vba]
Код
With something .Name = "abc" .FirstName = "Xyz" .PayeeINN = "1234567890" End With
[/vba] передавать в функцию Вы будете один-единственный объект - something а в функции обрабатывать только нужные поля - опть-таки, в предыдущем коде есть пример.
потому что неважно. в каком порядке Вы будете перечислять поля в блоке With да и перечень может быть меньше общего. я же привёл пример: [vba]
Код
With something .Name = "abc" .FirstName = "Xyz" .PayeeINN = "1234567890" End With
[/vba] передавать в функцию Вы будете один-единственный объект - something а в функции обрабатывать только нужные поля - опть-таки, в предыдущем коде есть пример.ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
ikki, Неее, это как раз понятно. Но я же говорю что в данном методе как я понимаю, необходимо в программе прописать расположение значений. А мне надо чтобы это задавалось пользователем при создании функции по типу как на рисунке:
ikki, Неее, это как раз понятно. Но я же говорю что в данном методе как я понимаю, необходимо в программе прописать расположение значений. А мне надо чтобы это задавалось пользователем при создании функции по типу как на рисунке: Wind
Ну она не то чтобы в качестве эталона, но в принципе, если необходимо для большого количества параметров именно подобные наименования полей, то переживу. Накину подсказки на параметры. А так то да, извиняюсь что изначально не сформулировал правильно, мне именно с листа запускать.
Ну она не то чтобы в качестве эталона, но в принципе, если необходимо для большого количества параметров именно подобные наименования полей, то переживу. Накину подсказки на параметры. А так то да, извиняюсь что изначально не сформулировал правильно, мне именно с листа запускать.Wind
ну... нее знаю... пугает меня такой вариант. 50 параметров. и в форме задания параметров функции сидеть-прицеливаться-щёлкать... не перепутать и не пропустить...
я бы на месте пользователя, которому приходится пользоваться такой "функцией", потребовал двукратного увеличения оклада
в качестве альтернативы - организуйте исх. данные для функции в таблицу с заранее предопределенным порядком столбцов. и передавайте функции диапазон.
другой вариант - порядок столбцов может быть изменяемым, но сами заголовки - стандартными (точнее - известными данной функции) плюс к этому сами заголовки функции тоже надо передать.
в приложенном файле - оба варианта. обратите внимание - если в левй табличке перетаскивать столбец "комментарий", это вызовет ошибки. во втором - нет. а изменение заголовков столбцов - наоборот.
конечно, это не прямой ответ на ваш вопрос. но, возможно, понравится
ну... нее знаю... пугает меня такой вариант. 50 параметров. и в форме задания параметров функции сидеть-прицеливаться-щёлкать... не перепутать и не пропустить...
я бы на месте пользователя, которому приходится пользоваться такой "функцией", потребовал двукратного увеличения оклада
в качестве альтернативы - организуйте исх. данные для функции в таблицу с заранее предопределенным порядком столбцов. и передавайте функции диапазон.
другой вариант - порядок столбцов может быть изменяемым, но сами заголовки - стандартными (точнее - известными данной функции) плюс к этому сами заголовки функции тоже надо передать.
в приложенном файле - оба варианта. обратите внимание - если в левй табличке перетаскивать столбец "комментарий", это вызовет ошибки. во втором - нет. а изменение заголовков столбцов - наоборот.
конечно, это не прямой ответ на ваш вопрос. но, возможно, понравится ikki
Да ну 50 полей не так уж и много для двух окладов, но их и не обязательно заполнять все. Просто по ГОСТ они могут быть введены но не все обязательны. Хочу просто универсализировать функцию под любой запрос. Плюс что мне нравится в такой передачи аргументов, что справа от строки ввода пишется "=значение", т.е. при передачи параметров ты визуально контролируешь правильность присовоения данных. Благодарю за потраченное на меня время, завтра посмотрю Ваш вариант.
Да ну 50 полей не так уж и много для двух окладов, но их и не обязательно заполнять все. Просто по ГОСТ они могут быть введены но не все обязательны. Хочу просто универсализировать функцию под любой запрос. Плюс что мне нравится в такой передачи аргументов, что справа от строки ввода пишется "=значение", т.е. при передачи параметров ты визуально контролируешь правильность присовоения данных. Благодарю за потраченное на меня время, завтра посмотрю Ваш вариант.Wind