Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.01.2009, 22:03   #1
Jarik
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 53
По умолчанию Создание надстроек. Функция, возвращающая массив значений

Есть много вопросов по VBA. По ходу буду добавлять новые.
1. Хочу написать процедуру с нескольким аргументами. Как это сделать?
Код:
Sub A(i as Integer)
       ; так нормально работает
End Sub

Sub A(i as Integer, j as Integer)
       ; так не работает. В месте вызова требует знак "="
       ; Приходится делать из этого функцию, хотя нет возвращаемого значения
End Sub
2. Как сделать, чтобы функция возвращала сразу несколько значений? Поясню. Допустим, функция Statistics выдает максимальное, минимальное и среднее значение. В ячейку вводится эта функция, затем протягивается на три вниз, нажимается какая-то волшебная комбинация (типа F9 + Enter) и в этих ячейках появляются указанные значения.
Желателен простейший пример.

3. Как создавать свои собственные надстройки? В инете нашел что-то про интерфейс, но это не интересно. По сути, если есть написанные процедуры и функции, то хотелось бы оформить их в надстройку.

Заранее спасибо.
Jarik вне форума
Старый 07.01.2009, 06:44   #2
Pavel55
Форумчанин
 
Регистрация: 21.08.2007
Сообщений: 292
По умолчанию

По первому вопросу (остальные пока не дочитал)

Код:
Sub Макрос1()
    Call A(5, 7)
End Sub

Sub A(i As Integer, j As Integer)
    MsgBox i + j
End Sub
Pavel55 вне форума
Старый 07.01.2009, 06:56   #3
Pavel55
Форумчанин
 
Регистрация: 21.08.2007
Сообщений: 292
По умолчанию

По второму вопросу, я не очень понял, что вы имеете ввиду. Может это

Код:
Function Statistics(Rng As Range, Mode As String)
    Select Case LCase(Mode)
        Case "max"
            Statistics = WorksheetFunction.Max(Rng)
        Case "min"
            Statistics = WorksheetFunction.Min(Rng)
        Case "average"
            Statistics = WorksheetFunction.Average(Rng)
        Case Else
            Statistics = CVErr(xlErrValue)
    End Select
End Function
Вызов

=Statistics(A1:A10;"min")
Pavel55 вне форума
Старый 07.01.2009, 06:59   #4
Pavel55
Форумчанин
 
Регистрация: 21.08.2007
Сообщений: 292
По умолчанию

По третьему вопросу

1) Сперва пишете свои макросы в книге Excel
2) Сохраняете её как надстройку - меню Файл - Сохранить как... - тип файла указываете "Надстройка Microsoft Office Excel (*.xla)"
3) Подключаете её в Excel через меню Сервис - Надстройки... - Обзор....

Последний раз редактировалось Pavel55; 07.01.2009 в 07:01.
Pavel55 вне форума
Старый 07.01.2009, 13:49   #5
tolikman
Форумчанин
 
Регистрация: 25.08.2008
Сообщений: 159
По умолчанию

по второму вопросу: я тоже не до конца понял, во первых, если в ячейку - то это уже не VBA, а если растягивать функцию на три ячейки, то это уже три функции, а не одна.
---
вот к примеру функция разщипляющая строку на массив
строка "1_2_3_4" = массиву [1][2][3][4]
если в строке нет разделителя возвращает один элемент содержащий всю строку
если после последнего разделителя ничего нет (к примеру "1_2_3_4_", а разделитель "_"), то он пустоту после него не возвращает (удобно когда циклами строку составляеш), т.е. возвращает тоже самое что и в начале
Если необходимо чтобы последний элемент был "Ничем" необходимо еще один разделитель в конце дописать: "1_2_3_4__"
Код:
Public Function split(str, splitter)
    Dim i As Long, endi As Long, spl As Long, lasti As Long
    Dim arr()
    ReDim arr(0)
    spl = Len(splitter)
    endi = Len(str) - spl + 1
    lasti = 1
    For i = 1 To endi
        If Mid(str, i, spl) = splitter Then
            ReDim Preserve arr(UBound(arr, 1) + 1)
            arr(UBound(arr, 1)) = Mid(str, lasti, i - lasti)
            lasti = i + spl
        End If
    Next i
    If i > lasti Then
        ReDim Preserve arr(UBound(arr, 1) + 1)
        arr(UBound(arr, 1)) = Mid(str, lasti, endi + spl - lasti)
    End If
    split = arr()
End Function
split = arr() - возвращает массив значений

Последний раз редактировалось tolikman; 07.01.2009 в 13:55.
tolikman вне форума
Старый 07.01.2009, 14:00   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию 2 tolikman

Цитата:
split = arr() - возвращает массив значений
Весьма оригинальная запись

А функция Public Function split(str, splitter) понравилась ещё больше...
Чем Вас не устраивает аналогичная функция split, встроенная в VBA ? Неужто хуже работает?


Попробуйте такой вариант: (разумеется, Вашей функции Public Function split(str, splitter) не должно быть в открытых файлах во время проверки кода, или её надо предварительно переименовать)
Код:
Sub test()
    a = Array(22, 34, 52, 37)
    res = Join(a, ", "): MsgBox res    ' объединяем массив в строку

    newarr = Split(res, ", ")    ' разбиваем строку на элементы, получая массив
    For i = LBound(newarr) To UBound(newarr): MsgBox i & "-й элемент массива равен  " & newarr(i): Next
End Sub
EducatedFool вне форума
Старый 13.01.2009, 23:11   #7
Jarik
Пользователь
 
Регистрация: 28.02.2008
Сообщений: 53
По умолчанию

По поводу ф-ии, которая возвращает массив значений.
Нашел экселевский пример акой ф-ии: линейн()
Она возвращает накло и смещение. Для того, чтобы вывести два значения этой ф-ии, надо ввести в первую ячейку = "линейн(параметры)", потом выделить вместе с равой соседней ячейкой. Нажать F2, а затем ctrl+shift+Enter. После этого в выделенных ячейках отобразятся два значения.
Как написать такую же пользовательскую функцию?
Jarik вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция возвращающая строку(си++). necky Помощь студентам 1 18.10.2008 18:32
API функция возвращающая имена дисков всистеме AIst Win Api 2 09.08.2008 19:17
Генерировать массив без повтора значений элементов. На (С.) Raptor Помощь студентам 5 17.12.2007 14:42
Функция ЕСЛИ и диапазоны значений. Ник Харди Microsoft Office Excel 3 05.12.2007 13:39
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50