|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
09.02.2010, 23:37 | #1 |
Регистрация: 07.02.2010
Сообщений: 5
|
Запарка со сравнением текста
Здравствуйте, подскажите маленько, кому не лень.
Сами мы не местные и синтаксис VB знаем крайне хреново... Так вот. В теле функции объявляю массив(или это строка ) следующего вида: Код:
Сразу скажу - способ объявления где-то подглядел и на самом деле понятия не имею, как в VB объявляются массивы, а в справке этого найти не смог. В этой идиотской справке вообще фиг чего найдешь в час ночи. |
10.02.2010, 02:31 | #2 |
Старожил
Регистрация: 02.05.2009
Сообщений: 3,907
|
Время больше часу ночи
Стив Каммингс VBA для чайников Объявление массивов Как и обычные переменные, массивы должны быть объявленными. При этом объявление массива по форме отличается от объявления переменной только в одной дополнительной де- тали. Вот несколько примеров: ' Объявление одномерного массива данных типа Date: Dim datTimeOfImpact (cdatMaxObservations) As Date ' Объязление массива типа Currency без объявления размера: Public curPriceQuotes () As Currency 1 Объязление четырехмерного массива типа I n t e g e r : Dim intArrayOflntegers (34, 13, 29, 4) As Integer Как видите, разница объявлений для обычных переменных и массивов заключается в том, что в объявлении массива за именем следуют скобки, в которых может не содержаться ниче- го, а могут содержаться значения, задающие размеры массива по каждому из его измерений. (Обратите внимание, что в первом из вышеприведенных примеров размер одномерного мас- сива задается именованной константой.) Не забудьте при объявлении массива указать тип данных, включив в объявление массива As Type с подходящим ключевым словом, задающим тип. Если не ука- зать тип, VBA создаст массив типа V a r i a n t , в результате чего требования ва- шей программы к памяти возрастут, а ее выполнение замедлится. Массивы дан- ных типа V a r i a n t допустимы и в некоторых ситуациях могут быть вполне под- ходящим решением, но всегда, когда это возможно, лучше назначать массивам конкретный тип данных.
Анализ,обработка данных Недорого
|
10.02.2010, 02:35 | #3 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
Начнём с того что Like не функция а оператор.
Если бы вы навели на него курсор и нажали F1 то узнали бы что он имеет синтаксис: логический результат = строка Like шаблон В шаблоне же символы [?#* являются специальными и при употреблении в группе [... ] должны быть заключены в квадратные скобки. Пара квадратных скобок означает что соответствующее знакоместо будет сопоставляться с любым символом из находящихся внутри скобок [.,;:] сопоставится с любым из перечисленных в скобках символом. [!.,;:] - c любым символом отличным от . , ; : [A-Z] - c любым символом от A до Z ### - c любыми тремя цифрами * - с любым набором символов [] - cопоставляется с пустой строкой. Правая квадратная скобка ] не может присутствовать в качестве одного из символов группы. Если задача состоит в том что бы узнать присутствует ли в строке какая либо скобка - нужно воспользоваться не like а объектом RegExp (примеры есть на этом форуме) или кодом вроде: Код:
Код:
Правая квадратная скобка во втором шаблоне не начинает группу и поэтому не нуждается в экранировании. Последний шаблон сопоставится с любой строкой содержащей один из символов: "{", "}", "(", ")". Однако, приведённый выше код не будет самым эффективным. К сожалению в чистом VB (VBA) нет функции или оператора проверяющего присутствие любого символа из множества. Но можно написать: Код:
Вместо использования функции Instr в цикле можно воспользоваться оператором Select Код:
Последний раз редактировалось Aent; 10.02.2010 в 03:33. |
10.02.2010, 11:31 | #4 |
Регистрация: 07.02.2010
Сообщений: 5
|
2doober: спасибо, конечно, но мимо.
2Aent: нда... слышал я звон, да не понял, где он. Хотя сразу, блин, больно странным показалось такое задание строчки шаблона, все в звездах да скобках. Правильно говорила мине мама: "Не пиши на незнакомом языке по ночам, сынок!". Спасибо вам огромное за не менее огромное количество вариантов! Я бы ерундой не маялся, написал бы все на С++ и ходил довольным, но не для себя - для Народа стараюсь. А народ с excel'ем гораздо лучше дружит, нежели с С++. Эффективности ради, конечно, стоило бы набросать отдельную функцию на проверку "присутствия любого символа из множества", построенную на Case, но скорость значения не имеет, так что instr будет в самый раз, самый очевидный выход. |
10.02.2010, 13:17 | #5 |
Регистрация: 07.02.2010
Сообщений: 5
|
Блин, то ли лыжи не едут, то ли я е####й?!
Почему может не работать вот этот кусок? (замена Mid на Mid$ ничего не меняет) Код:
Последний раз редактировалось BRcr; 10.02.2010 в 13:23. |
10.02.2010, 13:42 | #6 |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
Во-первых, ошибка в строке
Код:
Код:
В-третьих, замена Mid на Mid$ увеличивает быстродействие, т.к. в последнем случае функция работает без неявного преобразования аргумента в тип Variant.
Чем шире угол зрения, тем он тупее.
Последний раз редактировалось SAS888; 10.02.2010 в 13:51. |
10.02.2010, 15:17 | #7 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
Вот простая функция для замены группы символов на подстроку (в частном случае на пустую)
Код:
Код:
MultiChrReplace("a+b-c*d","+-*","") = "abcd" , но MultiChrReplace("a+b-c*d","+-*","",True) = "+-*" MultiChrReplace("a+b-c*d","+-*","_",Inv:=True) = "_+_-_*_" Последний раз редактировалось Aent; 10.02.2010 в 16:33. |
10.02.2010, 15:55 | #8 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
To BRcr:
Во первых непонятно зачем у функции лишние аргументы s2 и s3 ведь строки signs2 и signs3 вы в коде не используете. По существу: Вы идёте в цикле по i по символам входной строки (кстати копировать её совершенно не обязательно) и в теле цикла меняете длину этой строки и переменную цикла Если вы хотите получить строку s без i-го символа, то используйте код: Код:
Код:
Последний раз редактировалось Aent; 10.02.2010 в 15:59. |
11.02.2010, 07:49 | #9 |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
To Aent:
1. На сколько я понял, аргументы s2 и s3 содержатся в функции для того, чтобы указывать, какой набор символов (signs1, signs2, signs3, или их комбинацию) требуется заменять. Не случайно в коде есть строка If s1 Then... Естественно, что в функцию требуется добавить If s2 Then... и If s3 Then... 2. Стандартная функция Replace понимает спец. символы. А т.к. в наборе символов для замены они присутствуют, то для того, чтобы не случилось некорректной замены, я предлагаю использовать стандартную функцию рабочего листа Excel Application.Substitute(..., ..., ...)
Чем шире угол зрения, тем он тупее.
|
11.02.2010, 13:37 | #10 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
To SAS888:
1. О задумке автора я догадывался Но в приведённом примере функции FilterTName s2 и s3 не используются... 2. Стандартная функция VBA Replace НЕ понимает спецсимволов. Что очень жаль. Но вы упорствуете в заблуждении (http://programmersforum.ru/showpost....74&postcount=2) По всей видимости, вы путаете функцию replace с методом. Последний раз редактировалось Aent; 11.02.2010 в 13:49. |
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Расшифровка текста. | Michelin | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 6 | 10.01.2010 21:19 |
Форматирование текста. | Altera | Общие вопросы Delphi | 3 | 11.05.2009 23:29 |
Не могу разобраться с сравнением 2-х двумерных масивов на совпадения текста | tj_pablo | Общие вопросы C/C++ | 0 | 11.03.2009 22:21 |
Обработка текста | Absent | Помощь студентам | 2 | 20.05.2008 23:17 |
Вставка текста | Pedro | Общие вопросы Delphi | 4 | 27.01.2008 10:27 |