![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 07.02.2010
Сообщений: 5
|
![]()
Здравствуйте, подскажите маленько, кому не лень.
Сами мы не местные и синтаксис VB знаем крайне хреново... ![]() Так вот. В теле функции объявляю массив(или это строка ![]() Код:
Сразу скажу - способ объявления где-то подглядел и на самом деле понятия не имею, как в VB объявляются массивы, а в справке этого найти не смог. В этой идиотской справке вообще фиг чего найдешь в час ночи. ![]() |
![]() |
![]() |
![]() |
#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 допустимы и в некоторых ситуациях могут быть вполне под- ходящим решением, но всегда, когда это возможно, лучше назначать массивам конкретный тип данных.
Анализ,обработка данных Недорого
|
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#4 |
Регистрация: 07.02.2010
Сообщений: 5
|
![]()
2doober: спасибо, конечно, но мимо.
![]() 2Aent: нда... слышал я звон, да не понял, где он. Хотя сразу, блин, больно странным показалось такое задание строчки шаблона, все в звездах да скобках. Правильно говорила мине мама: "Не пиши на незнакомом языке по ночам, сынок!". ![]() ![]() Эффективности ради, конечно, стоило бы набросать отдельную функцию на проверку "присутствия любого символа из множества", построенную на Case, но скорость значения не имеет, так что instr будет в самый раз, самый очевидный выход. ![]() |
![]() |
![]() |
![]() |
#5 |
Регистрация: 07.02.2010
Сообщений: 5
|
![]()
Блин, то ли лыжи не едут, то ли я е####й?!
![]() Почему может не работать вот этот кусок? (замена Mid на Mid$ ничего не меняет) Код:
Последний раз редактировалось BRcr; 10.02.2010 в 13:23. |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 05.12.2007
Сообщений: 4,180
|
![]()
Во-первых, ошибка в строке
Код:
Код:
В-третьих, замена Mid на Mid$ увеличивает быстродействие, т.к. в последнем случае функция работает без неявного преобразования аргумента в тип Variant.
Чем шире угол зрения, тем он тупее.
Последний раз редактировалось SAS888; 10.02.2010 в 13:51. |
![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 17.07.2009
Сообщений: 519
|
![]()
To BRcr:
Во первых непонятно зачем у функции лишние аргументы s2 и s3 ведь строки signs2 и signs3 вы в коде не используете. По существу: Вы идёте в цикле по i по символам входной строки (кстати копировать её совершенно не обязательно) и в теле цикла меняете длину этой строки и переменную цикла ![]() Если вы хотите получить строку s без i-го символа, то используйте код: Код:
Код:
Последний раз редактировалось Aent; 10.02.2010 в 15:59. |
![]() |
![]() |
![]() |
#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(..., ..., ...)
Чем шире угол зрения, тем он тупее.
|
![]() |
![]() |
![]() |
#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 |