Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как передать в пользовательскую функцию 50 параметров? - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Как передать в пользовательскую функцию 50 параметров?
Wind Дата: Среда, 26.11.2014, 13:55 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день.
У меня есть функция, в которую по необходимости может быть передано до 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]


Сообщение отредактировал Wind - Среда, 26.11.2014, 14:23
 
Ответить
СообщениеДобрый день.
У меня есть функция, в которую по необходимости может быть передано до 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]

Автор - Wind
Дата добавления - 26.11.2014 в 13:55
Rioran Дата: Среда, 26.11.2014, 14:26 | Сообщение № 2
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Wind, здравствуйте.

Судя по количеству передаваемых параметров и по их названиям... Не будет ли Вам проще передать не 50 параметров, а один параметр - массив типа ArrX(1 to 50)?

На сколько обоснована необходимость использования такого большого количества параметров? Какая решается задача? Например, LastName, FirstName, MiddleName можно передать одним стрингом и, при необходимости, уже внутри процедуры "расцепить".


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
СообщениеWind, здравствуйте.

Судя по количеству передаваемых параметров и по их названиям... Не будет ли Вам проще передать не 50 параметров, а один параметр - массив типа ArrX(1 to 50)?

На сколько обоснована необходимость использования такого большого количества параметров? Какая решается задача? Например, LastName, FirstName, MiddleName можно передать одним стрингом и, при необходимости, уже внутри процедуры "расцепить".

Автор - Rioran
Дата добавления - 26.11.2014 в 14:26
Wind Дата: Среда, 26.11.2014, 14:35 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Rioran, Смысл такой. Мне необходимо написать программу формирования QR-кода. По ГОСТу есть 50 параметров которые в него можно передать (ГОСТ чисто по нашему направлению). Объединять ФИО не целесообразно, поскольку при разделении может возникнуть раскосяк (взякие ибн, заде и т.д. могут попасться).
Я не оч. опытен в коде vba, подскажите синтаксис, как правильно передать массив параметров в функцию.
 
Ответить
СообщениеRioran, Смысл такой. Мне необходимо написать программу формирования QR-кода. По ГОСТу есть 50 параметров которые в него можно передать (ГОСТ чисто по нашему направлению). Объединять ФИО не целесообразно, поскольку при разделении может возникнуть раскосяк (взякие ибн, заде и т.д. могут попасться).
Я не оч. опытен в коде vba, подскажите синтаксис, как правильно передать массив параметров в функцию.

Автор - Wind
Дата добавления - 26.11.2014 в 14:35
ikki Дата: Среда, 26.11.2014, 14:48 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
один из возможных вариантов - объявить в программе составной пользовательский тип с нужными полями
далее работать с переменными этого типа.
например:
[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]


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениеодин из возможных вариантов - объявить в программе составной пользовательский тип с нужными полями
далее работать с переменными этого типа.
например:
[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]

Автор - ikki
Дата добавления - 26.11.2014 в 14:48
ikki Дата: Среда, 26.11.2014, 16:47 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
при попытке создать более 25 ругается на длину строки
кстати - это не ограничение на число параметров.
это ограничение на кол-во переносов строки (через пробел-подчеркивание).


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщение
при попытке создать более 25 ругается на длину строки
кстати - это не ограничение на число параметров.
это ограничение на кол-во переносов строки (через пробел-подчеркивание).

Автор - ikki
Дата добавления - 26.11.2014 в 16:47
Саня Дата: Среда, 26.11.2014, 17:15 | Сообщение № 6
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
можно так:
[vba]
Код
Option Explicit

Sub test()
     ParamArrayDemo True, 1, 1&, "string"
End Sub

Function ParamArrayDemo(ParamArray arglist()) As Double
     Dim arg
     For Each arg In arglist
         Debug.Print TypeName(arg); ":", arg
     Next arg
End Function
[/vba]
 
Ответить
Сообщениеможно так:
[vba]
Код
Option Explicit

Sub test()
     ParamArrayDemo True, 1, 1&, "string"
End Sub

Function ParamArrayDemo(ParamArray arglist()) As Double
     Dim arg
     For Each arg In arglist
         Debug.Print TypeName(arg); ":", arg
     Next arg
End Function
[/vba]

Автор - Саня
Дата добавления - 26.11.2014 в 17:15
Wind Дата: Среда, 26.11.2014, 17:28 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
ikki, Попробовал метод. В принципе тоже о нем думал, но тогда получается при использовании формулы надо знать в какой последовательности необходимо передать параметры (данные мне необходимо передать не программно, поскольку у меня задача написать пользовательский модуль который будет запускаться чисто как формула), а иначе будет раскосяк информации, что недопустимо. А зная человеческий фактор, юзвери полюбому накасячат. Я именно поэтому и хотел чтобы параметры прописывались в разные строки. Так и контролировать корректность проще.
А что касается передачи моим методом параметров, я обманул, он не ругается на длину строки, это как Вы правильно сказали из-за количество переносов. В моем же случае просто после определенного количества (около 15 шт) параметров описанных во входящих параметрах появляется глюк, при использовании функции вместо всех перечисленных параметров выдает только одну строку без названия, и все.
Все пытаюсь понять, как в Excel реализован код функции СРЗНАЧ(), там параметры вводятся вполне спокойно. Может кто знает как в ней реализован способ передачи параметров. Мне бы прям очень подошло.


Сообщение отредактировал Wind - Среда, 26.11.2014, 17:32
 
Ответить
Сообщениеikki, Попробовал метод. В принципе тоже о нем думал, но тогда получается при использовании формулы надо знать в какой последовательности необходимо передать параметры (данные мне необходимо передать не программно, поскольку у меня задача написать пользовательский модуль который будет запускаться чисто как формула), а иначе будет раскосяк информации, что недопустимо. А зная человеческий фактор, юзвери полюбому накасячат. Я именно поэтому и хотел чтобы параметры прописывались в разные строки. Так и контролировать корректность проще.
А что касается передачи моим методом параметров, я обманул, он не ругается на длину строки, это как Вы правильно сказали из-за количество переносов. В моем же случае просто после определенного количества (около 15 шт) параметров описанных во входящих параметрах появляется глюк, при использовании функции вместо всех перечисленных параметров выдает только одну строку без названия, и все.
Все пытаюсь понять, как в Excel реализован код функции СРЗНАЧ(), там параметры вводятся вполне спокойно. Может кто знает как в ней реализован способ передачи параметров. Мне бы прям очень подошло.

Автор - Wind
Дата добавления - 26.11.2014 в 17:28
ikki Дата: Среда, 26.11.2014, 17:30 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
но тогда получается при использовании формулы надо знать в какой последовательности необходимо передать параметры
вот как-раз таки всё наоборот.
это совершенно неважно.
более того - можно заполнять (и обрабатывать) не все параметры, а только нужные.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki


Сообщение отредактировал ikki - Среда, 26.11.2014, 17:33
 
Ответить
Сообщение
но тогда получается при использовании формулы надо знать в какой последовательности необходимо передать параметры
вот как-раз таки всё наоборот.
это совершенно неважно.
более того - можно заполнять (и обрабатывать) не все параметры, а только нужные.

Автор - ikki
Дата добавления - 26.11.2014 в 17:30
Wind Дата: Среда, 26.11.2014, 17:36 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
ikki, хм, что то я похоже не допонял. Почему не важно?
Ну собственно что только нужные параметры, - эта тема тоже актуальна.


Сообщение отредактировал Wind - Среда, 26.11.2014, 17:40
 
Ответить
Сообщениеikki, хм, что то я похоже не допонял. Почему не важно?
Ну собственно что только нужные параметры, - эта тема тоже актуальна.

Автор - Wind
Дата добавления - 26.11.2014 в 17:36
ikki Дата: Среда, 26.11.2014, 17:43 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
потому что неважно. в каком порядке Вы будете перечислять поля в блоке With
да и перечень может быть меньше общего.
я же привёл пример:
[vba]
Код
   With something
         .Name = "abc"
         .FirstName = "Xyz"
         .PayeeINN = "1234567890"
     End With
[/vba]
передавать в функцию Вы будете один-единственный объект - something
а в функции обрабатывать только нужные поля - опть-таки, в предыдущем коде есть пример.


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениепотому что неважно. в каком порядке Вы будете перечислять поля в блоке With
да и перечень может быть меньше общего.
я же привёл пример:
[vba]
Код
   With something
         .Name = "abc"
         .FirstName = "Xyz"
         .PayeeINN = "1234567890"
     End With
[/vba]
передавать в функцию Вы будете один-единственный объект - something
а в функции обрабатывать только нужные поля - опть-таки, в предыдущем коде есть пример.

Автор - ikki
Дата добавления - 26.11.2014 в 17:43
Wind Дата: Среда, 26.11.2014, 17:50 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
ikki, Неее, это как раз понятно. Но я же говорю что в данном методе как я понимаю, необходимо в программе прописать расположение значений.
А мне надо чтобы это задавалось пользователем при создании функции по типу как на рисунке:
 
Ответить
Сообщениеikki, Неее, это как раз понятно. Но я же говорю что в данном методе как я понимаю, необходимо в программе прописать расположение значений.
А мне надо чтобы это задавалось пользователем при создании функции по типу как на рисунке:

Автор - Wind
Дата добавления - 26.11.2014 в 17:50
ikki Дата: Среда, 26.11.2014, 17:55 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
т.е. Вам нужна функция, которую можно вызвать с листа Excel?
извините, по первому сообщению это было неочевидно.

но в таком случае непонятен Ваш пример с СРЗНАЧ в качестве "эталона"
там как раз параметры обозначаются "число1", "число2", ...
а Вы писали:
чтобы и переменная функции называлась не p1,p2...p50


как-то... запутали Вы меня :)


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениет.е. Вам нужна функция, которую можно вызвать с листа Excel?
извините, по первому сообщению это было неочевидно.

но в таком случае непонятен Ваш пример с СРЗНАЧ в качестве "эталона"
там как раз параметры обозначаются "число1", "число2", ...
а Вы писали:
чтобы и переменная функции называлась не p1,p2...p50


как-то... запутали Вы меня :)

Автор - ikki
Дата добавления - 26.11.2014 в 17:55
Wind Дата: Среда, 26.11.2014, 17:57 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Ну она не то чтобы в качестве эталона, но в принципе, если необходимо для большого количества параметров именно подобные наименования полей, то переживу. Накину подсказки на параметры.
А так то да, извиняюсь что изначально не сформулировал правильно, мне именно с листа запускать.
 
Ответить
СообщениеНу она не то чтобы в качестве эталона, но в принципе, если необходимо для большого количества параметров именно подобные наименования полей, то переживу. Накину подсказки на параметры.
А так то да, извиняюсь что изначально не сформулировал правильно, мне именно с листа запускать.

Автор - Wind
Дата добавления - 26.11.2014 в 17:57
ikki Дата: Среда, 26.11.2014, 18:36 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
ну... нее знаю...
пугает меня такой вариант.
50 параметров.
и в форме задания параметров функции сидеть-прицеливаться-щёлкать...
не перепутать и не пропустить...

я бы на месте пользователя, которому приходится пользоваться такой "функцией", потребовал двукратного увеличения оклада :)

в качестве альтернативы - организуйте исх. данные для функции в таблицу с заранее предопределенным порядком столбцов.
и передавайте функции диапазон.

другой вариант - порядок столбцов может быть изменяемым, но сами заголовки - стандартными (точнее - известными данной функции) плюс к этому сами заголовки функции тоже надо передать.

в приложенном файле - оба варианта.
обратите внимание - если в левй табличке перетаскивать столбец "комментарий", это вызовет ошибки.
во втором - нет.
а изменение заголовков столбцов - наоборот.

конечно, это не прямой ответ на ваш вопрос.
но, возможно, понравится ;)
К сообщению приложен файл: udf.xlsm (17.8 Kb)


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki
 
Ответить
Сообщениену... нее знаю...
пугает меня такой вариант.
50 параметров.
и в форме задания параметров функции сидеть-прицеливаться-щёлкать...
не перепутать и не пропустить...

я бы на месте пользователя, которому приходится пользоваться такой "функцией", потребовал двукратного увеличения оклада :)

в качестве альтернативы - организуйте исх. данные для функции в таблицу с заранее предопределенным порядком столбцов.
и передавайте функции диапазон.

другой вариант - порядок столбцов может быть изменяемым, но сами заголовки - стандартными (точнее - известными данной функции) плюс к этому сами заголовки функции тоже надо передать.

в приложенном файле - оба варианта.
обратите внимание - если в левй табличке перетаскивать столбец "комментарий", это вызовет ошибки.
во втором - нет.
а изменение заголовков столбцов - наоборот.

конечно, это не прямой ответ на ваш вопрос.
но, возможно, понравится ;)

Автор - ikki
Дата добавления - 26.11.2014 в 18:36
Wind Дата: Среда, 26.11.2014, 19:38 | Сообщение № 15
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Да ну 50 полей не так уж и много для двух окладов, но их и не обязательно заполнять все. Просто по ГОСТ они могут быть введены но не все обязательны.
Хочу просто универсализировать функцию под любой запрос. Плюс что мне нравится в такой передачи аргументов, что справа от строки ввода пишется "=значение", т.е. при передачи параметров ты визуально контролируешь правильность присовоения данных.
Благодарю за потраченное на меня время, завтра посмотрю Ваш вариант.
 
Ответить
СообщениеДа ну 50 полей не так уж и много для двух окладов, но их и не обязательно заполнять все. Просто по ГОСТ они могут быть введены но не все обязательны.
Хочу просто универсализировать функцию под любой запрос. Плюс что мне нравится в такой передачи аргументов, что справа от строки ввода пишется "=значение", т.е. при передачи параметров ты визуально контролируешь правильность присовоения данных.
Благодарю за потраченное на меня время, завтра посмотрю Ваш вариант.

Автор - Wind
Дата добавления - 26.11.2014 в 19:38
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!