• ベストアンサー

決められたセル範囲のみ別ファイルに保存するマクロ

Book内のシートSheet1,Sheet2,Sheet3を別個のCSVファイルSheet1.csv/Sheet2.csv/Sheet3.csvとして保存したいです。 過去ログを参考に以下のコードで正常に動作しました。 For Num = 1 To 3 SheetName = "Sheet" & Num Worksheets(SheetName).Copy ActiveSheet.SaveAs Filename:=myPath & SheetName, FileFormat:=xlCSV, CreateBackup:=False ActiveWorkbook.Close False Next ここで、 決められたセル範囲A1:D5に書かれたデータのみをCSVファイルとして保存する、 といったことをしたいのですが、記述の仕方を教えてください。 その範囲以外が削除されてしまっても構わないので、 その範囲以外をクリアしてから保存を実行、というコードも組んだのですが、 上書き保存されているシートに対して行うとクリアする前の状態のシートをコピーするようで、失敗しました。 Worksheets(SheetName).Copyの部分を、 Sheets(SheetName).Select Range("A1:D5").Copy と変えてみたのですが、マクロを実行したファイルが閉じてしまい、巧く動きません。 ※myPathには保存先フォルダのパスが入ります。 また、保存の際に「同名のファイルがあるが、上書きするか?」のメッセージを出さずに強制的に上書きにする方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 以前の私のコードの書き方に、良く似ていますね。特に、.Close False は、私の独特の考えで書いているからです。 ただ、私のオリジナルは、こういう書き方ではなくて、直接、CSVを作ってしまうのですが、あくまでも、掲示板で公開するためのものです。 >保存の際に「同名のファイルがあるが、上書きするか?」 は、Application.DisplayAlart =False です。 今回は、二種類作ってみました。 TestSample1 >その範囲以外が削除されてしまっても構わないので、 >その範囲以外をクリアしてから保存を実行、というコード TestSample2 その範囲以外が削除されてしまっては、困る場合 シート名のファイルがない場合は、その範囲のみCSVにします。 ------------------------------------------------------ Sub TestSample1()   '規定の範囲のみを残す   Dim Num As Integer   Dim myPath As String   Dim SheetName As String   Dim r As Range      Const MYRNG As String = "A1:D5" '規定の範囲のみを残す   ' ="" とすれば、シート全体がコピーされる   'ユーザー任意   myPath = Application.DefaultFilePath & "\"      Application.ScreenUpdating = False   For Num = 1 To 3     SheetName = "Sheet" & Num     If MYRNG <> "" Then       Set r = Worksheets(SheetName).Range(MYRNG)     End If     Worksheets(SheetName).Copy     With ActiveSheet       If MYRNG <> "" Then         .UsedRange.Clear 'シートのデータを削除         r.Copy .Range("A1") 'データのコピー&ペースト       End If       Application.DisplayAlerts = False       .SaveAs FileName:=myPath & SheetName, _       FileFormat:=xlCSV, _       CreateBackup:=False       Application.DisplayAlerts = True     End With     ActiveWorkbook.Close False   Next   Application.ScreenUpdating = True End Sub ------------------------------------------------------ Sub TestSample2() '規定の範囲のみを書き換える   Dim Num As Integer   Dim myPath As String   Dim SheetName As String   Dim FileName As String   Dim r As Range      Const MYRNG As String = "A1:D5" '規定の範囲のみを書き換える   'ユーザー任意   myPath = Application.DefaultFilePath & "\"      Application.ScreenUpdating = False   For Num = 1 To 3     SheetName = "Sheet" & Num     Set r = Worksheets(SheetName).Range(MYRNG)          FileName = myPath & SheetName & ".csv"          If Dir(FileName) <> "" Then            With Workbooks.Open(FileName)       r.Copy .ActiveSheet.Range(MYRNG)      End With          Else          Worksheets(SheetName).Copy     With ActiveSheet       .UsedRange.Clear       r.Copy .Range("A1")     End With     End If         Application.DisplayAlerts = False     ActiveWorkbook.SaveAs FileName:=myPath & SheetName, _       FileFormat:=xlCSV, _       CreateBackup:=False    Application.DisplayAlerts = True     ActiveWorkbook.Close False   Next   Application.ScreenUpdating = True End Sub

tktk1228
質問者

お礼

回答ありがとうございます。 わざわざ2つもありがとうございます。 後者が理想だったのでこちらを組み込んでいる最中です。 (自分にとっては)コードが長くなってきて混乱し始めました。 変数rに入っている情報はデバッグ時にカーソルを合わせても表示されないようですが、 ここにコピー範囲などが入っているものとして扱っています。 >以前の私のコードの書き方に、良く似ていますね。 過去ログを参考に、と書きましたが、 コードは載っていたもののほぼパクりなので、Wendy02さんの書いた記事だったかもしれません。

その他の回答 (2)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

#01です。「コピーしたシートを消す」と「元のブック名を変えない」ようにしました。また同名ファイルがある場合は警告なしで上書きします For Num = 1 To 3 SheetName = "Sheet" & Num Worksheets(SheetName).Range("A1:D5").Copy WorkSheets.Add ActiveSheet.Paste Application.DisplayAlerts = False ActiveSheet.SaveCopyAs Filename:=myPath & SheetName, _   FileFormat:=xlCSV, CreateBackup:=False ActiveSheet.Delete Application.DisplayAlerts = True Next

tktk1228
質問者

お礼

回答ありがとうございます。 注文つけちゃって申し訳ありません。 挙げていただいたコード、1行ずつ解析します。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

For Num = 1 To 3 SheetName = "Sheet" & Num Worksheets(SheetName).Range("A1:D5").Copy WorkSheets.Add ActiveSheet.Paste ActiveSheet.SaveAs Filename:=myPath & SheetName, _   FileFormat:=xlCSV, CreateBackup:=False Next ActiveWorkbook.Close False ではどうでしょうか。「マクロを実行したファイルが閉じてしまい」はFor~Nextの中でCloseしているからです 「同名のファイルがあるが、上書きするか?」のメッセージを出さない方法として  Application.DisplayAlerts = False  ThisWorkBook.SaveAs …  Application.DisplayAlerts = True があります。

tktk1228
質問者

補足

回答ありがとうございます。 求めていた部分は正常に動作しました。 ただ、 ・実行後、Book内にSheet4~6というシートが残ってしまう ・実行後、Book名がSheet3.csvになってしまう という新たな問題が発生してしまいました。 最初に挙げたコードでFor~Nextの中でCloseしているのは、 CSVファイルの保存に使ったシートSheet4~6を閉じるつもりで配置したものです。 ・Book内にシートを増やさない ・マクロ実行後、マクロを実行したBookを開いている状態に この2点、なんとかなるようでしたらよろしくお願いします。

関連するQ&A

  • エクセル:シートを1つずつ別ファイルで保存する際に

    WindowsXPでExcel2003を使っています。 1つのエクセルファイルの中にSheet1,Sheet2,Sheet3というシートが3個あり、 それらのシートを1枚ずつCSVファイルとして保存したいです(Sheet1.csv、Sheet2.csv、Sheet3.csv)。 現在のコードは以下です。   Path = 保存場所 For Each SheetName In Array("Sheet1", "Sheet2", "Sheet3") Worksheets(SheetName).Copy ActiveSheet.SaveAs Filename:=Path & SheetName, FileFormat:=xlCSV, CreateBackup:=False ActiveWorkbook.Close False Next SheetName このコードだと、新しいBookを開いてコピーし、それを閉じる、 という作業を繰り返しているらしく(自分で一から組んだわけではなく、コード完全に理解できてません)、 タスクバーがちらつきます。 ここに挙げたコードでは3シートですが、実際は20シート程あるので、 タスクバーの「開く・閉じる」の繰り返しはちょっと目立ちます。 これ以外の方法で(とりあえずタスクバーがちらつかなければOK)、 各シートを別ファイルとして保存することは不可能でしょうか? 自分だけが使いたいわけではないので、 タスクバーを隠しておくなどWindows側の設定以外で何か方法があれば、よろしくお願いします。

  • Excelマクロで、ファイルの閉じ方

    作成している実行ファイルabc.xlsのマクロについて質問です。 (過去作られたものを修正しているので、私にも説明できないコードはあります) 実行すると、別ファイルSheet1.csvを開き、 Sheet1.csvの4~1024行目を、abc.xlsにコピーし、 Sheet1.csvを閉じる。 といったことをやりたいです。 ※ここまでのソースに、Sheet1.csvを開く、という部分があります。  Sheet1.csvはアクティブになっています。 ※Sheet1.csvファイルには、Sheet1というシートが1つだけあるものとします。 rng1 = "4:1024" rng2 = "4:4" rng3 = "A4" CurName = "abc.xls" sheetname = "Sheet1" ActiveSheet.Rows(rng1).Copy Windows(CurName).Activate Sheets(sheetname).Select   Range(rng2).Select '特に意味は無いと思われる Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Range(rng3).Select '特に意味は無いと思われる Application.CutCopyMode = False Dim ACT As String ACT = sheetname & ".csv" 以上を実行すると、 Sheet1.csvを開き、コピーする所までは正常に実行できます。 抜粋したのでこれだけじゃ意味不明な部分があるかもしれませんが、コピー完了までは正常に動いております。 この後に、Sheet1.csvを閉じるコマンドを入れたいのですが、 検索等して調べたコードではエラーが発生し、閉じることができません。 例えば「新しいマクロを記録する」でExcelに作ってもらったコードだと、  Windows("Sheet1.csv").Activate  ActiveWindow.Close で閉じることができるのですが、 これを記述してもエラーが出ます。 どのように書けばよいのでしょうか。

  • 複数ファイルのA1だけを抽出して別ファイルにしたい

    すみませんが、教えてください。 特定のフォルダ内に入っているcsvのA1列目のみ抽出して別ファイルにしたく、検索したところ 同じように困っていた方がいたようで、参考にさせていただいたのですが、 以下を実行しても インデックスが有効範囲にありませんと出ます。 各csvファイルのシート名は 1000近くあるファイル全て違い、別々の名前(コード00-000とか)になっています。 (エクセルで開いたとき) お手数ですが、教えていただきたくお願いいたします。 参考にしたマクロです。 Sub macro1() Dim myPath As String Dim myFile As String myPath = "ファイルの場所\" myFile = Dir(myPath & "*.xls") Do Until myFile = "" Workbooks.Open myPath & myFile With Workbooks("集約.xls").Worksheets("Sheet1").Range("A65536").End(xlUp) .Offset(1, 0).Value = myFile .Offset(1, 1).Value = Workbooks(myFile).Worksheets("概要").Range("C3").Value End With Workbooks(myFile).Close savechanges:=False myFile = Dir() Loop End Sub 宜しくお願いいたします。

  • EXCELのマクロで保存するときのメッセージ

    CSVファイルを上書き更新後、ファイルを閉じる作業をしたいのですが、EXCEL2000のマクロでその作業を行うと、次のメッセージがでて、次の手作業の要求がきます。 (1)ファイルの上書きするとき  この場所にAAAというファイルが既にあります。置き換えますか・・・はいのクリック (2)ファイルを閉じるとき  AAAへのファイルの変更を保存しますか・・・いいえをクリック この(1)(2)の作業も、マクロに書きたいのですが、どうすればよいのでしょうか 現在のマクロは ActiveWorkbook.SaveAs Filename:= _ "C:\AAA.csv" _ , FileFormat:=xlCSV, CreateBackup:=False ActiveWindow.Close よろしくお願いします

  • エクセルからCSVファイルに出力したい?

    エクセルのシートからマクロを使ってCSVファイルに出力したいです。 そこで調べたのですが、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2376607 こちらの質問で以下のようなコードが参考になりました。 Sub Macro1() Dim myBook As String myBook = ActiveWorkbook.FullName myBook = Left(myBook, Len(myBook) - 3) & "CSV" ActiveSheet.Copy ActiveWorkbook.SaveAs Filename:=myBook, FileFormat:=xlCSV ActiveWindow.Close False End Sub このコードではCSVのファイル名がエクセルシートのファイル名になってしまいます。 今回の質問ですが、CSVファイルを違う名前で保存するにはどのようにすればいいのでしょうか? (CSVファイルの名前は常にabc.csvで保存するものとします)

  • マクロでファイル名を指定して保存する際にエラー

    「全データ」というシートをマクロでファイル名に「伝票+実行時の日付・時間]をいれてCSV形式で保存したいと思い、 一度マクロを登録してみたのですが、途中でエラーが発生しうまくいきません。 「"」や「&」の付け方に問題があるかと思い、いろいろなパターンで試しましたが同様です。 修正記述がお分かりの方がいらっしゃいましたら、お言葉をいただけると幸いです。 宜しくお願いいたします。 ------------------------------------------------------------------------------------- Sheets("全データ").Select Dim file As Variant Dim NewBook As Workbook Dim NowSheet As Worksheet Set NowSheet = ActiveSheet file = Application.GetSaveAsFilename("伝票" & Now, "yy-mm-dd-hh-mm" & ".csv", "CSVカンマ区切り形式 (*.csv), *.csv") If file = False Then Exit Sub  ←ここでエラー2015が発生 Set NewBook = Workbooks.Add NowSheet.Copy before:=NewBook.Worksheets(1) On Error Resume Next NewBook.Worksheets(1).SaveAs Filename:=file, FileFormat:=xlCSV On Error GoTo 0 Application.DisplayAlerts = False NewBook.Close Application.DisplayAlerts = True NowSheet.Activate   End Sub

  • EXCEL確認メッセージを出さずに保存したい

    恐れ入りますが、ご教示お願い致します。 質問(1) EXCELファイルを (1)特定の名前で (2)CSVファイルにして 保存をしたいと考えています。次のマクロを書いたところ、”CSVへの変更を保存しますか?”確認メッセージがでます。 確認メッセージを出さずに、保存するためには、どのように記述したらよいでしょうか? With ActiveWorkbook .SaveAs Filename:=Mypath & "\" & Mybook & MYsireal, FileFormat:=xlCSV .Close End With (2)改行するためにはどうしたらよいでしょうか? .SaveAs Filename:=Mypath & "\" & Mybook & MYsireal, FileFormat:=xlCSV を、次のように改行させたいのです。 .SaveAs Filename:=Mypath & "\" & Mybook & MYsireal,      FileFormat:=xlCSV _ を使うということを、なんとなく覚えておりますが、うまくいきません。注意点等をご教示頂ければと思います。 以上 よろしくお願い致します。

  • エクセルVBAでファイルをCSV保存の仕方

    エクセルのシートをCSVファイルに保存するため以下のようなマクロを書きました。 Sub Macro1() Cells.Select Selection.Copy Workbooks.Add ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.SaveAs FileName:="C:\WINDOWS\デスクトップ\Book1.csv", FileFormat _ :=xlCSV, CreateBackup:=False ActiveWindow.Close ThisWorkbook.Activate End Sub 一応これで保存できるのですが、自動記録でやったためファイルの名前が出てしまいました。 この部分をわたし以外の誰でも任意の名前をつけ、任意のフォルダーに保存できるように書き換えたいのです。 どのように記述すれば良いかお教えください。お願いします。

  • エクセル:シートを保存するマクロ

    あるエクセルファイルFile.xls内に、4つのシートSheet1,Sheet2,Sheet3,Sheet4があるとして、 4つのシートを個別にcsvファイルとして保存するようなマクロを作りたいです。 ▼ソースです  (ここまでのコードで、Pathに保存先のディレクトリ名を取得する部分があるとお考えください)  Filename = "Sheet1" '保存するシート名は、Sheet1~4 GoSub Save1 Filename = "Sheet2" GoSub Save1 Filename = "Sheet3" GoSub Save1 Filename = "Sheet4" GoSub Save1 '保存完了後は、File.xls内Sheet1のCells(4, 1)にカーソルを配置。 Sheets("Sheet1").Select Cells(4, 1).Select Exit Sub Save1: Sheets(Filename).Select fname = Path & "\" & Filename & ".csv" ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV, CreateBackup:=False Return End Sub 以上のソースで実行すると、 指定したディレクトリにsheet1.csv、sheet2.csv、sheet3.csv、sheet4.csvの4ファイルができます。 ここまでは問題ないのですが、 マクロを実行後、Sheet4.csv(最後に保存したファイル)が開かれた状態になってしまいます。 しかも、ファイル名はSheet4.csvなのに、シートSheet1~4を持っている状態です。 普通にSheet4.csvファイルを開くと、シートはSheet4しかありません。 状態が伝わるでしょうか? File.xlsのマクロを実行しているので、実行完了後もFile.xlsを開いておきたいのですが、 どのような記述を加えればよいでしょうか? マクロ(VBA)は使い始めたばかりなので説明されても理解できないかもしれませんが、 できればよろしくお願いいたします。

  • CSV保存マクロ 日付が逆になり困っています。

    マクロに詳しい方、お願いいたします。 エクセルのシートで2018/1/21とセルに記載したものを 下記マクロ(標準モジュールにコード記載)して、CSVで保存しています。 実行後CSVを開くと、21/1/2018になって逆になります。 調べてもわかりません。よろしくお願いします。 Sub Macro1() Application.DisplayAlerts = False main_f = ActiveWindow.Caption out_pass = ActiveWorkbook.Path & "\" Out_name = ActiveSheet.Name Sheets(Out_name).Select Sheets(Out_name).Copy ActiveWorkbook.SaveAs Filename:= _ out_pass & Out_name & ".csv", _ FileFormat:=xlCSV, CreateBackup:=False ActiveWindow.Close Application.DisplayAlerts = True End Sub

専門家に質問してみよう