6

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

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

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

  1. ワークブック「A」の行1(または具体的にはセルA1からA4)を範囲変数「myRange」にコピーします
  2. 新しいワークブックを作成します。これをワークブック「B」と呼びましょう。
  3. Workbook'Bのデフォルトの「sheet1」に「TestName」に新しい名前を付けます
  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

4

4 に答える 4

10

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

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

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

リンク:ワークシートが機能しない

于 2012-04-19T14:36:23.173 に答える
4

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

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

だからあなたは使用する必要があります

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

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

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

于 2012-04-19T14:54:15.363 に答える
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はエラーをスローします。

于 2012-04-19T14:47:38.837 に答える
1

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

于 2013-05-06T00:47:23.757 に答える