• 締切済み

ExcelのVBAでブックを保存

住所録Aと住所録Bがあります。 AとBを比較して、差異をを別ファイルに出力しようとしています。 比較元となるファイルは、AでもBでもかまいません。 比較、判定、ファイルへの出力部分は、省略していますが、保存 する場合は、どこに行うのがよいのですか bookですか。sheetですか。 両方で、SaveAsができまが、使い分けがあるのでしょうか。 どのように使い分けするのでしょうか。 書き方、使い方のおかしいところを指摘して頂くとありがたい です。 --------------------------------------------------------------------------------------------------- Option Explicit Sub test() Dim ret As Integer Dim row1 As Long Dim col1 As Long Dim row2 As Long Dim col2 As Long Dim myRtn As Boolean Dim fno1 As String Dim fno2 As String Dim OutBook As New Workbook Dim OutSheet As New Worksheet Dim OutFileName As String Dim cnt As Integer Dim I As Integer ret = MsgBox("処理を開始します。" + Chr(13) + Chr(10) + "よろしいですか。?", _ vbYesNo + vbQuestion) If ret = vbNo Then End End If myRtn = Application.Dialogs(xlDialogOpen).Show If myRtn = False Then MsgBox "[キャンセル]が選択されました" & vbCr & _ "処理を終了します" Exit Sub End If fno1 = Application.ActiveWorkbook.Name myRtn = Application.Dialogs(xlDialogOpen).Show If myRtn = False Then MsgBox "[キャンセル]が選択されました" & vbCr & _ "処理を終了します" Exit Sub End If fno2 = Application.ActiveWorkbook.Name Set OutBook = Workbooks.Add Set OutSheet = ActiveSheet OutBook.Worksheets(1).Name = "テスト" OutFileName = "テスト.xls" With Application.Workbooks(fno1).Worksheets(1) row1 = 1 col1 = 1 cnt = 1 Do While .Cells(row1, 1) <> "" 処理 (省略) Loop End With MsgBox "処理が終了しました。", vbOKOnly + vbInformation, "確認" Application.Workbooks(fno1).Close Application.Workbooks(fno2).Close OutSheet.SaveAs Filename:=OutFileName OutBook.SaveAs Filename:=OutFileName OutBook.Close End Sub --------------------------------------------------------------------------------------------------- OutSheet.SaveAs Filename:=OutFileName or OutBook.SaveAs Filename:=OutFileName のどちらでも保存ができます。 また、書き方、使い方のおかしいところを指摘して頂くとありがたいです。

みんなの回答

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

> 書き方、使い方のおかしいところを指摘して頂くとありがたい とのことですので・・ > + "よろしいですか。?" 「。」は不要ですね。 ・・・などと意地の悪い指摘は置いておいて。 > ret = MsgBox("処理を開始します。" + Chr(13) + Chr(10) + "よろしいですか。?", _ >        vbYesNo + vbQuestion) >   If ret = vbNo Then >     End >   End If ここですね。 好みの問題ではありますが、   If MsgBox("処理を開始します。" + Chr(13) + Chr(10) + "よろしいですか。?", _         vbYesNo + vbQuestion) = vbNo Then     Exit Sub   End If としちゃうと、変数retの宣言が不要ですね。 あと、個人的に気になるのは > Dim OutBook As New Workbook > Dim OutSheet As New Worksheet >   Set OutBook = Workbooks.Add >   Set OutSheet = ActiveSheet >   OutBook.Worksheets(1).Name = "テスト" ここです。 OutSheetを"新規"ワークシートで宣言していますから、 >   Set OutSheet = ActiveSheet ここでなんとなくぎくしゃくします。 下記を新規ブックに貼って試してみてください。 Sub test1_1() Dim OutBook As New Workbook Dim OutSheet As New Worksheet   Set OutBook = Workbooks.Add   Set OutSheet = ActiveSheet     OutBook.Worksheets(1).Name = "テスト"     OutSheet.Range("A1") = "awwa"  'さて、これはどこに記入されるでしょう。 End Sub きっと、マクロを動かしたときにアクティブだったシートのA1セルに書かれるでしょう。 同時に > OutBook.Worksheets(1).Name = "テスト" こうしなきゃならない理由、   OutSheet.Name = "テスト" では通らない理由もここにあります。 ここの回避策を2通り。 Sub test1_2() Dim OutBook As New Workbook Dim OutSheet As New Worksheet   Set OutBook = Workbooks.Add   Set OutSheet = OutBook.Worksheets.Add()     OutSheet.Name = "テスト" End Sub ただし、これだと余計なシートが増えてしまいます。 それがいやかも、という事であれば Sub test1_3() Dim OutBook As New Workbook Dim OutSheet As Worksheet   Set OutBook = Workbooks.Add   Set OutSheet = OutBook.Worksheets(1)     OutSheet.Name = "テスト" End Sub こんなやりかたでも良いでしょうね。 質問内の > OutSheet.SaveAs Filename:=OutFileName > OutBook.SaveAs Filename:=OutFileName これはまぁ、下段・Book.SaveAsが良いでしょうね。 書き方は好みによって大きく左右して当然ですが・・ 他の人が見て、読みやすいのが一番ですね。 私ならどんな処理をするかなぁ。 比較対象のファイルA・B、それぞれ比較するシートが1枚ずつ・・と言う前提なら、 やはりマクロが書かれただけの白紙のブック(比較結果)に、 ・ファイルAの住所録シートを比較結果に複製  (例えばシート名「住所A」とし、ファイルAは閉じる) ・ファイルBの住所録シートを比較結果に複製  (例えばシート名「住所B」とし、ファイルBは閉じる) ・比較結果ブック内に結果を転記するシートを作成  (シート名は「差異」とでも。新規シートでも既存シートでもOK) ・比較が一通り終わったら、住所A・Bのシートを削除 ・差異シートだけになった状態のブックを別名保存 こんな感じかなぁ。 単に、1ブック内で済むように作る方がデバッグ作業が楽なような気がするから、 と言うだけの話ですけどね。 ならないかもしれませんが、参考までにどうぞ。

abc999xyz
質問者

お礼

ありがとうございます。 記載して頂いた内容確認してみます。

回答No.1

Application.Workbooks(fno1).Close Application.Workbooks(fno2).Close 'OutSheet.SaveAs Filename:=OutFileName OutBook.SaveAs Filename:=OutFileName OutBook.Close AとB、出力も合わせてファイル3つ、ややこしいね。 私なら、出力はマクロブックのアクティブシートにする。 そして出力はあえてCloseしない。結果を確認した後、自分で閉じるときに、どこにどんな名前で出力するのか決めればいい話。

abc999xyz
質問者

お礼

ありがとうございます。

関連するQ&A