Как я могу перекодировать это так, чтобы он мог циклически перебирать определенные листы в книге - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть макрос, который мне нужен для циклического перебора отдельных таблиц, но я собрал код на многих примерах, которые нашел в Интернете.Поэтому я не совсем уверен, где или как установить цикл, и я также уверен, что мне придется изменить способ настройки всего кода.У меня действительно нет никакого знания кодирования вообще.Meep.

Sub datatransfer()


Application.ScreenUpdating = False
Dim copySheet As Worksheet 

Dim pasteSheet As Worksheet

Set copySheet = Worksheets(ActiveSheet.Name)

Set pasteSheet = Worksheets("CMICIMPORT")

copySheet.Range("A100:AA124").Copy

pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues

Application.CutCopyMode = False

Application.ScreenUpdating = True

MsgBox "Data was copied over to the CMICIMPORT tab successfully", vbInformation, ActiveSheet.Name

Range("M4").Select

    With Selection.Font

        .Color = -11489280

        .TintAndShade = 0

    End With

End Sub

Я должен запустить приведенный выше код на каждом листе, на котором я сейчас работаю, в отличие от возможности запуска макроса, и он запускается на всех моих вкладках зарплаты.Кроме того, мои вкладки называются payroll (1), payroll (2) и т. Д. Через payroll (200), если это облегчает мне задачу.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019
Sub DataTransfer()
    Dim sht As Worksheet

    Application.ScreenUpdating = False
    For each sht in ThisWorkbook.Worksheets
        If Left(sht.Name, 7) = "payroll" Then DoIt sht
    Next
    Application.ScreenUpdating = True
End Sub


Sub DoIt(copySheet As Worksheet)
    copySheet.Range("A100:AA124").Copy

    Worksheets("CMICIMPORT").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues

    Application.CutCopyMode = False

    MsgBox "Data was copied over to the CMICIMPORT tab successfully", vbInformation, copySheet.Name

    With copySheet.Range("M4").Font
        .Color = -11489280
        .TintAndShade = 0
    End With

End Sub
0 голосов
/ 05 апреля 2019

Это быстрое и грязное решение , но все равно будет работать.

Начните с объявления листов, которые должны быть зациклены в Array(), называемом specificWorksheets.Если их действительно 200, то лучше создать какой-то цикл или прочитать их из таблиц настроек.В любом случае, это рабочая часть:

Sub TestMe()

    Dim specificWorksheets As Variant
    specificWorksheets = Array("payroll (3)", "payroll (1)", "payroll (2)")

    Dim wks As Worksheet

    For Each wks In ThisWorkbook.Worksheets
        If valueInArray(wks.Name, specificWorksheets) Then
            wks.Activate
            'Do your stuff, writing  before...
        End If
    Next

End Sub


Public Function valueInArray(myValue As Variant, myArray As Variant) As Boolean

    Dim cnt As Long

    For cnt = LBound(myArray) To UBound(myArray)
        If LCase(CStr(myValue)) = LCase(CStr(myArray(cnt))) Then
            valueInArray = True
            Exit Function
        End If
    Next cnt

End Function

На месте комментария 'Do your stuff скопируйте и вставьте свой код.

Почему это Быстро и грязно ?Главным образом из-за использования Activate и, следовательно, со ссылкой на активный лист.Как только вы поймете, как работает цикл for-each, лучше прочитать это - Как избежать использования Select в Excel VBA - и переписать ваш код.Существует причина, по которой это вторая по популярности тема в [vba] в StackOverflow.

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