2012-04-19 247 views
5

儘管很多帖子我已經經歷是沿着相同的路線,我的問題看,沒有一個答案滿足我所期待的。如果你能把我和我聯繫起來,我很樂意閱讀它。VBA - 如何在Excel中從一個工作簿複製一行到另一個?

我有一個工作表的工作簿。爲了簡單起見,假設我的工作簿有一張工作表。在我的工作表中稱爲「Sheet1」,單元格A1到A4中有數據。

我想要什麼我的VBA代碼做的是:

  1. 複製第1行(或特別單元A1至A4)練習冊 'A' 到範圍變量 'myRange'
  2. 創建一個新的工作簿,讓我們稱之爲工作簿'B'
  3. 爲Workbook'B的默認「sheet1」重新命名爲「Test Name」
  4. Open Workbook'B'(儘管我意識到VBA代碼「Workbooks.Add」會打開一個新的書所以這一步可以是多餘的,因爲Workbooks.Add覆蓋點2和3的一半)
  5. 粘貼「myRange」到「工作簿B」
  6. 保存「工作簿B」的第一行名稱爲「測試書」和方括號中的時間戳。該文件還必須是文件擴展名爲「XLS」
  7. 關閉「工作簿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方法的誤解。當代碼「Workbooks.Add」運行時,AFAIK成爲活動工作簿,即焦點。這是否影響在工作簿「A」上運行的VBA代碼?這是否意味着,如果我想添加代碼來處理工作簿「A」的細胞,然後我就需要使用「MyBook.Activate」,其中「MyBook」保存工作簿「A的實際標題的字符串?

任何幫助將不勝感激。

感謝, QF

回答

9

,而不是複製粘貼你上面提到的方式,你可以直接做到這一點。這也會否定變量的使用。

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

編輯

我只注意到一個錯誤與您的代碼。

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 

更多修改

在闡述使用SET

我會建議你看到這篇文章。

LINK:Worksheets does not work

+0

做'newBook.SaveAs'和'newBook.Close'。正如你所發現的,知道ActiveWorkbook所指的是什麼可能會令人困惑,因此最好在可能的情況下使用明確的引用。 – e100 2012-04-19 14:46:14

+0

感謝您的回覆。我是一名VBA新手,在您的建議之後,我收到了「無效限定符」錯誤消息。我想這是因爲MyBook是錯誤的類型?另外,這對我來說沒有任何意義,因爲粘貼到newBook的命令在哪裏?你能詳細說明一下嗎? – 2012-04-19 14:47:19

+0

@ e100:當您發佈此評論時,我正在編輯我的帖子:) – 2012-04-19 14:48:12

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

「...需要注意的是,如果您嘗試使用這些方括號,它會引發錯誤。」我對此毫無頭緒。非常感謝您的回覆。 – 2012-04-19 14:55:34

4

儘可能避免引用ActiveWorkbook以支持顯式引用。

正如您發現的那樣,您可能會對目前處於活動狀態的內容感到困惑,並且您無需激活工作簿即可對其進行操作。

所以,你應該使用

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

錄製的宏傾向於激活工作簿,以便對他們的工作,但那是因爲這是誰記錄他們一個人的工作方式!所有的激活確實是改變焦點。

這同樣適用於選擇,然後操縱當前的選擇;在VBA中不是必需的,並且往往比直接操作要慢。

+0

感謝ActiveWorkbook的清晰度。 – 2012-04-19 14:57:43

1

打開宏錄像機;仔細執行你想要的步驟;停止錄音機; 「編輯」生成的宏。根據您需要製作您想要的程序進行修復,例如對其進行參數化。

相關問題