Страницы: 1
RSS
квадратные скобки в Like VBA
 
Всем привет.
Есть массив данных вида 0-0 [0-0] 1-1 [*1-1] -( именно строкой в ячейке)
Хочу с помощью оператора LIKE отобрать [0-0]  [*1-1], но и [ и * являются служебными в вба.
как задать маску типа [*] ?
Если написать LIKE "[*]" , то не выдает ни одной записи.
Хотя я думал что должно бы выдать все.
Изменено: Dima S - 17.01.2014 19:58:37
 
Квадратные скобки знак вычисления. И если они в кавычках - то это тупо текст. И при таком виде: "[*]" Like отберет строку, если она начинается на квадратную открывающую скобку и заканчивается зазкрывающей. И неважно какой внутри текст.
Так что для подобных целей исползьуйте регулярные выражения.

Кстати, что значат выражения: [1-1] и [0-0]? Что они по-Вашему должны отобрать? В таком виде в квадратных скобках это означает диапазон от 1 до 1 и от 0 до 0. Т.е. равносильно нулю и единице без всяких скобок.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
И при таком виде: "[*]" Like отберет строку, если она начинается на квадратную открывающую скобку и заканчивается зазкрывающей
Вот и я так думал, а не тут то было - оказывается (я не знал) в квадратных скобках для LIKE указывется перечень символов для совпадения.

Цитата
Кстати, что значит выражение: [1-1]? Что оно по-Вашему должно отобрать?
это не выражение - это содержимое текстовой строки.
мне нужно выбрать из нее группы цифр в квадратных скобках.
 
по ходу решил методом тыка)

Код
Like "*[[]*-*[]]*"
 
Я чего-то запутался, что Вы и где указываете и что надо найти. Видимо, пятница.
Вы хотите отобрать выражение, именно как в ячейке? Или там могут быть любые цифры?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Есть ячейка в которой текстовая строка типа
0-0 [0-0] 1-1 [1-1*] 0-1 [0-2] [*1-1] [*1-2] 1-1 [2-0] 1-1 [*2-1]
груп много, числа разные. группы разделены пробелом
мне из нее нужно сделать массив из элементов в квадратных скобках.
То есть надо получить массив:
[0-0]
[1-1*]
[0-2]
[*1-1]
[*1-2]
[2-0]
[*2-1]
Изменено: Dima S - 17.01.2014 20:44:06
 
Код
Sub t()
  s = "0-0 [0-0] 1-1 [1-1*] 0-1 [0-2] [*1-1] [*1-2] 1-1 [2-0] 1-1 [*2-1]"
  x = Split(s, "[")
  If Not InStr(x(0), "]") Then k = 1: x(0) = ""
  For i = k To UBound(x)
    x(i) = Left(x(i), InStr(x(i), "]") - 1)
  Next
  [a1].Resize(, UBound(x) + 1) = x
End Sub
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Код
Sub t2()
  s = "0-0 [0-0] 1-1 [1-1*] 0-1 [0-2] [*1-1] [*1-2] 1-1 [2-0] 1-1 [*2-1]"
  With CreateObject("vbscript.regexp")
    .Global = True: .Pattern = "\[.*?\]": Set m = .Execute(s)
  End With
  If m.Count Then For i = 0 To m.Count - 1: Cells(2, i + 1) = m(i): Next
End Sub
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Тоже со Split, но несколько иначе(паразититровал на коде ikki):
Код
Sub t()
 Dim s As String, x, i As Long, avRes(), li As Long
 s = "0-0 [0-0] 1-1 [1-1*] 0-1 [0-2] [*1-1] [*1-2] 1-1 [2-0] 1-1 [*2-1]"
 x = Split(s, " ")
 For i = LBound(x) To UBound(x)
 If Left(x(i), 1) = "[" Then
 ReDim Preserve avRes(li): avRes(li) = x(i): li = li + 1
 End If
 Next
 [a1].Resize(, UBound(avRes) + 1) = avRes
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Если не ошибаюсь можно в коде еще использовать что-то типа chr(91)&"текст"&chr(93)
 
Спасибо всем, кто откликнулся.
Использовал варианты
Код
Like "*[[]*-*[]]*" 
и 
Left(x(i), 1) = "["
они по ходу самые шустрые.
 
Цитата
The_Prist написал: [a1].Resize(, UBound(avRes) + 1) = avRes
Подскажите, что значит в начале строки выражение в скобках [a1]? Какой она несет смысл?
И зачем используется в данном примере Resize?
 
[A1]  короткая форма выражения Range("A1")
Resize - расширение диапазона для выгрузки в него данных из массива
Изменено: New - 29.12.2020 17:17:27
 
[a1]. cells(1), cells(1,1), Range("a1") - это все варианты обращения к ячейке А1, очевидно что [a1] самый короткий из указанных
Resize нужен для того что массив avRes был помещен в диапазон ячеек соотв. размера
если написать
[a1] = avRes
в ячейку А1 будет помещен первый элемент массива avRes
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
New: [A1] короткая форма выражения Range("A1")
нет. Это короткая форма записи функции Evaluate("a1")
К теме, тем не менее, по-прежнему не имеет никакого отношения
Изменено: Jack Famous - 29.12.2020 17:23:27
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Ігор Гончаренко написал: [a1]. cells(1), cells(1,1), Range("a1")
Спасибо!
Страницы: 1
Читают тему
Наверх