私の質問と同じ線に沿って私が調べた多くの投稿にもかかわらず、答えのどれも私が探しているものを満足させません。あなたが私を1つにリンクすることができれば、私はそれを喜んで読みます。
ワークシート付きのワークブックがあります。簡単にするために、私のワークブックにワークシートがあるとしましょう。そして、「Sheet1」と呼ばれる私のワークシートでは、セルA1からA4にデータがあります。
VBAコードに実行させたいことは次のとおりです。
私がこれまでに持っているのはこれです:
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
ご覧のとおり、次の処理を行うコードが不足しています。
最後に、ActiveWorkbookメソッドについて誤解している可能性があるため、コードに質問を含めました。コード「Workbooks.Add」を実行すると、これがアクティブなワークブック、つまりフォーカスのあるワークブックになります。これは、ワークブック「A」で実行されているVBAコードに影響しますか?これは、ワークブック 'A'のセルを操作するコードを追加する場合、 'MyBook'がワークブック 'Aの実際のタイトルの文字列を保持する "MyBook.Activate"を使用する必要があることを意味しますか?
どんな助けでも大歓迎です。
ありがとう、QF
上記の方法でコピーして貼り付ける代わりに、これを直接行うことができます。これにより、変数の使用も無効になります。
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
の使用について詳しく説明します
この投稿をご覧になることをお勧めします。
リンク: ワークシートは機能しません
ActiveWorkbookへの参照は避け、可能な限り明示的な参照を優先してください。
お気づきのとおり、現在アクティブなものを知ることは混乱を招く可能性があり、ワークブックを操作するためにアクティブ化する必要はありません。
だからあなたは使うべきです
newBook.SaveAs...
newBook.Close...
記録されたマクロは、それらを処理するためにワークブックをアクティブ化する傾向がありますが、それは、それらを記録した人間が機能する方法だからです!アクティベーションが実際に行うのは、フォーカスを変更することだけです。
同じことが、選択を行ってから現在の選択を操作する場合にも当てはまります。 VBAでは必要なく、直接操作よりも遅くなる傾向があります。
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はエラーをスローします。
マクロレコーダーをオンにします。必要な手順を慎重に実行します。レコーダーを停止します。生成されたマクロを「編集」します。意図したプログラムを作成する必要がある場合、たとえばパラメータ化するために修正します。