Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual Basic
Перезагрузить страницу Может ли UDF Excel иметь пользовательский тип?
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Voldyr Voldyr вне форума
Member
 
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2006
По умолчанию Может ли UDF Excel иметь пользовательский тип? - 20.02.2016, 23:38

Всем привет!
Подскажите, может ли Пользовательская функция Excel иметь пользовательский тип, и как элемент такой функции вывести в ячейку?
VB Код:
Public Type t3DSize
a As Integer
b As Integer
c As Integer
End Type

Public Function fSize(ByVal strInput As String) As t3DSize ' с strInput передается размер в формате AxBxC
Dim arrSizes() As String
arrSizes() = Split(LCase(strInput), "x") ' En x

If UBound(arrSizes()) = 0 Then
arrSizes() = Split(LCase(strInput), "х") ' Ru x
End If

fSize.a = arrSizes(0)
fSize.b = arrSizes(1)
fSize.c = arrSizes(2)

End Function

В отдельных ячейках нужно вывести a , b и с...
Пример(хоть и не правильный, но для наглядности:

=fSize(A1).a
Ответить с цитированием
  (#2 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 21.02.2016, 00:43

Альтернативный вариант :

VB Код:
Public Function fSize(ByVal strInput As String) As String()
    fSize = Split(Replace(LCase(strInput), "х", "x"), "x")
End Function

Получить отдельный элемент массива, можно, например, так

=ИНДЕКС(fSize(A1);2)

А получить все элемента массива, можно, если просто ввести формулу массива.

P.S. Обратите внимание на то, что в отличии от первоначального замысла, здесь мы получаем не число 100, а строку "100". Правда это легко исправить, например :

=ЗНАЧЕН(ИНДЕКС(fSize(A1);2))
=--ИНДЕКС(fSize(A1);2)
=ИНДЕКС(fSize(A1);2)*1
и т.п.

или изменить исходник UDF
Ответить с цитированием
  (#3 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 21.02.2016, 01:29

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

VB Код:
Public Function fSize(ByVal strInput As String, Optional varColumn) As Variant
    Dim strArr() As String
    strArr = Split(Replace(LCase(strInput), "х", "x"), "x")
   
    If Not IsMissing(varColumn) Then
       fSize = strArr(varColumn - 1)
    Else
       fSize = strArr
    End If
End Function
Ответить с цитированием
  (#4 (permalink)) Старый
Voldyr Voldyr вне форума
Member
 
Сообщений: 50
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2006
По умолчанию 21.02.2016, 01:41

Да, Ваш вариант отлично подойдет, к тому же он, не смотря на предельную простоту, еще и предусматривает тот случай, когда размеры AxBxC могу быть переданы и с русским "х" и с английским одновременно, чего у меня в функции нет!). Но все-таки, скажите, если не трудно, по первой части вопроса, получается пользовательские типы нельзя использовать в качестве типа для UDF? Заранее спасибо!
Ответить с цитированием
  (#5 (permalink)) Старый
pashulka pashulka вне форума
Member
 
Сообщений: 1,872
Сказал(а) спасибо: 2
Поблагодарили 57 раз(а) в 53 сообщениях
Регистрация: 11.03.2005
По умолчанию 21.02.2016, 14:31

Использовать можно, но сомневаюсь, что получится вызвать такую функцию из ячеек рабочего листа.
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
пользовательский интерфейс qwerty1742 .NET 0 02.02.2012 19:03
Пользовательский модуль. Работа с Матрицами glebochek Pascal 0 27.12.2011 03:44
Пользовательский тип с помощью функций высшего порядка Ghost92 Haskell 13 14.12.2011 18:01
Иметь внутри проекта xml читать его и изменять содержимое imported_Levon .NET 3 01.06.2009 12:27
Какой вид будет иметь код для метода read KostyaKKostyaK Visual C++ 0 22.01.2009 12:27
Как откоючить пользовательский поиск Гугла? chocogel Любые вопросы от новичков 1 21.12.2008 12:49
Должны ли все планки памяти иметь одинаковую частоту? Kitoboi Любые вопросы от новичков 19 19.09.2008 00:14
Кто может помочь с excel ? imported_Vadimus Visual Basic 5 21.06.2007 14:15
Как сделать в Прологе пользовательский интерфейс? Samira Prolog 3 02.06.2006 17:14
Как создать пользовательский интерфейс leader8-12 Вопросы начинающих программистов 1 20.10.2005 16:46
Какие статусы может иметь свойство State winmac Delphi 1 12.04.2004 13:22
Хорошо бы иметь MessageBox с запросом "Хотите отправить Anonymous Мысли вслух 2 06.11.2003 10:53



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов