2012-04-19 2 views
5

Несмотря на множество сообщений, которые я просматривал по тем же линиям, что и мой вопрос, ни один из ответов не удовлетворяет то, что я ищу. Если вы можете связать меня с одним, я бы с удовольствием прочитал его.VBA - Как скопировать строку в Excel из одной книги в другую?

У меня есть рабочая тетрадь с рабочими листами. Для простоты, допустим, у моей книги есть рабочий лист. И в моем листе, который называется «Sheet1», в ячейках A1-A4 есть данные.

То, что я хочу, чтобы мой VBA-код, чтобы сделать это:

  1. Копирование строки 1 (или, в частности клетки А1 до А4) из книги, «A» в переменную Range «MyRange»
  2. Создать новую книгу, давайте назовем эту книгу «B»
  3. Дайте рабочему столу по умолчанию «sheet1» новое имя «Test Name»
  4. Открытая рабочая тетрадь «B» (хотя я понимаю, что код VBA «Workbooks.Add» открывает новую так что этот шаг может быть избыточным, так как Workbooks.Add охватывает половину пунктов 2 и 3)
  5. Вставить 'myRange' в первый ряд 'Workbook B'
  6. Сохраните «Рабочую книгу B» с названием «Test Book» и временную метку, заключенную в квадратные скобки. Файл также должен иметь расширение файла «XLS»
  7. Закрыть «Workbook B» и вернуться к «Рабочему»

То, что я до сих пор это:

Sub OpenAndSaveNewBook() 
    'Declarations 
    Dim MyBook As String 
    Dim MyRange As Range 
    Dim newBook As Workbook 

    'Get name of current wb 
    MyBook = ThisWorkbook.Name 
    Set MyRange = MyBook.Sheets("Sheet1").Range("A1,F1") 

    'Create/Open new wb 
    newBook = Workbooks.Add 

    'Save new wb with XLS extension 
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "/" & "TEST-BOOK", _ 
          FileFormat:=xlNormal, CreateBackup:=False 

    '===NOTE: BEFORE THE FOLLOWING RUNS I NEED TO PERFORM ACTIONS ON CELLS VIA VBA ON 
    '===WORKBOOK 'A'. DOES THE NEWLY CREATE WORKBOOK BECOME THE PRIMARY/ACTIVE WORKBOOK 
    '===? AND SO THEN DO I NEED TO ACTIVATE WORKBOOK 'A'? 
    ActiveWorkbook.Close savechanges:=True 

    'Return focus to workbook 'a' 
    MyBook.Activate 
End Sub 

Как вам может видеть, я не хватаю код, который будет обрабатывать:

  • склеивание моих скопированных данных в новую книгу
  • смена нового sheet1 имя книги на что-то другое
  • добавить метку в строку имени файла при сохранении

Наконец, я включил вопрос в моем коде, как я думаю, что, возможно, непонимание метода ActiveWorkbook. AFAIK, когда запускается код «Workbooks.Add», становится Активной книгой, т. Е. С фокусом. Означает ли это, как работает код VBA в книге «A»? Означает ли это, что если бы я хотел добавить код для манипулирования ячейками Workbook 'A', тогда мне нужно было бы использовать «MyBook.Activate», где «MyBook» содержит строку названия книги «A»?

Любая помощь будет принята с благодарностью.

Спасибо, QF

ответ

9

Вместо копии наклеивать так, как вы упомянули выше, вы можете непосредственно сделать это. Это также отрицает использование переменной.

MyBook.Sheets("Sheet1").Rows("1:4").copy _ 
newBook.Sheets("Sheet1").Rows("1") 

EDIT

Я просто заметил ошибку с кодом.

newBook = Workbooks.Add 

Эта линия даст вам сообщение об ошибке, как вы должны использовать Set

Ваш код может быть записан в виде

Option Explicit 

Sub OpenAndSaveNewBook() 
    Dim MyBook As Workbook, newBook As Workbook 
    Dim FileNm As String 

    Set MyBook = ThisWorkbook 

    FileNm = ThisWorkbook.Path & "\" & "TEST-BOOK.xls" 
    Set newBook = Workbooks.Add 

    With newBook 
     MyBook.Sheets("Sheet1").Rows("1:4").Copy .Sheets("Sheet1").Rows("1") 

     'Save new wb with XLS extension 
     .SaveAs Filename:=FileNm, FileFormat:=xlNormal, CreateBackup:=False 

     .Close Savechanges:=False 
    End With 
End Sub 

MORE EDIT

развернутую использования SET

Я бы порекомендовал вам посмотреть этот пост.

LINK: Worksheets does not work

+0

Сделайте 'newBook.SaveAs' и' newBook.Close' также. Как вы поняли, это может сбивать с толку знание того, на что ссылается ActiveWorkbook, поэтому лучше всего использовать явные ссылки там, где это возможно. – e100

+0

Спасибо за ваш ответ. Я новичок в VBA, и я получил сообщение об ошибке «Недопустимый квалификатор» после вашего предложения. Думаю, это потому, что MyBook - неправильный тип? Кроме того, это действительно не имеет смысла для меня, как где команда вставить в newBook? Не могли бы вы уточнить? –

+0

@ e100: Я редактировал свой пост, когда вы разместили этот комментарий :) –

3

Удивительная вещь о Excel является 'Запись макроса' функции. Я начал запись макроса и просто следовал шаги, описанные, а затем сделал несколько незначительных изменений в код, Excel, представленной в виде записанного макроса:

Range("A1:F1").Select 
Selection.Copy 
Workbooks.Add 
ActiveSheet.Paste 
Sheets("Sheet1").Name = "Test Name" 
Application.CutCopyMode = False 
myNewFileName = myPath & myTestName & "_" & Date & ".xls" 
ActiveWorkbook.SaveAs Filename:=myNewFileName _ 
    , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 

Date функция возвращает текущую системную дату. Важно отметить, что квадратные скобки, которые вы хотели, не являются действительными именами файлов; Excel будет вызывать ошибку, если вы попытаетесь использовать их.

+0

«... Важно отметить, что квадратные скобки ... будут вызывать ошибку, если вы попытаетесь использовать их». Я понятия не имел об этом. Большое спасибо за Ваш ответ. –

4

Избегайте ссылок на Активную книгу в пользу явных ссылок, где это возможно.

Как вы уже нашли, это может смутить знание того, что в настоящее время активно, и вам не нужно активировать рабочую книгу, чтобы манипулировать ею.

Таким образом, вы должны использовать

newBook.SaveAs... 
newBook.Close... 

записи макросов, как правило, активировать книги для того, чтобы работать на них, но это потому, что так человек, который записывал их работы! Вся активация действительно является фокусом изменения.

То же самое относится к выбору и последующему управлению текущим выбором; это не обязательно в VBA и имеет тенденцию быть медленнее, чем прямая манипуляция.

+0

Спасибо за ясность в ActiveWorkbook. –

1

Включите макрорекордеры; тщательно выполните шаги, которые вы хотите; остановить рекордер; «изменить» созданный макрос. Исправьте, поскольку вам нужно сделать программу, которую вы планируете, например, для ее параметризации.

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