Ошибка выполнения VBA - 1004 при попытке отформатировать или удалить ячейки после вставки значений

Я пытаюсь использовать VBA, чтобы облегчить себе жизнь, но у меня постоянно возникают проблемы, с которыми я не могу справиться. По сути, я хочу скопировать некоторые значения из нескольких выходных CSV-файлов, которые у меня есть, в хорошо отформатированный файл excel. Затем в соответствии с некоторыми базовыми числами удалите значения или отформатируйте ячейки.
Однако я продолжаю получать одно и то же сообщение об ошибке. Ошибка времени выполнения «1004», ошибка, определяемая приложением или объектом. Я делаю это, используя множество выходных файлов и вставляя значения в один и тот же файл таблицы, но на разные листы (10.2a, 10.2b, 10.2c,...), имея макросы для каждого листа. Я запускаю все макросы в одном, используя другой макрос, который содержит все остальные макросы. Я много смотрел в других сообщениях, но не понимаю, откуда берется ошибка. Любая помощь приветствуется. Код, который я использую для одного листа, приведен ниже в качестве примера.

Sub Table_10_2a()
        '
        ' Copy Data from one file to another
        '
        Dim Output As Workbook
        Dim Table As Workbook
        Dim i As Integer

        'Open workbooks
        Set Output = Workbooks.Open("O:\...\Output.csv")
        Set Table = Workbooks.Open("O:\...\Table.xlsx") 

        'Copy paste data from output file to Table
        Output.Sheets("Output1").Range("B3:E7").Copy
        Table.Sheets("10.2a").Range("B11").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B9:E13").Copy
        Table.Sheets("10.2a").Range("B17").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B15:E15").Copy
        Table.Sheets("10.2a").Range("B23").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B17:E21").Copy
        Table.Sheets("10.2a").Range("B26").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B23:E27").Copy
        Table.Sheets("10.2a").Range("B32").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B29:E29").Copy
        Table.Sheets("10.2a").Range("B38").PasteSpecial xlValues

        Output.Sheets("Output1").Range("B30:E30").Copy
        Table.Sheets("10.2a").Range("B40").PasteSpecial xlValues

        For i = 2 To 5
        'Delete cells for values below 30
         If Table.Sheets("10.2a").Cells(40, i).Value < 30 Then
            Table.Sheets("10.2a").Range(Cells(26, i), Cells(36, i)).ClearContents
            Table.Sheets("10.2a").Cells(38, i).NumberFormat = """[""0""]"""
            Table.Sheets("10.2a").Cells(40, i).NumberFormat = """[""0""]"""
         End If

    'Format cells for values below 50
        If Table.Sheets("10.2a").Cells(40, i).Value < 50 And Table.Sheets("10.2a").Cells(40, i).Value > 30 Then
            Table.Sheets("10.2a").Range(Cells(26, i), Cells(38, i)).NumberFormat = """[""0.0""]"""
            Table.Sheets("10.2a").Cells(40, i).NumberFormat = """[""0""]"""
        End If

        Next i

        'Save file
            Table.Save

        'Close files
            Output.Close
            Table.Close

        End Sub

person PetGous    schedule 18.07.2014    source источник
comment
На какой строке ваша программа прерывается с ошибкой?   -  person Dan Wagner    schedule 18.07.2014
comment
1004 может произойти, если Table не является ActiveWorkbook во время выполнения (похоже, что это ActiveWorkbook). В противном случае может произойти 1004, если рабочий лист защищен (хотя я ожидаю, что метод PasteSpecial вызовет ошибку в этом случае. Сообщите нам, где происходит ошибка, и ее будет легче устранить.   -  person David Zemens    schedule 18.07.2014
comment
@DavidZemens Привет, здесь ломается: Table.Sheets(10.2a).Range(Cells(26, i), Cells(36, i)).ClearContents Я пытался посмотреть, имеют ли ячейки в рабочей книге Table странный формат, но они все так же. Спасибо – PetHnr 21 час назад   -  person PetGous    schedule 22.07.2014


Ответы (1)


Такое использование Cells внутри Range для построения блока ячеек обычно становится жертвой неквалифицированной ссылки. В этом случае вы используете Table.Sheets("10.2a") для указания листа для Range, но не используете тот же квалификатор для Cells. Это означает, что Cells будет использовать доступный контекст по умолчанию, который зависит от того, где выполняется код. Возможности:

  • Внутри модуля кода или ThisWorkbook, Cells относится к ActiveSheet
  • Внутри кода рабочего листа Cells относится к этому Worksheet независимо от ActiveSheet

Используйте Address, чтобы обойти разные листы

Один из подходов — следовать за вызовом Cells с помощью Address. Это решает проблему, поскольку Address возвращает адрес ячейки без имени листа. Затем это интерпретируется Range в его контексте, который равен Sheets("10.2a").

Range(Cells(26, i).Address, Cells(36, i).Address).ClearContents

Уточните ссылку (как правило, предпочтительнее)

Другой способ устранить эту ошибку — уточнить ссылку, добавив имя листа перед Cells: Table.Sheets("10.2a").Cells. Полная строка:

Range(Table.Sheets("10.2a").Cells(26, i), Table.Sheets("10.2a").Cells(36, i)).ClearContents

Этот тип кода лучше выглядит внутри блока With... End With.

person David Zemens    schedule 22.07.2014
comment
@Byron хорошо, что оператор принял это, и технически мой ответ также решает неквалифицированную ссылку, заставляя адрес из объекта Cells (я согласен, это не оптимальный подход, но по какой-то причине я придумал) независимо от Activesheet . Вы правы, тем не менее, что правильная ссылка и квалификация объектов - это хорошее программирование, и оно полностью позволило бы избежать ошибки. Ура, и не стесняйтесь редактировать этот ответ или добавлять новый свой собственный. - person David Zemens; 18.06.2015
comment
Я отредактировал это, чтобы отразить безоговорочную ссылку. Не стесняйтесь откатывать, если вы предпочитаете другую формулировку ... Я всегда чувствую себя странно, редактируя ответы. - person Byron Wall; 18.06.2015