Поиск и удаление одной строки кода Excel VBA - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть таблица Excel, в которой есть несколько модулей с несколькими подпроцедурами. Один модуль имеет несколько процедур, а другой модуль вызывает каждую из этих процедур. Проблема в том, что список Call Subs будет отличаться. Я знаю, как добавить к приведенной ниже подпрограмме, но я не могу понять, как удалить строку, основываясь на том, что я ввожу в ячейку на листе. Процесс будет заключаться в том, чтобы ввести «Call TMS1707455» в ячейку, а затем запустить макрос, который удалит значение этой ячейки из нижеприведенного подпункта.

Sub TMS()

    Call TMS1707455
    Call TMS1367006
    Call TMS4268798
    Call TMS1366994
    Call TMS39522
    Call TMS39523
    Call TMS4482313
    Call TMS19395
    Call TMS39415
    Call TMS37118
End Sub

Или было бы лучше или возможно ввести этот список Call Subs в столбце рабочего листа. Затем я мог бы при необходимости изменить список и получить макрос, который будет вызывать все процедуры, основанные на столбце подпрограмм вызова. Таким образом, мне не нужно иметь макрос для добавления строк и макрос для удаления строк. Я просто не могу найти информацию о том, как это сделать.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Я понял, что мне нужно сделать. Приведенный ниже код удаляет одну строку моего макроса в зависимости от значения в ячейке. Я нашел ответ здесь: http://www.cpearson.com/excel/vbe.aspx Это может быть не красиво, но это работает.

    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule
    Dim FindWhat As String
    Dim SL As Long ' start line
    Dim EL As Long ' end line
    Dim SC As Long ' start column
    Dim EC As Long ' end column
    Dim Found As Boolean

    Set VBProj = ActiveWorkbook.VBProject
    Set VBComp = VBProj.VBComponents("Module2")
    Set CodeMod = VBComp.CodeModule

    FindWhat = [C21]

    With CodeMod
        SL = 7
        EL = .CountOfLines
        SC = 1
        EC = 255
        Found = .Find(target:=FindWhat, StartLine:=SL, StartColumn:=SC, _
            EndLine:=EL, EndColumn:=EC, _
            wholeword:=True, MatchCase:=False, patternsearch:=False)
        If Found = True Then
            .DeleteLines StartLine:=SL
        End If
    End With
0 голосов
/ 21 апреля 2020

Нечто подобное очень поможет вам, и я думаю, что этот пример демонстрирует множество принципов программирования, которые помогут вам писать более эффективный / управляемый / редактируемый код в будущем. Обратите внимание на комментарии.

Option Explicit

Sub TMS()

    cleanUp "TMS1707455"
    cleanUp "TMS1367006"
    '... etc
    'add / delete comment as needed

End Sub

Sub cleanUp(which As String)

    Dim findIt As String, changeTo As String

    Select Case which

        Case Is = "TMS1707455"
            findIt = "1707455(HSPD-12 Sponsor Certification Training)": changeTo = "HSPD-12 Sponsor Certification Training"
        Case Is = "TMS1367006"
            findIt = "1367006(VA Telework Training Module For Employees)": changeTo = "VA Telework Training Module For Employees"
        'Case Is = ' ... next in line '
        'delete cases as needed, or comment them out

    End Select

    Dim ws As Worksheet
    Set ws = Worksheets("mySheet") 'always explicitly declare and work directly with objects

    ws.Cells.Replace What:=findIt, Replacement:=changeTo
    'i would also suggest only working with the cells with actual data you need,
        'like the columnset or row set, it will speed up the code, especially using Replace

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...