Страницы: 1
RSS
Чем заменить фигурные скобки в MATCH (ПОИСКПОЗ) в VBA, ругается на них
 
Собственно вопрос в теме
строка кода примерно такая.
Код
mDate = WorksheetFunction.Match("мар", {"янв","фев","мар","апр","мая","июн","июл","авг","сен","окт","ноя","дек"})
Пишет какой-то Invalid...  :) и указывает на первую фигурную скобку
хотя в справке черным по английскому
  • Цитата
    MATCH returns the position of the matched value within lookup_array, not the value itself. For example, MATCH("b",{"a","b","c"},0) returns 2, the relative position of "b" within the array {"a","b","c"}.

в чем подвох? и как поправить?
Спасибо
Изменено: Sanja - 28.02.2016 23:03:13
Согласие есть продукт при полном непротивлении сторон
 
Sanja,
Код
mDate = WorksheetFunction.Match("мар", Array("янв","фев","мар","апр","мая","июн","июл","авг","сен","окт","ноя","дек"),0)
Изменено: Казанский - 28.02.2016 22:30:06
 
Казанский, да так работает, спасибо.
Но обидно как-то :)
Согласие есть продукт при полном непротивлении сторон
 
Sanja, лучше
Код
mDate = instr(1,"  янвфевмарапрмаяиюниюлавгсеноктноядек","МАР",vbtextcompare)/3
 
Цитата
Казанский написал: лучше
почему? быстрее?
Изменено: Sanja - 28.02.2016 22:35:24
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал: почему?
Потому что нет обращения к WorksheetFunction, которое происходит более медленно, чем ко встроенной в VBA InStr. На больших массивах эту разницу можно увидеть невооруженным взглядом :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Понятно. Спасибо
Согласие есть продукт при полном непротивлении сторон
 
Все-таки про фигурные скобки интересно. Это баг? Или от локали как-то зависит?
Согласие есть продукт при полном непротивлении сторон
 
Sanja, не баг. Фигурные скобки - оператор языка формул, и может использоваться на листе или в строке, которую обрабатывает метод Evaluate.
Код
  s = "мар"
  mDate = Evaluate("MATCH(""" & s & """,{""янв"",""фев"",""мар"",""апр"",""мая"",""июн"",""июл"",""авг"",""сен"",""окт"",""ноя"",""дек""},)")
Это другой путь использования функций листа в VBA.
 
Цитата
Sanja написал:
Это баг?
Чуть расширю ответ Алексея. В формулах фигурные скобки означают массив. Т.е. формулу массива когда вводим - фигурные скобки означают, что диапазоны и операции в формулах производятся в массиве. ВПР, ПОИСКПОЗ и еще некоторые - могут в качестве таблиц принимать именно массив. Если мы указываем на диапазон ячеек - то он внутри формулы все равно преобразуется в массив. Но так же можно указать массив явно - заключив его элементы в фигурные скобки. Это будет указатель формуле, что внутри элементы массива, а не просто перечисление.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, я это понимаю, не понимаю почему VBA не воспринимает значения в фигурных скобках внутри формулы как массив. Используется же функция ЛИСТА
Цитата
The_Prist написал: Но так же можно указать массив явно - заключив его элементы в фигурные скобки.
Изменено: Sanja - 29.02.2016 11:26:23
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
не понимаю почему VBA не воспринимает значения в фигурных скобках
Еще раз: это синтаксис исключительно формул. Вы же текст в кавычках не можете прямо так указать из VBA? Надо еще кавычки добавлять.
Как бы пояснить: формула понимает, что ей передали массив только тогда, когда он в фигурных скобках. Т.е. внутри она сама преобразует его в Array. VBA же не может напрямую передать массив как текст со скобками, потому что есть специальный объект Array и использовать надо именно его.
Вот как Вы передаете в WorksheetFunction.Match диапазон ячеек? Не просто же текст указываете - "A1:A10"? Вы же его через объект Range будете передавать - Range("A1:A10"). Вот так и здесь - надо работать по законам VBA, а не формул. Или уж вписывайте кодом формулу в ячейку, вычисляйте и считывайте значение. Тогда да, можно и скобками указывать...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Sanja написал:
Используется же функция ЛИСТА
Нет. Используется семейство WorksheetFunction, члены которого не являются непосредственно функциями листа. Это функции класса, которые принимают аргументы по законам функций, вызываемых из VBA. Вы же не напрямую на лист это записываете.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Понятно. Справка ввела в заблуждение. Хотя это цитата из справки именно по WorksheetFunction.Match Method
Согласие есть продукт при полном непротивлении сторон
Страницы: 1
Наверх