Диапазоны копирования из одной книги в другую

#excel #vba

#excel #vba

Вопрос:

У меня есть рабочая книга с тремя листами. RC, RI, RCB. Мне нужно написать код VBA, который скопирует диапазоны из этой книги и вставит во вновь созданную книгу.

В этом коде работает все, кроме RCB листа. Отладка включается в строке 12

 Sub Budget()
With Workbooks.Add
ActiveSheet.Name = "RC"
ThisWorkbook.Worksheets("RC").Range("A:D").Copy .Worksheets("RC").Range("A1")
ThisWorkbook.Worksheets("RC").Range("E:G").Copy .Worksheets("RC").Range("E1")
Sheets.Add
ActiveSheet.Name = "RI"
ThisWorkbook.Worksheets("RI").Range("A:E").Copy .Worksheets("RI").Range("A1")
ThisWorkbook.Worksheets("RI").Range("G:G").Copy .Worksheets("RI").Range("G1")
Sheets.Add
ActiveSheet.Name = "RCB"
ThisWorkbook.Worksheets("RCB").Range("A:C").Copy .Worksheets("RCB").Range("A1")
ThisWorkbook.Worksheets("RCB").Range("E:E").Copy .Worksheets("RCB").Range("G1")
.SaveAs "C:UserslomidDesktop4finansi3"
.Close
End With
End Sub
  

Я думаю, что речь должна идти об активном листе и рабочей книге.
это ошибка, которую он выдает мне: «Ошибка времени выполнения 9: нижний индекс вне диапазона»

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

1. Что вам говорит отладка?

2. Вы уверены, что это ThisWorkbook содержит лист RCB ?

3. Ошибка времени выполнения 9: индекс вне диапазона

4. OP — это копирование данных с ThisWorkbook -листов на листы, созданные в новой книге. Workbooks.Add не только создает новую книгу, но и делает ее активной. Код можно было бы написать (намного) лучше, но проблема не в этом. Я провел быстрый тест, и у меня все получилось — при условии, что исходная книга содержит все три листа.

5. @SJR — Оооо, хорошо, я понял. Это сбивает меня с толку при чтении… Я бы предложил OP вместо этого правильно объявлять рабочие книги…

Ответ №1:

Вы можете отказаться от всего копирования / вставки. При использовании SaveAs для сохранения текущей книги исходная книга закроется без сохранения, а новая книга будет открыта. Насколько я могу судить по вашему вопросу, вы хотите сохранить только определенные столбцы. Мне нравится удалять столбцы, которые вам не нужны, и делать SaveAs с новым именем книги. Приведенный ниже код намного чище. Используйте, Application.DisplayAlerts = False чтобы не получать The following features cannot be saved in macro-free workbooks: приглашение.

 Application.DisplayAlerts = False
    With ThisWorkbook
        .Sheets("RC").Range("H:Z").EntireColumn.Delete
        .Sheets("RI").Range("H:Z, F:F").EntireColumn.Delete
        .Sheets("RCB").Range("F:Z, D:D").EntireColumn.Delete

        .SaveAs "C:UserslomidDesktop4finansi3.xlsx"
    End With
Application.DisplayAlerts = True