Код VBA, который проходит не по всем листам - PullRequest
0 голосов
/ 17 сентября 2018

Пожалуйста, запросите помощь с моим кодом VBA.У меня есть мастер-лист, который содержит таблицу, в которой обобщены несколько проектов, где каждая строка содержит информацию об одном проекте.Затем у меня есть вкладки для каждого проекта, и код состоит в том, чтобы вытянуть информацию из мастер-листа в соответствующую вкладку.Для этого я перечислил имена проектов в первой строке таблицы в мастер-трекере и использовал то же имя для вкладки.Когда код перемещается от листа к листу, код читает имя листа и затем использует vlookup для извлечения информации из мастер-трекера на соответствующий лист.

Я получаю сообщение об ошибке «Моя следующая команда», в котором говорится, что у меня есть следующая команда «for».Пожалуйста помоги.У меня непостоянный опыт работы с VBA - недостаточно часто, чтобы быть опытным.

Sub Macro1()

'Run the API for every sheet in the workbook
Dim Sht As Worksheet
For Each Sht In ThisWorkbook.Worksheets

    'Look to see what the sheet is named and run the macro if it is not what is below
    If Sht.Name <> "Modified" And Sht.Name <> "Original" And Sht.Name <> "Master Tracker" Then
        Sht.Activate

'Looks for the tab name in the master sheet and copies the information from the corresponding row into the project tab


    Range("C2:N2").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,2,FALSE)"

    Range("C3:N3").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,3,FALSE)"

    Range("A9:D24").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,4,FALSE)"

    Range("F9:J24").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,5,FALSE)"

    Range("L9:N15").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,6,FALSE)"

    Range("L17:N24").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,7,FALSE)"

    Range("B4").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,8,FALSE)"

    Range("B5").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,9,FALSE)"

    Range("F4:I6").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,10,FALSE)"

    Range("K4").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,11,FALSE)"

    Range("K6").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,12,FALSE)"

    Range("N4").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,13,FALSE)"

    Range("N6").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,14,FALSE)"


Next

'activate the worksheet that was originally active
starting_ws.Activate


End Sub

'At the end of the program say it has all been updated

MsgBox ("Update Complete

1 Ответ

0 голосов
/ 17 сентября 2018

Добро пожаловать на SO.Давайте попробуем немного исправить ваш код:

Ваша главная проблема - пропущенный End if.Каждый раз, когда вы пишете код, обратите внимание, что в некоторых инструкциях есть start point и end point.Если вы не соблюдаете порядок, ваш код потерпит неудачу.Это происходит с некоторыми инструкциями, такими как For..Next, Do..Loop, If...End if и так далее.Я предлагаю вам поискать некоторые из них в Google, потому что есть миллионы веб-сайтов с помощью, например:

If ... Then ... Else Statement (Visual Basic)

Теперь по поводу вашего кода, просто совет.Старайтесь избегать использования Select, потому что это требует времени.Большинство свойств и методов объекта Range могут быть вызваны без их выбора.Просто пример:

Sub CODE_WITH_SELECT()
Range("B4").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,8,FALSE)"
End Sub

Sub CODE_WITHOUT_SELECT()
Range("B4").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,8,FALSE)"
End Sub

Обе сабвуферы будут работать точно так же, но вторая будет быстрее.

Пожалуйста, отметьте Как избежать использования Selectв Excel VBA

Теперь, если мы применим это к вашему коду, вероятно, я бы использовал:

Sub Macro1()

Application.ScreenUpdating = False 'this will turn off screen updating, so code will execute faster

'Run the API for every sheet in the workbook
Dim Sht As Worksheet
For Each Sht In ThisWorkbook.Worksheets

    'Look to see what the sheet is named and run the macro if it is not what is below
    If Sht.Name <> "Modified" And Sht.Name <> "Original" And Sht.Name <> "Master Tracker" Then
        Sht.Activate

        'Looks for the tab name in the master sheet and copies the information from the corresponding row into the project tab
        Range("C2:N2").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,2,FALSE)"

        Range("C3:N3").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,3,FALSE)"

        Range("A9:D24").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,4,FALSE)"

        Range("F9:J24").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,5,FALSE)"

        Range("L9:N15").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,6,FALSE)"

        Range("L17:N24").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,7,FALSE)"

        Range("B4").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,8,FALSE)"

        Range("B5").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,9,FALSE)"

        Range("F4:I6").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,10,FALSE)"

        Range("K4").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,11,FALSE)"

        Range("K6").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,12,FALSE)"

        Range("N4").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,13,FALSE)"

        Range("N6").FormulaR1C1 = "=VLOOKUP(MID(CELL(""filename"",R[-2]C[-15]),FIND(""]"",CELL(""filename"",R[-2]C[-15]))+1,255),'Master Tracker'!R2C1:R35C14,14,FALSE)"
    End If
Next Sht

'activate the worksheet that was originally active
starting_ws.Activate

'At the end of the program say it has all been updated
MsgBox "Update Complete"

Application.ScreenUpdating = True 'we activate again the screen updating
End Sub

Я добавил Application.ScreenUpdating = False для большей скорости.

Свойство Application.ScreenUpdating (Excel)

Проверьте это и сообщите нам свои мысли!:)

...