Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2011, 01:50   #1
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию сформировать массив и получить из него данные по фильтру

преамбула:
есть данные, которые попадают в переменную string в следующем виде:
|Подшипник1|200|А11|
|Подшипник2|300|А12|
|Подшипник3|400|А13|
|Подшипник4|500|А14|
|Подшипник5|600|А15|
|Подшипник6|700|А16|
|Подшипник7|800|А17|

задача например - для Подшипник5 найти значение 2 и 3 столбца.
я эту таблицу записываю на лист, через цикл Do-Loop While нахожу колво строк и циклом For-Next в этом количестве строк нахожу строку с "Подшипник5", соответственно, определяю по этой строке значения 2 и 3 столбцов.

однако возник вопрос - возможно ли тот же самый результат (значения 2 и 3 столбца) получить без вывода таблицы данных на лист, а сформировав виртуально массив 7 строк х 3 столбца и из него получить необходимые данные?
при этом количество строк заранее неизвестно, а известны количество столбцов и фильтр по первому столбцу.
и, если такое возможно, подскажите, пожалуйста, хотя бы в общих чертах, как победить такой массив.
спасибо )
gramp вне форума Ответить с цитированием
Старый 09.04.2011, 02:45   #2
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Если яправильно все понял

Код:
Private Sub CommandButton1_Click()
ssl = "|Подшипник1|200|А11|" + _
"|Подшипник2|300|А12|" + _
"|Подшипник3|400|А13|" + _
"|Подшипник4|500|А14|" + _
"|Подшипник5|600|А15|" + _
"|Подшипник6|700|А16|" + _
"|Подшипник7|800|А17|"
gg = N_Dogov(ssl, "Подшипник5")

End Sub

Function N_Dogov(s, S1)
  bRes = False

  Set RegExp = CreateObject("VBScript.RegExp")
  RegExp.Global = False
    RegExp.IgnoreCase = True

     RegExp.Pattern = "\" & S1 & "\|+\d{0,}\|[^\w{0,}$]+\d{0,}"
  
    bRes = RegExp.Test(s)
        If bRes Then
        ReDim Rez(1)
            Set oMatches = RegExp.Execute(s)
            Set oMatch = oMatches(0)
            Rz = Split(oMatch.Value, "|", -1)
            Rez(0) = Rz(1)
            Rez(1) = Rz(2)
        N_Dogov = Rez
        Set RegExp = Nothing
         Exit Function
        End If
           
End Function
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 09.04.2011, 03:16   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub ПопрощеСделатьРазвеНельзя()
    Текст$ = "|Подшипник1|200|А11|" + _
             "|Подшипник2|300|А12|" + _
             "|Подшипник3|400|А13|" + _
             "|Подшипник4|500|А14|" + _
             "|Подшипник5|600|А15|" + _
             "|Подшипник6|700|А16|" + _
             "|Подшипник7|800|А17|"

    ИскомаяПозиция$ = "Подшипник5"

    ' производим поиск, и выводим результаты
    txt = Split(Текст$, "|" & ИскомаяПозиция$ & "|")(1)

    Столбец2 = Split(txt, "|")(0) ' =600
    Столбец3 = Split(txt, "|")(1) ' =А15

    Debug.Print Столбец2, Столбец3
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 09.04.2011, 18:03   #4
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Код:
RegExp.Pattern = "\" & S1 & "\|+\d{0,}\|[^\w{0,}$]+\d{0,}"
Сергей, для чего первый слэш в шаблоне?
У меня так получилось:
Код:
.Pattern = S1 & "\|[0-9]*\|[а-я]+[0-9]*"
nilem вне форума Ответить с цитированием
Старый 09.04.2011, 18:45   #5
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Николай,я знаю,он лишний.
В студии прекрасно работает .
В excele почему то не желает.Глюки у меня с RegExp иногда наблюдаются
Анализ,обработка данных Недорого

Последний раз редактировалось doober; 09.04.2011 в 18:50.
doober вне форума Ответить с цитированием
Старый 09.04.2011, 20:36   #6
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Код:
Sub ПопрощеСделатьРазвеНельзя()
    Текст$ = "|Подшипник1|200|А11|" + _
             "|Подшипник2|300|А12|" + _
             "|Подшипник3|400|А13|" + _
             "|Подшипник4|500|А14|" + _
             "|Подшипник5|600|А15|" + _
             "|Подшипник6|700|А16|" + _
             "|Подшипник7|800|А17|"

    ИскомаяПозиция$ = "Подшипник5"

    ' производим поиск, и выводим результаты
    txt = Split(Текст$, "|" & ИскомаяПозиция$ & "|")(1)

    Столбец2 = Split(txt, "|")(0) ' =600
    Столбец3 = Split(txt, "|")(1) ' =А15

    Debug.Print Столбец2, Столбец3
End Sub
EducatedFool, СПАСИБО, реально очень простой и понятный код
работает хорошо )
gramp вне форума Ответить с цитированием
Старый 09.04.2011, 20:37   #7
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

doober, Вам тоже СПАСИБО
Ваш код еще не пробовал, но буду разбираться для понимания VBA
gramp вне форума Ответить с цитированием
Старый 09.04.2011, 23:29   #8
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

и еще вопрос - а если надо сделать выборку по двум параметрам?
например, начальные данные такие:
|Подшипник1|200|А11|
|Подшипник2|300|А12|
|Подшипник3|400|А13|
|Подшипник4|500|А14|
|Подшипник5|600|А15|
|Подшипник5|700|А16|
|Подшипник7|700|А17|

то есть получить А16, отобранное по Подшипник5 и 700, при этом Подшипник5 и 700 находятся в двух строчках.
такое возможно ли?
gramp вне форума Ответить с цитированием
Старый 09.04.2011, 23:49   #9
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub АСамиНеПробовалиПеределатьМакрос()
    Текст$ = "|Подшипник1|200|А11|" + _
             "|Подшипник2|300|А12|" + _
             "|Подшипник3|400|А13|" + _
             "|Подшипник4|500|А14|" + _
             "|Подшипник5|600|А15|" + _
             "|Подшипник6|700|А16|" + _
             "|Подшипник7|800|А17|"

    ИскомаяПозиция$ = "Подшипник5"
    Параметр2 = 600

    On Error Resume Next: Err.Clear
    Результат = Split(Split(Текст$, "|" & ИскомаяПозиция$ & "|" & Параметр2 & "|")(1), "|")(0)
    If Err Then Debug.Print "Такая комбинация значений не найдена!"

    Debug.Print Результат
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 10.04.2011, 01:17   #10
gramp
Пользователь
 
Регистрация: 26.12.2010
Сообщений: 85
По умолчанию

СПАСИБО
учусь, но только просто читать букварь прет трудно, а на примерах получается быстрее
gramp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ПОЛУЧИТЬ И УСТАНОВИТЬ ЗНАЧЕНИЕ ИЗ EDIT И В НЕГО Dimarik Win Api 2 26.03.2011 16:02
Как перехватить данные, которые отправляет на сервер и получает от него? losticsx Помощь студентам 2 21.08.2010 18:23
c++.данные сформировать в массив. dafi Помощь студентам 1 12.05.2010 06:38
DBLookupComboBox1 как в него записать данные Kuchiki Byakuya БД в Delphi 14 18.04.2010 12:23
Получить вектор Y, записывая в него последовательно все компоненты исходного вектора Bastion Помощь студентам 0 14.01.2010 20:27