2013-12-16 4 views
4

У меня есть документ Excel, который копирует лист шаблона в новый лист при первом запуске. Любые другие листы, которые следуют за этим шаблоном, добавляются к вновь созданному листу.VBA - Ошибка времени выполнения 1004 «Определенная заявка или ошибка с определением объекта»

Я получаю ошибку в названии в данном разделе коды:

If Worksheets("User Configuration").Cells(9, 15).Value = 1 Then 
    Worksheets("Cable Cards Template").Range("A1:J33").Copy 

    With Worksheets("Cable Cards") 
    **.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues** 
    .Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlFormats 
    End With 

    Worksheets("Cable Cards Template").Shapes("Picture 1").Copy 
    Worksheets("Cable Cards").Paste Cells(RangeStartRow, RangeStartColumn) 

    Call Sheets.FormatCableCardRows  
End If 

В основном, если If утверждения верно (клетку = 1), то следует скопированному диапазон на конкретный листе и вставляется в новый лист в диапазоне, заданном с использованием PasteSpecial для значений и форматирования. После этого «вновь созданный» лист должен иметь изображение, скопированное в верхнюю левую ячейку шаблона, и затем подпрограмма вызывается для форматирования строк нового листа.

Я получаю сообщение об ошибке при первом вызове .Range после заявления With Worksheets("Cable Cards"). Я пытался не использовать With заявление, копирование значения непосредственно вместо пасты-специальное и т.д. Странная вещь, что это будет работать на первом ходу, когда новый лист создан с помощью:

If (RangeStartRow = 1) Then 
    Worksheets.Add().Name = "Cable Cards" ' Create new sheet with given name only on first cable card 
    Columns(1).ColumnWidth = 9.43 
    Columns(6).ColumnWidth = 11 
    Columns(10).ColumnWidth = 9 
    Call FormatForA5Printing("Cable Cards", 71) 
End If 

, но на 2-й ход, он терпит неудачу полностью, с Run Time Error 1004 'Application Defined or Object Defined Error'. Буду признателен за любую помощь.

ответ

14

Объект вашей ячейки не имеет полной квалификации. Вам нужно добавить DOT до объекта cell. Например,

With Worksheets("Cable Cards") 
    .Range(.Cells(RangeStartRow, RangeStartColumn), _ 
      .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues 

Аналогичным образом, полностью квалифицируйте весь объект Cells.

+1

красиво пятнистый. +1 – hammus

+1

Вот и все, спасибо за это, никогда бы не заметили это иначе! – user3105671

+0

+1 Замечательно, как часто можно найти ошибки, вытекающие из несоответствующих диапазонов. –

5

Решение # 1: Ваше заявление

.Range(Cells(RangeStartRow, RangeStartColumn), Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues 

не относится к правильному Range действовать на. Вместо этого

.Range(.Cells(RangeStartRow, RangeStartColumn), .Cells(RangeEndRow, RangeEndColumn)).PasteSpecial xlValues 

делает (и аналогичным образом в некоторых других случаях).

Решение №2: Активировать Worksheets("Cable Cards") перед использованием своих ячеек.

Объяснение: Cells(RangeStartRow, RangeStartColumn) (например) дает вам Range, что бы быть нормально, и именно поэтому вы часто видите Cells используется таким образом. Но поскольку он не применяется к конкретному объекту, он применяется к ActiveSheet. Таким образом, ваш код пытается использовать .Range(rng1, rng2), где .Range является методом одного объекта Worksheet и rng1 и rng2 находятся в другом Worksheet.

Есть две проверки, которые вы можете сделать, чтобы сделать это совершенно очевидно:

  1. Активировать ваш Worksheets("Cable Cards") до выполнения вашего Sub, и она начнет работать (теперь вы хорошо сформированные ссылки на Range с) ,Для кода, который вы опубликовали, добавление .Activate сразу после With... действительно было бы решением, хотя у вас может быть аналогичная проблема в другом месте вашего кода, когда ссылается на Range в другом Worksheet.

  2. С листом, кроме Worksheets("Cable Cards") активной, установленной в контрольной точке на линии метания ошибки, начните Sub, и когда выполнение перерывы, писать в ближайшем окне

    Debug.Print Cells(RangeStartRow, RangeStartColumn).Address(external:=True)

    Debug.Print .Cells(RangeStartRow, RangeStartColumn).Address(external:=True)

    и посмотреть различные результаты.

Заключение: Использование Cells или Range без определенного объекта (например, Worksheet или Range) может быть опасным, особенно при работе с более чем одним Sheet, если один не вполне уверен, что Sheet является активный.

1

Присвоение значения, начинающегося с «=», приведет к вычислению формулы и даст в моем случае вышеупомянутую ошибку # 1004. Это был билет для меня.

Смежные вопросы