Страницы: 1
RSS
Как сделать аналог текстового Find(Search) в VBA?
 
Добрый день Уважаемые Эксперты.
С Новым годом всех Вас.

Будьте добры ответьте на вопрос.
Если поместить содержимое текстового файла в текстовую переменную
примерно следующим образом:
Код
Dim s As String
Open "C:\testfile.txt" For Input As #1
s = Input(LOF(1), 1)

Возможно ли впоследствии с помощью функции Find осуществить поиск по текстовой переменной,
при этом не выводя содержание самой переменной в рабочую область(ячейки) Excel?

Благодарю Вас.
Изменено: IgorBoot - 28.12.2017 01:53:10
 
Теме наверно лучше дать другое наименование. аналог текстового Find(Search) в VBA

в VBA есть аналог INSTR  
По вопросам из тем форума, личку не читаю.
 
Спасибо за ответ БМВ.
Как сменить название темы, я к сожалению не до конца понимаю.

Касаемо функции Instr, подскажите в случае ухода на ошибку
когда искомый текст в переменной отстутвует, оптимально ли использовать
конструкцию типа:
Код
If Not c Is Nothing Then   ' c - это искомое значение
Точнее в случае ухода на ошибку по причине отсутвия искомого текста, какую конструкцию оптимальнее использовать перед зацикливанием?
Цикл в данном случае я так понимаю бесконечный?
Изменено: IgorBoot - 28.12.2017 01:53:47
 
для "разбора" текста есть замечательный инструмент RegularExpression для поиска совпадений по шаблону
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
IgorBoot,  вы что делать то хотите? FIND в VBA тоже есть, но это метод и ищет на листе объект-ячейка по заданному критерию. Функция листа FIND - строковая, и в VBA её заменяет instr. Но порой более эффективно RegularExpression, как отметил Ігор Гончаренко,
По вопросам из тем форума, личку не читаю.
 
Что-то Вы все в кучу свалили.
Причем тут проверка на наличие ОБЪЕКТА (If Not c Is Nothing Then...), кода Вы ищите  СТРОКУ в строке?
Цитата
IgorBoot написал: Цикл в данном случае я так понимаю бесконечный?
А это вообще о чем?
Покажите в файле-примере (Правила, п.2.3) Как есть - Как надо
Согласие есть продукт при полном непротивлении сторон
 
Я не могу предоставить пример с макросом, поскольку еще пишу скелет. Текстовый файл, тоже особо смылса кидать нет.

Ситауция следующая, имеется текстовый файл, в который периодически идет поток данных, необходимо в определенное время(об OnTime Now  и TimeSerial я осведомлен)
проверять пришли ли данные. С этого этапа принципиально может быть 3 ситуации развития событий:
1) Данные пришли какие надо, следствие этого идем далее
2) Данные пришли но с ошибкой, следствие этого необходимо закомментировать строку
3) Данные не пришли., пока данные не пришли циклим ждем прихода....

у данных есть две характерных особенности у них есть порядковый номер, и у них есть скажем так "характерный номер обратной связи"
который фактически является булевой переменной: Есть ошибка/нет ошибки.

Прошу прощения, что в принципе не правильно объявил тему, и что не задал сути вопроса в заглавном посте,  до написания на форум, я был уверен в том что я ошибаюсь при работе с функцией .Find, и изначально предполагал, что тот нюанс который есть при работе с переменной у функции .Find который для более опытных товарищей очевиден, всплывет на поверхность.

Алгоритм такой :
1) открывай текстовый файл помещаем в переменную
2) в переменной ищем, наличие нового порядкового номера, если его нет закрываем файл, и открываем опять ( делаем это в цикле)
3) если он есть смотрим на "характерный номер обратной связи", если ошибка есть комментим строку с ошибкой закрываем файл,
   записываем ошибки в отдельный массив в Эксель ( грубо говоря в столбик)

Основное условие этого алгоритма пришли ли данные,

т.е. в итоге вопрос такой имеется
некая изначальная информация которую необходимо найти в текстовом файле, если использовать Instr

Это скелет в нем могут быть ошибки как грамматические в комментариях, так синтаксические в работе функции  Instr,
так и алгоритмические.
Код
Sub Poisk_txt()
Dim s, Poisk,  Nashli, Nashli//DC, Poisk//DC  As String
Dim Count_mistake As Integer ' Счетчик ошибок
Open "C:\testfile.txt" For Input As #1
s = Input(LOF(1), 1)         ' содержимое текстового файла в переменной строкового типа 
Poisk = "4//"                ' какой порядковый номер ищем
Poisk//DC = "4//DC//1//"     ' порядковый номер и характерный номер обратной связи БЕЗ ОШИБКИ который ищем
Nashli = Instr(s, Poisk, 1)  ' Непосредственно ищем, могу неправильно набрать, функция Instr похожа на ПоискПоз

'Do 
    If Nashli = Poisk Then  ' If-1
        Nashli//DC = Instr(s, Poisk//DC, 1)
        
        If Nashli//DC = Poisk//DC Then    '   If - 2
 ' 'это то что нужно, если значение IF = True то выходим из цикла
        Else: Cells(Count_mistake, 7) = Poisk         ' If - 2
            Count_mistake = Count_mistake + 1
            s = Replace(s, "4//", "*;4//")
            Print #1, s
            Close #1
            Open #1
        End If   ' If - 2
    Else    ' If -1
        Close #1
        Open  #1      
    End If  ' If- 1
'Loop
End Sub
Вопроса два если Instr или Find или Регулярные выражения ничего не найдут по заданному условию то будет ошибка
1) ошибку стоит проходить конструкцией On Error Resume Next? или другой?
2) и второй момент как оптимальнее зациклить, просто бесконечный цикл? или что то более функциональное?

Прошу меня извинить что в самом начале так все не расписал.
Благодарю еще раз всех Вас.
Изменено: IgorBoot - 28.12.2017 01:58:11
 
IgorBoot,  очень много всего и без особого толка
1)  Возвращаемые значения INSTR зачем сразу ошибка. С регулярными не совсем так, но примерно тоже.
2). не в этой теме.
По вопросам из тем форума, личку не читаю.
 
IgorBoot,
все что в Вашем макросе правильно - это строки с открытием файла и чтеем данных из него
все остальное - мимо кассы и однозначно очень далеко от ранее описанного алгоритма (практически никак не связано с ним)  
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,  ну что Вы право!  Написано -
Цитата
IgorBoot написал:
пишу скелет
и он в шкафу,
Изменено: БМВ - 27.12.2017 13:59:49
По вопросам из тем форума, личку не читаю.
 
Код
Sub Poisk_txt()
Dim s As String, Poisk As String, PoiskDC As String, filePath As String
Dim n As Long, Count_mistake As Long, t As Single, t1 As Single
t = 10 'сколько секунд крутиться в цикле надеясь на удачу
Count_mistake = 1       ' Счетчик ошибок
filePath = "C:\testfile.txt"
Poisk = "4//"           ' какой порядковый номер ищем
PoiskDC = "4//DC//1//"  ' порядковый номер и характерный номер обратной связи БЕЗ ОШИБКИ который ищем
t1 = Timer + t
Do
  Open filePath For Input As #1
  s = Input(LOF(1), 1)
  Close #1
  n = InStr(1, s, Poisk, 1)
  If n Then
    If InStr(n, s, PoiskDC, 1) Then Exit Do
    Cells(Count_mistake, 7) = Poisk
    Count_mistake = Count_mistake + 1
    s = Replace(s, Left(Poisk, 1), "*;" & Left(Poisk, 1) & "*")
    Open filePath For Output As #1
    Print #1, s
    Close #1
  End If
  DoEvents
Loop Until Timer > t1
End Sub
 
Огромное Вам Спасибо AAF. С новым годом и Вас.

Вы мне наглядно показали насколько важна аккуратность при кодировании.
Большое Вам Спасибо.
 
Цитата
IgorBoot написал:
Как сменить название темы, я к сожалению не до конца понимаю
Просто предложить прямо здесь - модераторы поменяют. И не нужно писать через 1-3 строки.  
 
IgorBoot, большая просьба: следите за своими сообщениями! Пару минут на проверку и крректировку своего сочинения... Не модераторы это должны делать, Вы сами.
Зачем между строками текста по 3-5 пустых строк? Зачем в коде пробел практически после каждой строки? Зачем рвать предложение, начиная его в одной строке, заканчиая в другой. Люди же читают это растянуто-рваное непонятночто!
Страницы: 1
Читают тему
Наверх