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

#excel #vba

#excel #vba

Вопрос:

Я работаю над макрокомандой, которая копирует каждый лист и сохраняет его как отдельную книгу, но в какой-то момент в макрокоманде мне нужно очистить пару ячеек в строке Z, а затем отфильтровать столбец Z, чтобы удалить нули. Я очень новичок в VBA, поэтому, пожалуйста, извините за уродливый код.

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

Я часами искал другие сообщения и до сих пор не могу понять это. Любая помощь приветствуется.

     Dim FileExtStr As String
    Dim FileFormatNum As Long
    Dim Sourcewb As Workbook
    Dim Destwb As Workbook
    Dim sh As Worksheet
    Set sh = Sheets("Table of Contents")
    Dim DateString As String
    Dim FolderName As String
    Dim filterRow As Integer




    With Application
        .ScreenUpdating = False
        .EnableEvents = False
        .Calculation = xlCalculationManual
    End With


    Set Sourcewb = ActiveWorkbook
    Set sh = ActiveSheet

    'Create new folder to save the new files in
    DateString = Format(Now, "yyyy-mm-dd hh-mm-ss")
    FolderName = Sourcewb.Path amp; "" amp; "Department Expenses - Split"
    MkDir FolderName

    'Copy every visible sheet to a new workbook
    For Each sh In Sourcewb.Worksheets
        filterRow = sh.Range("Z" amp; Rows.Count).End(x1Up).Row 'This is the line giving me problems
        ActiveSheet.Next.Select
        Range("Z9").Select
        Selection.ClearContents
        Range("Z12").Select
        Selection.ClearContents
        Range("Z14").Select
        Selection.ClearContents
        Range("Z77").Select
        Selection.ClearContents
        Range("Z100").Select
        Selection.ClearContents
        sh.Range(filterRow).AutoFilter Field:=26, Criteria1:="<>0"
 

Комментарии:

1. Не существует такой вещи, как x1Up — Вы ищете xlUp

Ответ №1:

Вы можете попробовать что-то вроде этого: сначала откройте книгу в папке, в которую вы хотите скопировать листы, а затем выполните редактирование и фильтрацию после сохранения каждого листа в той же папке, в которой вы открываете книгу. Вы получали сообщение об ошибке, потому что вы не соответствовали Rows.Count требованиям sh.Rows.Count , чтобы оно знало, с какого листа оно считается.

     Sub CopySheetsToNewWorkbook()

    Dim xPath As String
    Dim xWs As Worksheet
    Dim filterRow As Integer
    Dim questionBoxPopUp As VbMsgBoxResult

     questionBoxPopUp = MsgBox("Are you sure you want to copy each worksheets as a new workbook in the current folder?", vbQuestion   vbYesNo   vbDefaultButton1, "Copy Worksheets?")
        If questionBoxPopUp = vbNo Then Exit Sub

    On Error GoTo ErrorHandler
    xPath = Application.ActiveWorkbook.Path

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

   For Each sh In Sourcewb.Worksheets
        filterRow = sh.Range("Z" amp; sh.Rows.Count).End(xlUp).Row 'not too sure why you need this
        ActiveSheet.Next.Select
        Range("Z9").Select
        Selection.ClearContents
        Range("Z12").Select
        Selection.ClearContents
        Range("Z14").Select
        Selection.ClearContents
        Range("Z77").Select
        Selection.ClearContents
        Range("Z100").Select
        Selection.ClearContents
        sh.Range("Z" amp; filterRow).AutoFilter Field:=26, Criteria1:="<>0" 'Change column "Z" to suit your needs. I think you need jut the header range to filter it.

    For Each xWs In ActiveWorkbook.Sheets
        xWs.Copy
        Application.ActiveWorkbook.SaveAs filename:=xPath amp; "" amp; xWs.Name amp; ".xlsx"
        Application.ActiveWorkbook.Close False
    Next xWs

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

    MsgBox "Process completed!", vbInformation

     Exit Sub '<--- exit here if no error occured
    ErrorHandler:
    Application.DisplayAlerts = True
        Application.ScreenUpdating = True
        Debug.Print Err.Number; Err.Description
            MsgBox "Sorry, an error occured." amp; vbNewLine amp; vbNewLine amp; vbCrLf amp; Err.Number amp; " " amp; Err.Description, vbCritical, "Error!"

    End Sub
 

Комментарии:

1. Спасибо, что ответили на мой вопрос, я многому научился, просто прочитав то, что вы собрали. Однако, когда я попытался запустить ваш код, я получил сообщение об ошибке «Требуется 424 объекта. Я попытался добавить Dim sh As Worksheet , но я все еще получаю эту ошибку. Я чувствую, что мне не хватает чего-то относительно простого с точки зрения синтаксиса. Есть предложения по устранению неполадок?

2. В верхней части вашего модуля есть ‘Option explicit’, а также объявление ‘dim sh as worksheet’

3. Я не тестировал это, и, казалось бы, я пропустил несколько вещей, но это должно помочь вам встать на правильный путь, просто проверьте все объявленные переменные, а также посмотрите, установил ли я их, например, теперь я вижу, что я не установил sh = worksheet

4. Я добавил опцию Explicit, и Dim sh As Worksheet теперь в строке Option Explicit написано «Ошибка компиляции: недопустимая внутренняя процедура»

5. Явный параметр @JonSnowNothing будет одним из твоих в верхней части модуля.