こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

投稿日時 - 2007-03-27 16:44:18

QNo.2870465

困ってます

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

こんばんは。

マクロを始めたばかりなら、別に結果オーライで良いと思いますが、どちらかというと、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

投稿日時 - 2007-03-28 00:18:58

お礼

ありがとうございます。

このコードは、プロのプログラマが昔作ったもので、
勉強のため、解析・修正してみて、と渡されたものです。
(製作者に質問しなかったのは、この人が忙しそうだったから、という理由です。
 変わりに皆さんの手を煩わせて申し訳ありません)

頂いたサンプルをそのまま組み込んで(変数変えて)見たところ、
望んでいたように、保存実行後も実行ファイルを開いておけました。
ただ、よくわからない記述も多々あるので、解析します。

1つは、#1さん、#2さんや、他のサイトでも紹介されていた「.SaveCopyAs」を使っていないので、
どの部分で『保存実行後も実行ファイルを開いておく』を実行しているのかわかりません。
もう1つは、今までは同名のcsvファイルがある場合に「上書きするか」とメッセージが表示されたのですが、
これが出なくなりました(常に強制上書き)。

コメントアウトしたり、見比べてみたりと奮闘中です。

投稿日時 - 2007-03-28 16:40:57

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

こんばんは。#3のWendy02です。

>このコードは、プロのプログラマが昔作ったもので、
>勉強のため、解析・修正してみて、と渡されたものです。

なるほどね。ただ、その書き方は、1985年頃までの書き方です。確か、その後に、構造化できるBASICが出てきたはずです。その後に、Quick Basicになり、VBになっていきました。私は、当時プログラミング言語をどれひとつ分かっていたわけではありませんが。

今回のコードの書き方は、個々にはヘルプで見れば分かりますが、全体の流れは、Excelの癖が見えてないと、分からないです。勉強というなら、ここらは、実用度の高い部分になるので、繰り返しますが、むつかしいです。私の持論ですが、VBAを早く覚えたいなら、一旦、ワークシートの操作は忘れることだ、と考えています。セル、ワークシート、ブックは、すべて複合的な要素があって、とても覚えにくいです。例えば、Sheet とWorksheet だったら、学習段階では、Worksheet が優先するのに、どこにも書かれていないように思います。両方を同時に覚えたら、絶対に混乱します。また、RangeとCells も同じです。私は、Cellsでつまずきました。さっぱり分からなくなりましたから。

回答自体は、いろいろあるのだと思います。しかし、今回、私は、'SaveCopyAs' の方法を考えてみましたが、オブジェクト自体をコピーしているのだから、拡張子を換えても、'SaveCopyAs' では、そのままでは、CSVにはならないように思います。だから、そのブック自体をCSVに変換し、CSVを残して、コピーしたブックは削除しなければならないはずです。それでは、無駄が多すぎます。

投稿日時 - 2007-03-28 21:21:20

お礼

1985年ですか(笑)、
そんな昔に組んだのかな、あのプログラム・・・?

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

色々お世話になりました。

投稿日時 - 2007-03-30 15:24:41

'本題からは外れるが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

投稿日時 - 2007-03-27 17:51:26

お礼

ありがとうございます。
このコードは私がゼロから組んだものではないので、
「Gosub」を使っている理由はわかりませんが、見た目がちょっとカッコイイですね。
使えるように努力します。

SaveCopyAsですが、どうもエラーが出ます。
検索して引っかかったサイトのサンプルを参照しても、SaveCopyAsの後に続く形がまちまちで。
もう少し調べてみます。
検索した所、「元のシートをそのまま表示し続けるには」という、思いっきり同じ内容のサイト(掲示板)を見つけたので、
方法は間違いないようです。

投稿日時 - 2007-03-28 16:29:22

ANo.1

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

投稿日時 - 2007-03-27 17:15:19

お礼

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

投稿日時 - 2007-03-28 16:23:44

あなたにオススメの質問