web-dev-qa-db-ja.com

VBA-Excelの行をあるブックから別のブックにコピーする方法は?

私の質問と同じ線に沿って私が調べた多くの投稿にもかかわらず、答えのどれも私が探しているものを満足させません。あなたが私を1つにリンクすることができれば、私はそれを喜んで読みます。

ワークシート付きのワークブックがあります。簡単にするために、私のワークブックにワークシートがあるとしましょう。そして、「Sheet1」と呼ばれる私のワークシートでは、セルA1からA4にデータがあります。

VBAコードに実行させたいことは次のとおりです。

  1. ワークブック「A」の行1(または具体的にはセルA1からA4)を範囲変数「myRange」にコピーします
  2. 新しいワークブックを作成します。これをワークブック「B」と呼びましょう。
  3. ワークブック 'Bのデフォルトの「sheet1」に「テスト名」に新しい名前を付けます
  4. ワークブック「B」を開きます(ただし、VBAコード「Workbooks.Add」は新しいブックを開くため、Workbooks.Addはポイント2と3の半分をカバーしているため、この手順は冗長になる可能性があります)
  5. 'myRange'を 'WorkbookB'の最初の行に貼り付けます
  6. 「ワークブックB」を「テストブック」という名前と角かっこで囲まれたタイムスタンプで保存します。ファイルの拡張子も「xls」である必要があります
  7. 「ワークブックB」を閉じて「ワークブックA」に戻ります

私がこれまでに持っているのはこれです:

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」を実行すると、これがアクティブなワークブック、つまりフォーカスのあるワークブックになります。これは、ワークブック「A」で実行されているVBAコードに影響しますか?これは、ワークブック 'A'のセルを操作するコードを追加する場合、 'MyBook'がワークブック 'Aの実際のタイトルの文字列を保持する "MyBook.Activate"を使用する必要があることを意味しますか?

どんな助けでも大歓迎です。

ありがとう、QF

6
qwerty_face

上記の方法でコピーして貼り付ける代わりに、これを直接行うことができます。これにより、変数の使用も無効になります。

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の使用について詳しく説明します

この投稿をご覧になることをお勧めします。

リンク: ワークシートは機能しません

10
Siddharth Rout

ActiveWorkbookへの参照は避け、可能な限り明示的な参照を優先してください。

お気づきのとおり、現在アクティブなものを知ることは混乱を招く可能性があり、ワークブックを操作するためにアクティブ化する必要はありません。

だからあなたは使うべきです

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

記録されたマクロは、それらを処理するためにワークブックをアクティブ化する傾向がありますが、それは、それらを記録した人間が機能する方法だからです!アクティベーションが実際に行うのは、フォーカスを変更することだけです。

同じことが、選択を行ってから現在の選択を操作する場合にも当てはまります。 VBAでは必要なく、直接操作よりも遅くなる傾向があります。

4
e100

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はエラーをスローします。

3
RavenM

マクロレコーダーをオンにします。必要な手順を慎重に実行します。レコーダーを停止します。生成されたマクロを「編集」します。意図したプログラムを作成する必要がある場合、たとえばパラメータ化するために修正します。

1
Steven