- ベストアンサー
VBAで指定フォルダに複数のセル内容を保存する方法
- VBAを使用して、指定のフォルダに複数のセルの内容を保存する方法について教えてください。
- 保存するファイルの形式を変えるとうまくいかない場合があり、試行錯誤しています。
- pdfでの保存コードがxlmsに変更してもpdfファイルで保存される理由が分かりません。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
>使用するファイル(帳票)の保存場所はサーバ(の顧客別,品種別のフォルダ)にあって、 >これを台帳にして 保存先のフォルダーは、この台帳ごとに固定的に決まっているので ソースコード上の先頭行付近で宣言しておきたい。 保存先のファイル名は、 保存するときに選択しているシートのA1セルの中身とA2セルの中身を結合した名前にしたい。 また、結合するときに、全角スペースを挟みたい。 都合、 >A1には ABC123 と入れてみて、A2にXYZ987として試してみました。 という状態で 保存先を \\Srv01\業務g\応援チーム\見積書\ABC123 XYZ987.xlsm としたいのであれば Sub hozon() Const hozonPath = "\\Srv01\業務g\応援チーム\見積書\" Dim wb As Workbook 'ワークブック Dim ws As Worksheet 'ワークシート '自ワークブック Set wb = ThisWorkbook 'アクティブシート Set ws = ActiveSheet wb.SaveAs Filename:=hozonPath & _ WS.range("A1").value & " " & _ WS.range("A2").value & ".xlsm" End Sub となりましょう。
その他の回答 (7)
- HohoPapa
- ベストアンサー率65% (455/693)
>\\Srv01\業務g\応援チーム\XXXXX\山 海 森 谷.xlsm となることを期待しています。 上記 xxxxx は、何処に埋まっている文字列でしょうか?
補足
最初の質問の例示コードが違っていたために混乱を極めてしまいました。(質問に挙げた例と当方のやりたいことが違ってしまっていたようです) 本当に申し訳ありません。(おそらく当方のやりたいことは回答者様には非常に簡単だと推測するのですが質問が的外れのために膨大な手間をかけさせていると思います) がこの件は簡単に諦められないので、何とか宜しくお願いします。 フォルダもファイル名もプログラムの冒頭で宣言するような表記にしたいのです。 (そろそろ引退の準備を始めていますので) イメージとしては、グラフ化する時に教えていただいた下記のような感じで、フォルダもファイル名もコードの冒頭で指定できれば非常に使いやすいと思ったのでですが、これまた今回のケースでは当てはまらないのでしょうか? フォルダは、フォルダをシフト+右クリックでコピーしたパスをC&Pで転記します。 もしこれも見当違いなら無視してください。 Const MaxRows = 30 'データ範囲に指定する最大行数 Const ColNum1 = 6 '1つ目データ格納列 Const ColNum2 = 8 '2つ目データ格納列 Const SRowNum = 17 'データ開始行番号 Const KoumokuRow = 5 '項目名格納行番号 Const ShNameGD = "入力表" 'データ格納シート名 Const ShNameGr = "成績表" 'グラフ描写シート名
- SI299792
- ベストアンサー率47% (773/1617)
>帳票なのでA1にパスを入れることはできません 上げたプログラムはA1にパスを入れていたのでこうするのかと思いました。 もともと入っていたフォルダと同じフォルダに出力したいなら、 ThisWorkbook.SaveAs ThisWorkbook & "\" & [A2], xlOpenXMLWorkbook にします。 そうでなく、ワークブック別にフォルダを指定したい場合、 1行目を印刷対象外にする。又は非表示にする。 Sheet2を作って、A1にフォルダを入れ、 ThisWorkbook.SaveAs [Sheet2!A1] & "\" & [A2], xlOpenXMLWorkbook にする。という方法があります。 プログラム中に、 Const Path = "\\Srv01\業務g\応援チーム\MyPicture" を入れる方法もありますが、ワークブックにより保存先が違うのなら、お勧めしません。
お礼
<至急>補足で >うまき行きました! と報告しましたが、保存されたファイルは、xlsxでした。 マクロが使えるxlsm形式で保存したいのですが、拡張子をどこで変えるのかわかりません。 全く何が何やら状態で申し訳なく。 Sub Macro1() ' Application.DisplayAlerts = False ThisWorkbook.SaveAs [保存フォルダ!A1] & "\" & [A2] & [C1], xlOpenXMLWorkbook Application.DisplayAlerts = True End Sub ~
補足
本当に何度もお手数をおかけしています。 ご回答のコードを下記にして試してみてうまく行きました! また、フォルダはPCのドライブでもサーバでも問題無く行行きました。何故この場合は区別しなくて良いのか???ですが。 Sub Macro1() ' Application.DisplayAlerts = False ThisWorkbook.SaveAs [保存フォルダ!A1] & "\" & [A2] & [C1], xlOpenXMLWorkbook Application.DisplayAlerts = True End Sub ~~~~~~~~~~~~~~~~~~~~~~~~ 但し、出来ればフォルダの指定はシートの挿入ではなくコード中で指定したいのです。 しかも、行の途中(一部)ではなく、コードの冒頭に。 下記はグラフを自動作成する時の例ですが、 (質問では変に似た例を挙げたので混乱させましたのであえて全く違う例にしましたが、これまた混乱するようなら無視してください) >Const MaxRows = 30 'データ範囲に指定する最大行数 > Const ColNum1 = 6 '1つ目データ格納列 >Const ColNum2 = 8 '2つ目データ格納列 > Const SRowNum = 17 'データ開始行番号 >Const KoumokuRow = 5 '項目名格納行番号 > Const ShNameGD = "入力表" 'データ格納シート名 >Const ShNameGr = "成績表" 'グラフ描写シート名 のように、 Const Path = "\\Srv01\業務g\応援チーム\MyPicture" ’フォルダのパス ConstFileName=”A1” ’ファイル名にしたい内容1 ConstFileName=”C3” ’ファイル名にしたい内容2 ConstFileName=”H5” ’ファイル名にしたい内容2 みたいな書式にしたいのが最初の希望だったのです。 贅沢なようですが、そろそろ引退なので手順書に指定しやすく、誰でも簡単に指定できるようにしたいのです。
- HohoPapa
- ベストアンサー率65% (455/693)
もう一度聞きます。 保存元のブック(操作中)のブックは自身のPCにあって、 これをファイルサーバー上に保存したいということでいいですね? それとも、保存元のブック(操作中)のブックも \\Srv01\業務g\応援チーム\MyPictureフォルダーの中にあるんですか? 保存直前に選択しているシートに添付画像1枚目のように埋まっているとき \\Srv01\業務g\応援チーム\MyPicture\山 海 森 谷.xlsm '(1) となることを期待していますか?それとも、 \\Srv01\業務g\応援チーム\MyPicture\山 海 森 谷.xlsx '(2) となることを期待していますか? 保存直前に選択しているシートに添付画像2枚目のように埋まっているとき \\Srv01\業務g\応援チーム\MyPicture\山 森 谷.xlsm '(1) となることを期待していますか?それとも、 \\Srv01\業務g\応援チーム\MyPicture\山 森 谷.xlsx '(2) となることを期待していますか? (2)の場合、保存先にマクロは含まれません
お礼
操作中のブックは、\\Srv01\業務g\応援チーム\MyPicture でした。 ますます混乱! >それとも、保存元のブック(操作中)のブックも \\Srv01\業務g\応援チーム\MyPictureフォルダーの中にあるんですか? ではなく、\\Srv01\業務g\応援チーム\ の別のフォルダです。
補足
最初のは会社のサーバで質問し、その後自宅のPCのフォルダで質問したため混乱させてしまい申し訳ありません。 ~~~~~~~~~~~~~~~~~~~~~~~~ 保存元のブック(操作中)はサーバの\\Srv01\業務g\応援チーム\MyPictureにあります。 これをサーバ内の\\Srv01\業務g\応援チーム内の既にあるフォルダを指定して、マクロ有効で保存したい、です。 ~~~~~~~~~~~~~~~~~~~~~~~~ >保存元のブック(操作中)のブックは自身のPCに ではなく、サーバ内の「\\Srv01\業務g\応援チーム\MyPicture」です >これをファイルサーバー上に保存したいということでいいですね? サーバ内の原紙とは別のフォルダに保存したい、です >それとも、保存元のブック(操作中)のブックも \\Srv01\業務g\応援チーム\MyPictureフォルダーの中にあるんですか? ではなく、\\Srv01\業務g\応援チーム\ の別のフォルダです。 >保存直前に選択しているシートに添付画像1枚目のように埋まっているとき \\Srv01\業務g\応援チーム\MyPicture\山 海 森 谷.xlsm '(1) ではなく、\\Srv01\業務g\応援チーム\XXXXX\山 海 森 谷.xlsm となることを期待しています。 本当に訳が分からなくて済みません。
- HohoPapa
- ベストアンサー率65% (455/693)
保存元のブック(操作中)のブックは自身のPCにあって、 これをファイルサーバー上に保存したいということでいいですね? >A1には ABC123 と入れてみて、A2にXYZ987として試してみました。 この時に、 \\Srv01\業務g\応援チーム\MyPicture\ABC123\XYZ987.xlsm '(1) \\Srv01\業務g\応援チーム\MyPicture\ABC123XYZ987.xlsm '(2) \\Srv01\業務g\応援チーム\MyPicture\ABC123\XYZ987.xlsx '(3) \\Srv01\業務g\応援チーム\MyPicture\ABC123XYZ987.xlsx '(4) これのどれにしたいですか? (1)、(3)の場合であれば 予めABC123というフォルダーを用意するか、あるいは、 無い場合には、マクロで動的に作成する必要があります。 (3)、(4)であれば、保存先ブックにはマクロが無くなります。 どれにするかでコードの書き方が変わってきます。
お礼
先ほどの補足でご質問に答えていませんでした。 やりたいことは2です。 但し、操作するブックもサーバのフォルダです。 サーバの「各種原紙」のフォルダ中の顧客別のファイルに入力して顧客名のサーバのフォルダに複数のセル内容で保存したい。 でした。 いつもながら知識と文書力のなさでお手数をおかけしますが、これ(汎用性のあるVBA)は何とかしたい課題なので今少しお知恵をお貸しください。
補足
全くお恥ずかしい話ですが、サーバはドライブの1つだという認識でした。 ドライブは¥が1つでサーバは2つ付けることで区別されるのであろう、という認識でした。 そこでやっと自分の要求が分りました。 1.使用するファイル(帳票)の保存場所はサーバ(の顧客別,品種別のフォルダ)にあって、これを台帳にして、顧客別や製品別の帳票を作成します。 2.できた顧客,製品別のファイルをサーバの指定したフォルダにマクロ有効で保存したい。 3. 保存する時のファイル名は複数のセル内容をつなげてファイル名にしたい。(出来れば空白で区切って) 4.できれば式中の一部を変更するのではなく、コードの冒頭で、 サーバのフォルダパス:xxxx??? ファイル名にしたいセル:A1 ファイル名にしたいセル:B4 ファイル名にしたいセル:H5 ファイル名にしたいセル:F6 というように最初に場所を宣言する形で指定できるようにしたい。 同様の帳票は各種あるので上記が出来れば非常に汎用性が出ると思い質問させてもらいました。 NETでは同様のコードが一杯あるのですが使いこなせませんでした。(確かにドライブとサーバの区別が付かない人は対象外だと思います) 今少しお付き合いください。
- SI299792
- ベストアンサー率47% (773/1617)
A1: \\Srv01\業務g\応援チーム\MyPicture A2: ファイル名 が入っているのでしょうか。 という事は、サーバですか。 サーバにドライブはありません、このままでは、フォルダは K:\\\Srv01\業務g\応援チーム\MyPicture となり、エラーになります。 hozonPath & は外して下さい。 フォルダを作る必要はないのですね。 私は長いプログラムが嫌いなので、単純に ' Sub Macro1() ' Application.DisplayAlerts = False ThisWorkbook.SaveAs [A1] & "\" & [A2], xlOpenXMLWorkbook Application.DisplayAlerts = True End Sub にします。 サーバでない場合、 A1: K:\Srv01\業務g\応援チーム\MyPicture にすればよく、どちらも対応できます。 なお、既にファイルがある場合、メッセージを表示せず、いきなり上書きされます。メッセージが必要なら、補足に書いて下さい。
補足
朝一で試してみてうまく行きました。 但し、今回はファイルは帳票なのでA1にパスを入れることはできません。 ファイルはサーバ上のフォルダにあって、保存は別の指定したフォルダに入れたいのですが、製品別に指定したフォルダに保存されるようにしたいのです。 具体的には顧客ごとの原紙に入力してそれを顧客名のフォルダをコード中で指定して、指定した複数のセルの内容で、マクロ有効なファイルで保存したいのです。 当方フォルダとドライブの違いが分かっていないことに今回気づいたレベルですので大目に見てやってください。
- HohoPapa
- ベストアンサー率65% (455/693)
A1セル、A2セルに埋まっている値を教えてください。 また、エラーメッセージを教えてください。 提示のコードは、 \\Srv01\業務g\応援チーム\MyPicture の下階層に、 A1セルに埋まっている中身と同名のフォルダーが すでに作成したある前提です。 このフォルダーがもしなかった場合には、 VBAでこのフォルダーの作成もすることを期待していますか?
お礼
先ほどのお礼に対する訂正です。 シート上(A1)にフォルダのパスは入れられません。 サーバのフォルダのパスはコードの最初で宣言して、複数のセル内容をファイル名にしたい、です。 ウッカリA1にパスが入っている前提の質問に2と回答してしまいました。
補足
早々のご回答ありがとうございます。 当方やはり本当に基本的なことが抜けているようです。 自宅なのでダミーファイル(book1)で試してみているのですが、 目的のフォルダのパスは "C:\Users\tsukasa akira\Desktop\見積書" で、この見積書の中にABC123というフォルダを作っておきました。 A1には ABC123 と入れてみて、A2にXYZ987として試してみました。 結果は、「マクロ無しのブックに保存できません」と見慣れたMsgがでて、これに「はい」でも「いいえ」でも、「1004:アプリケーション定義またはオブジェクトの定義エラーです」と出ます。 先ほどまではA1、A2共にファイル名のつもりで試行錯誤しており、その時には、「パス、またはファイル名が違っています」みたいなMsgが出たこともありました。 このコードはA1に保存するフォルダ名を入れるようになっているのですね? 当方の希望は、「パスのコピー」で取ったフォルダ 「 "C:\Users\tsukasa akira\Desktop\見積書"」 の見積書のフォルダに、A1、B2、H3というようにファイル名を付記して保存したいのです。 やりたいことが分かっていただけるでしょうか? コードがすでにあるのに何故できないかが理解されるか心配です。
- HohoPapa
- ベストアンサー率65% (455/693)
私だったら以下にします。 Sub hozon() Const hozonPath = "\\Srv01\業務g\応援チーム\MyPicture\" Dim wb As Workbook 'ワークブック Dim ws As Worksheet 'ワークシート 'Dim hozonPath As String 'ドライブ等のパス用 Dim FolName As String 'A1セル用のフォルダ名用 Dim FilName As String 'A2セル用のファイル名用 '自ワークブック Set wb = ThisWorkbook 'アクティブシート Set ws = ActiveSheet 'ドライブ等の名前を変数に 'hozonPath = "K:\" 'A1セルの値を変数に FolName = ws.Range("A1").Value 'A2セルの値を変数に FilName = ws.Range("A2").Value wb.SaveAs Filename:=hozonPath & FolName & "\" & FilName End Sub
補足
毎度お世話になります。 いくつかの保存コードを試行錯誤したのですが、いつも最後の行 ご回答の場合も >wb.SaveAs Filename:=hozonPath & FolName & "\" & FilName で止まります。 最後の行も取っ変えひっかえしてみたのですがダメでした。
お礼
恐らく訳の分からん質問に関わってしまった、と思いながらも見放さずに根気よくご対応くださったことに深く、深く感謝です。 本当~にすみませんでした。
補足
うれしさのあまり、お礼枠にいっぱい書いてしまって、迷惑に気付き、投稿する最後に削除したら「お礼の言葉」が抜けていました。 この度は本当にありがとうございました。 これから汎用に使うことになります。 たまに新しいパスとファイル名に変更する時には毎回試行錯誤していましたのでこれで解決できます。 再度、お手数をおかけし申し訳ありませんでした。