• ベストアンサー

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

あるエクセルファイル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)は使い始めたばかりなので説明されても理解できないかもしれませんが、 できればよろしくお願いいたします。

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

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

こんばんは。 マクロを始めたばかりなら、別に結果オーライで良いと思いますが、どちらかというと、Excelの挙動をよく観察されたほうがよいですね。開いたままになるのは、Excelのひとつの仕様なのです。 そういう問題は、何年も付きまとう問題で、もしも、自分で解決するなら、Excelの動きを手作業で確認して、元に戻すような工程を加えるしかありません。そのうちには、いくつかのヒントを自分自身で発見するものなのです。 以下は、サンプルです。意外にこのレベルのものは、いつまで経っても難しいものなのです。 ただし、#2さんのご指摘のように、GoSub などは、Excel VBAの基礎的な範囲の中にはありません。たぶん、プログラミング言語が自信があって書かれているのでしょうけれども、一応、最近のプログラミング言語に慣れるつもりがあるなら、別の方法に換えていったほうがよいです。 私の書いた内容が、決してベストでも参考になるような書き方でもありませんが、最低限のルールは守っているつもりです。 Sub OutputCSV() Dim shn As Variant Dim myPath As String myPath = ThisWorkbook.Path & "\" Application.DisplayAlerts = False For Each shn In Array("Sheet1", "Sheet2", "Sheet3", "Sheet4")  Worksheets(shn).Copy   ActiveSheet.SaveAs Filename:=myPath & shn, FileFormat:=xlCSV, CreateBackup:=False    ActiveWorkbook.Close False Next shn Application.DisplayAlerts = True End Sub

rem_1982
質問者

お礼

ありがとうございます。 このコードは、プロのプログラマが昔作ったもので、 勉強のため、解析・修正してみて、と渡されたものです。 (製作者に質問しなかったのは、この人が忙しそうだったから、という理由です。  変わりに皆さんの手を煩わせて申し訳ありません) 頂いたサンプルをそのまま組み込んで(変数変えて)見たところ、 望んでいたように、保存実行後も実行ファイルを開いておけました。 ただ、よくわからない記述も多々あるので、解析します。 1つは、#1さん、#2さんや、他のサイトでも紹介されていた「.SaveCopyAs」を使っていないので、 どの部分で『保存実行後も実行ファイルを開いておく』を実行しているのかわかりません。 もう1つは、今までは同名のcsvファイルがある場合に「上書きするか」とメッセージが表示されたのですが、 これが出なくなりました(常に強制上書き)。 コメントアウトしたり、見比べてみたりと奮闘中です。

その他の回答 (3)

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

こんばんは。#3のWendy02です。 >このコードは、プロのプログラマが昔作ったもので、 >勉強のため、解析・修正してみて、と渡されたものです。 なるほどね。ただ、その書き方は、1985年頃までの書き方です。確か、その後に、構造化できるBASICが出てきたはずです。その後に、Quick Basicになり、VBになっていきました。私は、当時プログラミング言語をどれひとつ分かっていたわけではありませんが。 今回のコードの書き方は、個々にはヘルプで見れば分かりますが、全体の流れは、Excelの癖が見えてないと、分からないです。勉強というなら、ここらは、実用度の高い部分になるので、繰り返しますが、むつかしいです。私の持論ですが、VBAを早く覚えたいなら、一旦、ワークシートの操作は忘れることだ、と考えています。セル、ワークシート、ブックは、すべて複合的な要素があって、とても覚えにくいです。例えば、Sheet とWorksheet だったら、学習段階では、Worksheet が優先するのに、どこにも書かれていないように思います。両方を同時に覚えたら、絶対に混乱します。また、RangeとCells も同じです。私は、Cellsでつまずきました。さっぱり分からなくなりましたから。 回答自体は、いろいろあるのだと思います。しかし、今回、私は、'SaveCopyAs' の方法を考えてみましたが、オブジェクト自体をコピーしているのだから、拡張子を換えても、'SaveCopyAs' では、そのままでは、CSVにはならないように思います。だから、そのブック自体をCSVに変換し、CSVを残して、コピーしたブックは削除しなければならないはずです。それでは、無駄が多すぎます。

rem_1982
質問者

お礼

1985年ですか(笑)、 そんな昔に組んだのかな、あのプログラム・・・? >VBAを早く覚えたいなら、一旦、ワークシートの操作は忘れることだ、と考えています。 はい、非常に尤もです。 1文1文コメント付けて解析していけばなんとかなるかなーとやっていましたが、 ちょっと甘かったようです。 やりたいことに沿いながら、もう少し初歩的な部分から始めようと思います。 一から勉強する時間は無いけど、モノが出来ないのでは話になりませんから。 色々お世話になりました。

回答No.2

'本題からは外れるがGosubを使うよりも '別なサブルーチンとして定義してしまった方がよいと思う。 Sub hoge() Dim PathString As String PathString = "C:\hoge" Save1 PathString, "Sheet1" Save1 PathString, "Sheet2" Save1 PathString, "Sheet3" Save1 PathString, "Sheet4" '保存完了後は、File.xls内Sheet1のCells(4, 1)にカーソルを配置。 Sheets("Sheet1").Select Cells(4, 1).Select End Sub Sub Save1(Path As String, FileName As String) Sheets(FileName).Select fname = Path & "\" & FileName & ".csv" ActiveWorkbook.SaveCopyAs (fname) End Sub

rem_1982
質問者

お礼

ありがとうございます。 このコードは私がゼロから組んだものではないので、 「Gosub」を使っている理由はわかりませんが、見た目がちょっとカッコイイですね。 使えるように努力します。 SaveCopyAsですが、どうもエラーが出ます。 検索して引っかかったサイトのサンプルを参照しても、SaveCopyAsの後に続く形がまちまちで。 もう少し調べてみます。 検索した所、「元のシートをそのまま表示し続けるには」という、思いっきり同じ内容のサイト(掲示板)を見つけたので、 方法は間違いないようです。

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

セーブのメソッドとして  .SaveCopyAs を使用すると元のブックが開いた状態になります

rem_1982
質問者

お礼

ありがとうございます。 「.SaveCopyAs」で検索をかけたところ、同じような記事を発見することができ、 この方法で間違い無いと思うのですが、 ちょっとまだ記述の仕方がわからない状態です。 現状 .SaveAs の部分を .SaveCopyAs にするだけではダメのようで。 「.SaveCopyAs」で検索した結果にも色々サンプルはあったのですが、どうも引数が違うとのエラーが出ます。 もう少し調べます。

関連するQ&A

  • エクセル マクロでシートをデスクトップに保存する

    ファイルにある複数のシートの中から、Bシートだけを抜き出してデスクトップに保存するマクロがわかりません。 他のサイトで以下のVBAがあったので参考にしたのですが Cドライブのマイドキュメントに保存されます。 デスクトップに直接保存したいです。 Sub シートコピーR() ' 1.保存したいシートをシートコピーする。 Sheets("Sheet1").Copy ' 2.アクティブシートのセル全体に対して、コピー&値のみ貼り付けをする。 ActiveSheet.Cells.Copy ActiveSheet.Cells.PasteSpecial Paste:=xlPasteValues 'ActiveSheet.Cells.PasteSpecial Paste:=xlPasteFormats Application.CutCopyMode = False ' 3.アクティブブックを保存する。 ActiveWorkbook.SaveAs FileName:="C:\ファイル名.xls" End Sub 教えてください。

  • Excelのマクロで、セル内の文字をファイル名にしたい

    ”プロト.xls”というExcelファイルの中に、以下の動作をするマクロを作成したいのです。 (1)”C:\顧客\顧客納期連絡.xls”というExcelファイルを開き、  それを”C:\顧客\A.csv”という名前のcsvファイルにする。 (2)”C:\顧客\A.csv”を”xxxxxxxxxxxxxxxxxx”(※注1)という名前にしてコピーする。 ※注1:”xxxxxxxxxxxxxxxxxx”の部分は、”プロト.xls”ファイルのSheet”マスター”のセルD9から取得させる。 そのセルは、 C:\顧客\ABCDEF0215.csv と記述しています。 (3)コピー後、”C:\顧客\A.csv”を削除する。 ------------------------------------------------------------------- Sub 顧客納期連絡() ' ' 顧客納期連絡 Macro ' マクロ記録日 : 2010/2/15 ユーザー名 : xxxxxxx ' ' ChDir "C:\顧客" Workbooks.Open Filename:="C:\顧客\顧客納期連絡.xls" ActiveWorkbook.SaveAs Filename:="C:\顧客\A.csv", FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Save ActiveWindow.Close ActiveWorkbook.Save Dim fname1 As String Dim fname2 As String fname1 = "C:\顧客\A.csv" fname2 = Workbooks("プロト.xls"), Sheets("マスター"), Cells("D9") FileCopy fname1, fname2 Kill "C:\顧客\A.csv" End Sub ------------------------------------------------------------------- 上記のマクロを作成したのですが、FileCopyの行で、構文エラーか型に一致していない、 というエラーになりマクロ再生が停止します。 セルの内容をファイル名にしたいのですが、何か良い方法はございませんでしょうか? 私は超初心者なので、何卒宜しくお願い致します。

  • Excel マクロ アクティブシートの指定について

    こんにちは。Excelでマクロを作成しています。あるファイルを開きマクロを実行すると、日々エクスポートしているExcelファイルのシートが開き、自動的にそのシートにピボットテーブルを実行し集計するマクロを作成しています。ファイルの指定はファイル名が毎日日付のファイル名(例:02-12等)になるので、[ファイルを開く]ダイアログを表示させ、そこから指定することにしました。ただ、シート名もファイル名と同じなのですが、どうしてもそのシート名でしか作成できません。現在アクティブなシートにピボットを実行するようにするには、どうすればいいでしょうか。 下記に作成したVBを記載しておきます。 Fname = Application.GetOpenFilename(FileFilter:="Excel ファイル (*.xls), *.xls") ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _ "'02-12'!R1C1:R91C23").CreatePivotTable TableDestination:="", TableName:= _ "ピボットテーブル3", DefaultVersion:=xlPivotTableVersion10 ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1) ActiveSheet.Cells(3, 1).Select ActiveSheet.PivotTables("ピボットテーブル3").AddFields RowFields:=Array("所属名", _ "受付担当者") ActiveSheet.PivotTables("ピボットテーブル3").PivotFields("状況").Orientation = _ xlDataField ・・・ 上記の02-12の部分がシート名になるのですが、このシート名は毎日変化していきます(次の日は、02-13 など)。どのように作成すればいいでしょうか。 よろしくお願いします。

  • エクセルのマクロについて教えてください。

    エクセルのマクロについて教えてください。 Dドライブのaaaというフォルダにある、何百個あるXLSファイルを開いて、カンマを取った後、CSVに保存したいです。 保存の名前はそのままで、拡張子だけをcsvに変えたいです。 エクセルは初級者レベルなのでプログラムも判らないのですが、自分で作ってみました。 Sub Macro20() ' ' Macro20 Macro ' マクロ記録日 : 2010/4/29 ユーザー名 : ' ' Keyboard Shortcut: Ctrl+e ' Application.ScreenUpdating = False '画面更新を一時停止 CChDir ("D:/aaa") 'フォルダー名取得 Filename = Dir(ThisWorkbook.Path & "\*.xls") 'フォルダ内のXLSファイルを検索 Do Until fname = Empty '全て検索 Set wb = Workbooks.Open(myfdr & "\" & fname) 'そのファイルを開きwbとする。 n = n + 1 'カウントしnとする Workbooks.Open Filename:= _ "C:\Documents and Settings\Owner\My Documents\aaa\1.xls" Cells.Select Selection.NumberFormatLocal = "G/標準" ActiveWorkbook.SaveAs Filename:= _ "C:\Documents and Settings\Owner\My Documents\aaa\*.csv", FileFormat:=xlCSV, _ CreateBackup:=False fname = Dir 'フォルダ内の次のCSVファイルを検索 Loop '繰り返す Application.ScreenUpdating = True '画面更新一時停止を解除 MsgBox n & "件を処理しましました。" End Sub ↓ 駄目でした>< アドバイスどうかお願い致します。

  • VBAであるBOOKの「sample」というシートを別BOOKに

    VBAであるBOOKの「sample」というシートを別BOOKに 別Bookにコピーしたいのですが、 ネットを参考にして下記のようにするとエラーになります。 実行時エラー'9' 「インデックスが有効範囲にありません」 と表示されます。 どこが間違っているでしょうか? どなたか教えてください。 ---------------------------------------- Dim NewBook As Workbook Dim fName As String Set NewBook = Workbooks.Add fName = ThisWorkbook.Path & "cp.xls" NewBook.SaveAs Filename:=fName Workbooks("moto.xls").Sheets("ピッキング").Cells.Copy Workbooks(fName).Sheets("Sheet1").Paste Destination:=Cells(1, 1) '<---ここでエラー Workbooks(fName).Save ----------------------------------------

  • マクロVBA特定フォルダーに次々に自動保存する方法

    マクロ初心者です。教えて下さい。 ループでお客様のコードが入力されている限りデータを作成するマクロを作っています。 現在の状態は いちいちファイルを付けて保存のメッセージボックスで「保存」としなければなりません。 AAAのフォルダーに作成されたデータを次々に保存していくにはどうしたら良いですか? (メッセージBOXを出さずに) マクロ実行したら、何もしなくてもAAAフォルダーに全て保存されている状態にしたいです。 宜しくお願い致します。 '名前を付け保存するファイル名の初期設定 Dim Save_File, Save_Filename As String Save_Filename = Sheets("企業別金額サマリ").Range("A3").Value & " 販売実績(5月).xls" '「名前を付けて保存する」ダイアログボックスの表示 Save_File = Application.GetSaveAsFilename(Save_Filename, _ FileFilter:="Excelファイル,*.xls,すべてのファイル,*.*") '名前を付けて保存する ActiveWorkbook.SaveAs Filename:= _ Save_File, FileFormat:=xlNormal, _ Password:="mpd", WriteResPassword:="", ReadOnlyRecommended:=False, _ CreateBackup:=False

  • エクセルマクロ ファイル名を変更したとき

    マクロ初心者です。 データファイルからシートを複写挿入するマクロです。 コピー先ファイル名を都度変更したいのですが、その場合マクロにコピー先ファイル名が入っているのでエラーになります。名前が変わっても実行できるようにするにはどうしたらよいのでしょう? なお、複写元のデータファイルは複写後に閉じます。 Workbooks.Open Filename:="データファイル.xls" Sheets("Sheet1").Copy Before:=Workbooks("コピー先ファイル名.xls").Sheets(1)

  • エクセルマクロでファイルを開いて保存したいです。

    エクセルマクロでファイルを開いて保存したいです。 エクセルファイルでファイル名「編集」という物を開きます。 このSheet1には中央にコマンドボタンが作成して有ります。 このボタンをクリックして以下の作業をマクロで行いたいです。 1.エクセル標準の「ファイルを開く」のメッセージボックスが開く 2.ここは使用者が作業をしてもらう   マイドキュメントだったり、マイネットワークだったり、   (ファイルの種類はCSVにする)   処理をしたいCSVファイルを探してもらい選択後、開くをクリック   例えば20100922.CSVを選択し開くをクリック 3.クリックと同時にそのファイルが展開されて、「編集」のエクセルファイルの   Sheetにシート名「集計」が作成されそのシートにCSVファイルの全内容がセルA1から貼り付く。   さらに登録してあるマクロモジュールで編集処理がされ   マクロを引き継がず、シート「集計」だけを   ファイル名は固定でそのファイル名の後ろに作成日(システム日付)を入れて   参照したCSVファイルの保管場所に保存する。   ファイル名例:売上20100923.xls(売上は固定) 4.エクセル「編集」のファイルからシート「集計」を削除する。 5.メッセージBOXで「編集終了」と表示 次回エクセルファイル「編集」を開くと、コマンドボタンだけである。 また作成された「売上20100923」はマクロがないから開くときに マクロのメッセージは出ない。というようにしたいです。 NO.2のファイルを選択する作業は作業者にしてもらいますが シート1のコマンドボタン1回を押すだけでNO.1~NO.5まで完結させたいです。  NO.3のマクロ処理はマクロの記録でモジュールができています。 このマクロの作成方法と、そのマクロが出来たら その文のどこに作成済みの処理文を入れればいいのかわかりません。 よろしくお願いします。 ここでつまづいています。この後この選択したファイルの全内容が シートの集計に展開されません。 Private Sub CommandButton1_Click() Call 集計 End Sub Sub 集計() FullPath = Application.GetOpenFilename("CSV,*.CSV") If FullPath <> "False" Then Sheets("Sheet1").Select Sheets.Add ActiveSheet.Name = "集計" With ActiveSheet.QueryTables.Add(Connection:="CSV;" & FullPath, Destination:=Range("A1"))   マクロの記録で作成したマクロ   シート"集計"をマクロを引きつかずファイル名売上&システム日付で保存   シート"集計"を削除する

  • 名前の取得のマクロ

    マクロを使って、ファイルの保存をしようと考えています。 CSVファイルをコピーして、Excelファイルに貼り付けて、名前を付けて保存する。 という流れの処理を考えています。 そこで、CSVファイルの名前を取得して、その名前を Excelファイルの名前にしたいのですが、上手くいきません。 Dim filname As String Application.FindFile filname = ActiveWorkbook.Name Namezu = ActiveWorkbook.Name Cells.Select Selection.Copy Windows("000.xls").Activate Sheets("測定データ").Select ActiveSheet.Paste '名前を付けて保存   ActiveWorkbook.SaveAs Filename:= _ "C:\新しいフォルダ\filname.xls", FileFormat:=xlNormal

  • 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 で閉じることができるのですが、 これを記述してもエラーが出ます。 どのように書けばよいのでしょうか。

専門家に質問してみよう