Для этого проще формулу написать она, что на VBA что на .Net это очень простая задача. В Регулярных выражениях, если память не изменяет такой возможности нет.
Цитата
medvalex написал: Возвращает Истину для пустых строк, даже если они не удовлетворяют выражению Возвращает Истину, когда найдено соответствие только части строки, а не всей строки, шаблону.
Я же писал, что библиотека не поддерживается, а значит предоставляется как есть, ну нет у меня пока желания ее развивать.
Необходимо не только знать, но и уметь использовать это знание, ведь самые гениальные решения наиболее просты
medvalex написал: Явно просится булева функция IsMatch
Она есть, собственно Содержит(A1;"[a-z]";1) Для 64-битной версии тоже есть надстройка, это не проблема. Развитие данной библиотеки пока не ведется ибо нет необходимости и мотивации - в принципе можно написать, что угодно и даже встроить полноценное приложение которое хоть по инету шарит хоть с удаленными сервисами работает.... в обшем ограничений почти нет - только апи экселя
Необходимо не только знать, но и уметь использовать это знание, ведь самые гениальные решения наиболее просты
Выложил версию 3 для работы с регулярными выражениями (C# Regex v3.xll), а также надстройку (XlsFunctionLibrary v1.xll) добавляющую некоторые очень полезные формулы, например получить часть строки из ячейкт соответствующую шаблону, посчитать кол-во символов в ячейке, найти файл в директории, узнать содержит ли ячейка шаблон текста, заполнить ячейку из текстового файла. Все формулы можно посмотреть, вызвав диалог для вставки формулы и выбрав соответствующие разделы (А.M4rf C# Regex Functions и AMarf Xls FunctionLibrary) для всех формул включена документация, если кому то нудны будут более подробные разъяснения то пишите.
Ссылка на скачивание: OneDrive Распространение запрещено. Это означает, что скачивать и пользоваться можно, но размещать на других ресурсах для скачивания нельзя.
Необходимо не только знать, но и уметь использовать это знание, ведь самые гениальные решения наиболее просты
"Ячейка спутник" означает что она будет хранить UDF котороя буде вычислять значения двух других ячеек по значению, короче пока она есть все считается, как только ее удалили все перестало расчитываться. Скиньте пример расчета, попробуем его реализовать на vba - для меня конечно проще сдедать xll надстройку и использлвать в ней Net, но ради 1 функции целые надстройки не делаются
Необходимо не только знать, но и уметь использовать это знание, ведь самые гениальные решения наиболее просты
Ну в целом то можно нахимичить что бы в ячейках было 2 значения и они пересчитывались в зависимости от изменения значений друг друга - единственное что придеться делать ячейку спутник +) с функций внутри
Правой кнопкой по файлу -> открыть с помощью -> выбрать программу -> установить галочку "использовать выбранную программу для всех файлов такого типа" -> выбрать программу и нажать ОК
или 1. Панель управления\Программы по умолчанию\сопоставление типов файлов или протоколов конкретных программ 2. Выбрать расширение документа и изменить программу которая его открывает
ikki пишет: ту же мысль можно (а в этой ветке и нужно) формулировать иначе: "т.к. деньги меня не интересуют, буду безбожно демпинговать"
Я выше писал,что еслы Вы не справитесь с задачей (или откажетесь) до той поры я не собираюсь, что то демпить или уговаривать Заказчика взять меня для выполнения - все же задача не конкретная и немного творческая - а пока не увидешь файл с таблицей, все равно как кот в мешке, может будут идеи, а может и нет
Необходимо не только знать, но и уметь использовать это знание, ведь самые гениальные решения наиболее просты
Это не правило, а рекомендация. Я люблю работать с данными, по этому есть интерес не сколько в заработке сколько в самой задачи И я не думаю, что количеством сообщей определяются способности
У Вас в строчке с arr(0) = 2 происходит ошибка определения типа переменно - т.е. вы ее объявили но VBA не может так интерпретировать ее в массив тем более что его границы не заданы, надо бы написать что то типо того:
Код
Dim arr(0 To 10) As Variant
arr(0) = 2
VD = 6
П.С. Банально компилятору в момент выполнения вы сообщаете что эта переменная будет массивом без ограничений по размеру и он естественно Вам выдает ошибку ибо в оперативной памяти все имеет размер +)
Hugo Это как раз то что необходимо, т.к. в диапазонах (массивах) можно отслеживать с какой строки начинать вычисления и до какой выполнять итерации +)
Цитата
Doober пишет: А не проще написать для Excel надстройку ExcelAddIn и не мучиться с мостами и прочим.
ExcelAddIn средствами VBA писать не хочется (я слишком разбалован C# и .Net) а Com надстройки имеют ограничения по использованию в разных версиях + производительность ниже чем у XLL
Работает с версии 2002 и выше (Но надо проверить), Net Framework по идее не ниже 4 версии т.к. при компиляции библиотеки не интегрируются. Скорость работы выше чем у RegExp где то в 1,5-2 раза (это чисто субъективная оценка - проверял одну из моих работ с .Net и RegExp и большим количеством условий) и плюс используются параллельные вычисления Excel.
По сравнению с RegExp в .Net есть очень удобные просмотры вперед и назад, именованные группы, больше привязок. При этом можно реализовать более сложные вычисления в других функциях - тут я представил стандартные с немножко расширенным функционалом под Excel.
Вот файл http://1drv.ms/1zJgCPu с примером работы - там выполнялся поиск адресов из одной таблицы с 6500 адресов в другой в которой >20000 адресов - проблема была в том, что синтаксис написания адресов был похож, но точно не соответствовал, что не давало использовать ПОИСПОЗ
Необходимо не только знать, но и уметь использовать это знание, ведь самые гениальные решения наиболее просты
Hugo При создании надстройки используется C# а также специальный мост который напичкан API функциями и COM объектом Excel, а они мало общего имеют с VBA и интерфейсами .Net, поскольку я только начал осваивать надстройки xll, я особо не волнуюсь за диапазоны.
Должен Вас поблагодарить, благодаря Вам я нашел направление движения по данному вопросу, выглядит это страшновато +)
Код
(ExcelDnaUtil.Application as dynamic).Intersect(FirstRange, AvailableRange).Rows.Count;
Наверно не все, но некоторые знают, что в VBA регулярные выражения поддерживаются за счет библиотеки Microsoft VBScript Regular Expressions 5.5 коротая, в свою очередь по сравнению с регулярными выражениями .Net (System.Text.RegularExpressions) имеет не такой большой набор возможностей. Учитывая что по Microsoft VBScript Regular Expressions 5.5 сложно найти пособия и информацию Я решил разнообразить Excel новыми функциями работающими с регулярными выражениями .Net.
Функции включены в надстройку C# Regex.xll (загружается как обычная надстройка xls) Всю информацию по написанию шаблонов (патернов) поиска можно найти в библиотеке msdn Надстройка содержит следующие UDF: RegexMatch(Текст, Шаблон поиска) - выполняет поиск в тексте и возвращает первое найденное соответствие шаблону поиска RegexMatches(Текст, Шаблон поиска, Разделитель) - выполняет поиск в тексте и возвращает все найденные соответствия шаблону поиска, разделенные Разделителем RegexReplace(Текст, Шаблон поиска, Шаблон замены) - выполняет поиск и замену частей текста соответствующих шаблону поиска на шаблон замены (или просто на текст) RegexReplacePlus(Текст, Шаблон поиска, Шаблон замены) - аналогичен RegexReplace, но в качестве Шаблонов Поиска и Замены выступают диапазоны ячеек, имеющих одинаковую размерность, при этом функция выполняет последовательную обработку текста по принципу: из диапазонов читаются (парно) ячейки с шаблонами Поиска и Замены соответствующие друг другу по позиции в массиве, выполняется обработка по типу RegexReplace полученное значение переходит к следующей итерации и все повторяется пока не закончатся значения из диапазонов.
Если кому интересно могу выложить более подробную информацию и примеры.
П.С. 1. в функциях не ограничены диапазоны по-этому вписывать в значения функций диапазоны D :D , E:E и т.п. не стоит т.к. функция все равно пройдет все ячейки, а их свыше 1 млн. для одной итерации. 2. В шаблонах для замены на пустоту необходимо использовать знак апострофа '
Давайте поступим, так - если у Вас есть разные формулировки со словом "blue" будем использовать регулярные выражения +) для этого необходимо описать синтаксис формулировок, а конкретнее пример: backpack-theone-blue имеет следующее описание - непрерывный текст (без пробелов) на латинице содержащий разделитель(и) в виде "-", слово "blue" может (или нет) содержаться в любой части этого текста, тогда вы можете использовать функцию типа:
Код
Function SimpleRegex(value As String) As String
SimpleRegex = rgxr(value, "([A-Za-z-]*blue[A-Za-z-]*)", "заменить на что то")
End Function
- такая формулировка избавит Вас от написания цвета дважды, а если постараться можно сделать словарь и цикл перебора значений из словаря, заменим слово "blue" в функции на значение из словаря - это сократит Ваш код и сделает его более понятным
Я не знаю, как работать с буфером обмена в VBA, если бы это был .Net я бы Вам рассказал - да и VBA это еще тот язык, гибкости очень мало, но зато во многих задачах это наиболее быстрый способ решения
Необходимо не только знать, но и уметь использовать это знание, ведь самые гениальные решения наиболее просты
Я бы рекомендовал сделать Вашу функцию не через название листа, а с помощью диапазонов, тогда и не надо будет отслеживать изменения и делать пересчет, попробуйте может Вам подойдет такой вариант (это не промвариант, но при нужной доработке будет хорошая функция)
Код
Function wyYY(n As Double, List_name As Range) As Double
Dim count(2, 80) As Double
Dim i As Integer
i = 2
Do While List_name.Cells(i, 1) <> ""
count(1, i - 1) = List_name.Cells(i, 1)
count(2, i - 1) = List_name.Cells(i, 2)
i = i + 1
Loop
i = 1
Do While count(1, i) <> 0
If n < count(1, i) Then
GoTo qqqq
End If
i = i + 1
Loop
qqqq:
wyYY = count(2, i - 1)
End Function
Необходимо не только знать, но и уметь использовать это знание, ведь самые гениальные решения наиболее просты
Spaunrus пишет: пожалуйста, как последнему идиоту распишете, что значит каждая строчка
Вы знаете, там ни чего сильно сложного, но вот регулярные выражения это целый макроязык который вот так в двух словах не опишеш. Например у Вас в макросе следующий патерн [-A-Z\d]{2,} он означает, что надо найти любой фрагмент текста содержащий (в любом порядке) от 2 и более символов (оператор {2,}) бозначенных в [] скобках (A-Z обозначает весь латинский алфавит), но у Вас там что то корявое написано \d (любая цифра от 0 до 9) не пишется в скобках.
Alexander88 дал достаточно удачное решение и главное простое
Вы таким образом можете чего лишнего удалить - сам работаю с адресами и таким вот образом не стал бы делать (есть опыт), при этом регулярки намного медленнее чем простые замены.
Необходимо не только знать, но и уметь использовать это знание, ведь самые гениальные решения наиболее просты
Игорь пишет: как в одной строке таблицы АРХИВ хранить несколько значений поля «программы подготовки»
это можно реализовать с помощью простого макроса, изменения принципов разметки документа в Ворде и дополнительной таблицы с видами программам подготовки
Необходимо не только знать, но и уметь использовать это знание, ведь самые гениальные решения наиболее просты
Вот файл - поменял патерны поиска и переименовал функцию - в желтых ячейках втавил для проверки результата, используйте аналогично В следующий раз описывайте условия задачи более точно !!!
Просто вставте весь код из моего сообщения в модуль, потом можете использовать формулу или сами создать цикл перебора ячеек в теле которого выполнять соответствующую функцию
П.С. К сожалению у Вас не для всех значений будет работать патерн реджекса т.к. судя по данным (ячейкам с данными в файле) Вы не уточнили полные условия задачи