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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2015, 15:35   #1
who
Пользователь
 
Регистрация: 11.09.2014
Сообщений: 44
По умолчанию Поиск номера строки содержащего заданный текст в коде VBA проекта

Есть у меня такой код в проекте:
Код:
Sub udalcod()
b = "Private Sub CommandButton1_Click()"
 l = ThisWorkbook.VBProject.VBComponents("Лист01"). _
    CodeModule.Find(b, 1, 1, 1000, 150, False, False, False)
End Sub
результатом которого является "True" или "False", в зависимости от наличия совпадений.
Как мне получить номер строки с первым совпадением
who вне форума Ответить с цитированием
Старый 25.11.2015, 16:15   #2
who
Пользователь
 
Регистрация: 11.09.2014
Сообщений: 44
По умолчанию

Решил сам. Спасибо, если пытались помочь...
who вне форума Ответить с цитированием
Старый 25.11.2015, 17:04   #3
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

Как решил? Может кому-то пригодится?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 25.11.2015, 18:45   #4
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

Мне тоже интересно ... неужели нашёлся человек, который прочёл справку, где говорится, что четвёртый аргумент это, цитирую

Цитата:
Переменная типа Long, указывающая номер последней строки совпадающего с образцом текста (если он найден).
Код:
Private Sub Test()
    Dim iText$, iLine&
    iText = "Private Sub CommandButton1_Click()"
    
    If ThisWorkbook.VBProject.VBComponents("Лист01"). _
       CodeModule.Find(iText, 1, 1, iLine, 1) Then
       MsgBox "Искомый текст нашёлся в строке #" & iLine
    End If
End Sub
pashulka вне форума Ответить с цитированием
Старый 26.11.2015, 08:35   #5
who
Пользователь
 
Регистрация: 11.09.2014
Сообщений: 44
По умолчанию

моё решение такое:
Код:
Sub udalcod(i)
Dim linedel As Long
lcount = ThisWorkbook.VBProject.VBComponents("Лист01").CodeModule.CountOfLines
b = "Private Sub CommandButtonI_" & i - 2 & "_Click()"
    For linedel = 1 To lcount
        findtext = ThisWorkbook.VBProject.VBComponents("Лист01").CodeModule.Find _
                   (b, linedel, 1, linedel, 1000, False, False, False)
        If findtext = True Then
            MsgBox linedel
            ThisWorkbook.VBProject.VBComponents("Лист01").CodeModule.DeleteLines linedel, 4
            Exit For
        End If
    Next linedel
End Sub
ну справку я прочесть не успел, а по всплываючей подсказке в редакторе предположил, что 4-й аргумент -- это номер последней строки поиска
Код:
find(Target As String, StartLine As long, StartColumn As long, EndLine As long, EndColumn As long, [WholeWord As Boolean], [MathCase As Boolean], [PatternSeach As Boolean]) As Boolean
и ещё я не совсем понимаю что значат символы & и $ в описаниях переменных, а точнее совсем не понимаю (я в VBA самоучка, программирование учил в универе только на Delphi, да и то не углублено... и применяю VBA по жизненной необходимости на работе для себя)

Последний раз редактировалось who; 26.11.2015 в 08:56.
who вне форума Ответить с цитированием
Старый 26.11.2015, 11:24   #6
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

Цитата из справки

Цитата:
Тип данных String. Символом описания типа для типа String служит символ доллара $

Тип данных Long. Символом описания типа для типа Long служит символ &
pashulka вне форума Ответить с цитированием
Старый 26.11.2015, 11:45   #7
who
Пользователь
 
Регистрация: 11.09.2014
Сообщений: 44
По умолчанию

Спасибо, понятненько теперь...
who вне форума Ответить с цитированием
Старый 26.11.2015, 15:17   #8
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

Who, Обратите внимание на то, что в своём решении Вы осуществляете поиск построчно, что можно осуществить и без метода .Find

Код:
Private Sub FindCodeInLine()
    Dim iText$, iCount&
    
    iText = "Private Sub CommandButton1_Click()"
    With ThisWorkbook.VBProject.VBComponents("Лист01").CodeModule
         For iCount = 1 To .CountOfLines
             If InStr(1, .Lines(iCount, 1), iText, vbTextCompare) Then
                .DeleteLines iCount, 4: Exit For
             End If
         Next
    End With
End Sub
Правда все вышеопубликованные варианты могут найти, например, 'Комментарий к PRIVATE Sub CommandButton1_Click() , что не шибко соответствует поставленной задаче, поэтому при построчном сравнении можно замутить что-то вроде этого :

Код:
Private Sub FindCodeInLine2()
    Dim iText$, iCount&
    
    iText = "Private Sub CommandButton1_Click()" & "*"
    With ThisWorkbook.VBProject.VBComponents("Лист01").CodeModule
         For iCount = 1 To .CountOfLines
             If Trim(.Lines(iCount, 1)) Like iText Then
                .DeleteLines iCount, 4: Exit For
             End If
         Next
    End With
End Sub
или

Код:
Private Sub FindCodeInLine2()
    Dim iText$, iCount&
    
    iText = "Private Sub CommandButton1_Click()"
    With ThisWorkbook.VBProject.VBComponents("Лист01").CodeModule
         For iCount = 1 To .CountOfLines
             If InStr(1, Trim(.Lines(iCount, 1)), iText, 1) = 1 Then
                .DeleteLines iCount, 4: Exit For
             End If
         Next
    End With
End Sub
pashulka вне форума Ответить с цитированием
Старый 26.11.2015, 15:34   #9
who
Пользователь
 
Регистрация: 11.09.2014
Сообщений: 44
По умолчанию

Спасибо за подсказку. Очень может быть, что в ином случае найдётся и другое совпадение, но в моём случае код ищется для удаления строк созданных кодом и комментов там не будет, а если комменты и будут, сомневаюсь, что я буду описывать целиком имя процедуры (или как оно там правильно называется)
Цитата:
В моём проекте программно посредством VBA копируется при необходимости один из листов (в моём случае не первый и второй, но это отношения к делу не имеет) со всем содержимым, при этом на первом листе дублируется кнопка и на неё добавляется кусок кода (суть моего топика), тоже посредством VBA.
Также этот лист, при необходимости, программно удаляется и созданная при его создании кнопка с первого листа тоже удаляется (ну так надо мне!).
Так вот нужно удалить код подвешенный на скопированную кнопку листа1, что-бы в дальнейшем при копировании кнопки вновь не появлялось дубликатов кода и чтобы в конце-концов код не засорялся
Т.е. в моём случае вряд ли будет повтор искомого текста.
Как-то так...
who вне форума Ответить с цитированием
Старый 26.11.2015, 16:01   #10
pashulka
Форумчанин
 
Регистрация: 03.11.2006
Сообщений: 524
По умолчанию

Не нравится такой комментарий, возьмите другой случай - когда комментируется и оставляется весь предыдущий вариант.

Код:
'Private Sub CommandButton1_Click()
'    CommandButton1.BackColor = vbRed
'    CommandButton1.ForeColor = vbWhite
'End Sub

Private Sub CommandButton1_Click()
    MsgBox "Такой вариант нам подходит"

End Sub
А вообще, основной смысл поста был в другом.
pashulka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как Вы отслеживаете,когда и что (какие строки) поменяли в коде VBA? @лeся Microsoft Office Word 9 11.04.2012 10:51
в символьной матрице найдите номер первого по порядку столбца, содержащего наименьшее число пробелов - Ошибка в коде (Delphi) Начинающий програм Помощь студентам 2 04.04.2012 14:41
Заменить отрицательные элементы суммой номера столбца и номера строки, в которых они находятся gylayko Помощь студентам 5 31.03.2012 18:20
переход на заданный сайт или как вставить в заданное место заданный текст Biker89 Общие вопросы Delphi 23 29.05.2011 01:59
Поиск номера положительной строки матрицы J0n1cK Паскаль, Turbo Pascal, PascalABC.NET 0 14.05.2009 00:56