- ベストアンサー
エクセル2003VBA 新規ブックを作成、保存の時に
いつも勉強させていただいております。 今回、VBAで以下の事をできるのかな?と思い質問させていただきました。 まず、VBAで以下の動作を作成しました。 Aファイル、データーベースCSVファイル Bファイル、VBA記述ファイル 1)Bファイルから、Aファイルを開いて、検索、条件に合うデーター を配列で抽出。 2)新規ブックを追加 3)新規ブックに抽出したデーターを書き出し と言うVBAを作成しました。 で、質問なのですが、新規ブックは保存するか、しないかがその時々に よって任意でするため、VBAで保存の所までは作成していないのですが 、保存する場合、ファイル名に規則性を持たせたいため、ファイル保存 をしたときに表示させる初期ファイル名をBファイルのVBAから変更 させる事はできるのでしょうか? 新規ブックを保存するとき、初期ファイル名は「Book1.xls」となって いると思うのですが、この値を変更することってできますでしょうか? もし可能であれば、ヒントや参考になるHPなど教えていただけないで しょうか。
- tmgolf
- お礼率80% (56/70)
- オフィス系ソフト
- 回答数5
- ありがとう数4
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ご質問の趣旨を取り違えていましたらすみません。 ・自動保存はしない(保存するか否か、事前にはわからない) ・手動で[名前を付けて保存]しようとした場合に ダイアログで表示されるファイル名を指定したい。 ということですよね。 ●A案:新規ブックを作成する際、まずテンプレを作り、それから作成する ちょっとトリッキーですが、手軽な近似案として。 動作の概要 "ほにゃららX"という名前の新規ブックを作成する(Xは連番) Bファイル(VBA記述ファイル)上に記述して、 新規ブック作成時に動作させることを想定しています。 連番がついてしまう点に目をつぶれば、ご要望に近い動作かと思います。 '----------↓ココカラ↓---------- Sub Sample() myStr = "ほにゃらら" & ".xlt" Workbooks.Add.SaveAs myStr Workbooks.Add myStr Kill myStr End Sub '----------↑ココマデ↑---------- ●B案:新規作成するブックにイベントドリブンマクロを仕込む 「マクロでマクロをいじる」のはいろいろと微妙な問題が絡むので、、 あらかじめマクロを記述したブックをテンプレとして用意しておき、 そのテンプレから新規ブックを作成するのが簡単かと思います。 マクロは ・新規ブックを作成してファイル名を渡すマクロ:B1 ※Bファイル(VBA記述ファイル)側 ・保存のタイミングを捉えてダイアログを制御するマクロ:B2 ※テンプレ=新規ブック側 に分かれます。 ファイル名の渡し方については、 隠しセル,名前,DocumentProperty等いろいろ考えられますが、 とりあえず例として、ブックのプロパティの[タイトル]を使いました。 動作の概要(B1) [C:\myBook.xlt]から、マクロ付き新規ブックを作成し、 ファイルのプロパティ[タイトル]にファイル名を記述する。 ↓Bファイル(VBA記述ファイル)上に記述して新規ブック作成時に動作させる '-------------------↓B1ココカラ↓------------------- Sub Sample2() myStr = "ほにゃらら" Set mybook = Workbooks.Add("C:\myBook.xlt") mybook.BuiltinDocumentProperties("Title") = myStr End Sub '-------------------↑B1ココマデ↑------------------- 動作の概要(B2) [名前をつけて保存]しようとしたら、 [タイトルプロパティに記述されている文字列]をファイル名としてダイアログを開く。 ↓これをThisWorkbookモジュールに記述したテンプレートを、 myBook.xlt(拡張子に注意)という名前でCドライブルート直下に用意しておく。 '--------------------------↓B2ココカラ↓-------------------------- Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If SaveAsUI Then Cancel = True myStr = ThisWorkbook.BuiltinDocumentProperties("Title") With Application .EnableEvents = False .Dialogs(xlDialogSaveAs).Show myStr .EnableEvents = True End With End If End Sub '--------------------------↑B2ココマデ↑-------------------------- もっとスマートな方法がありそうな気もしますが、とりあえずご参考まで。
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #3の回答者です。たぶん、マクロは、これからも勉強されるのなら、一つ別の方法も紹介しておきます。 インスタンスを設ける方法です。 ただし、二重のインスタンスは、同じものがぶつからないようにしてください。 Application は、Application だけにしてください。 '------------------------------------------- 'Class1 Public WithEvents App As Application 'ベース名 Private Const BASENAME As String = "AAA" Private Sub App_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean) Cancel = True Application.EnableEvents = False If Not Wb.Name Like "*.*" Then Application.Dialogs(xlDialogSaveAs).Show BASENAME, 1 Else Cancel = False End If Application.EnableEvents = True End Sub Private Sub Class_Terminate() Set App = Nothing End Sub '------------------------------------------- '標準モジュール Public myClass As New Class1 Sub Auto_Open() Set myClass.App = Application End Sub
お礼
Wendy02様、ご回答ありがとうございます。 また、こちらのお返事が遅くなりまして、申し訳ありません。 現段階で、本職の業務が忙しくなってしまい、VBAの検討について 中途の状態で止まってしまっております。 まだ、現段階で課題をクリアできていませんが、サンプル コードを基にスキルアップしていきたく思っております。 今回の質問については、一度これにて閉じさせていただきます。 毎回、質問のたびにご回答頂き、誠に感謝しております。 ありがとうございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #1の回答者です。 >VBAで導入した新規エクセルbookに対して保存する場合のときに(Ctrl + S) をしたときに表示されるファイル名の初期値を変更することが可能なのかな?と考えております。 もう一度、質問を最初から読み直してみました。正直なところ、どうも良く分かりません。 新規ファイル作成自体は、あくまでも、Book1,Book2,... という仮想の名前のはずです。「Ctrl + S 」は、上書き保存するときのショートカットですが、仮想の名前のときは、上書きを自動的にされずに、名前の変更を聞いてくるという仕組みになっているかと思います。 その時に、たとえば、日付ファイル名にするとか、CSV のベース名を拾うとか、具体性が必要です。また、同一のベースの名前があって、その後に、枝番を取っていくとか、それなりに別のテクニックが存在しています。 サンプルを一つ示しておきます。以下は、マクロブックを再読み込みするか、Auto_Open を実行すれば、キーが、設定されますから、現在の段階では、Ctrl + S に対して、CSV ファイルを開いているときだけに、別の名前を付けることが可能です。ActiveWorkbook は、新規のブックです。 こういうことではないというと、今度は、新規ブックに対してインスタンスを設けなくてはなりません。 '標準モジュールのみ Sub Auto_Open() Application.OnKey "^s", "SaveNameChange" End Sub Sub Auto_Close() Application.OnKey "^s" End Sub Sub SaveNameChange() Dim wb As Variant Dim Fn As String For Each wb In Workbooks If StrConv(wb.Name, vbUpperCase) Like "*.CSV" Then Fn = Mid$(wb.Name, 1, Len(wb.Name) - 4) Exit For End If Next wb If Fn <> "" And Not (StrConv(ActiveWorkbook.Name, vbUpperCase) Like "*.*") Then Fn = Fn & ".xls" Application.Dialogs(xlDialogSaveAs).Show Fn, 1 Else Application.CommandBars.FindControl(, 3).Execute End If End Sub
補足
Wendy02様、いつもありがとうございます。 ご提示いただいたコードをテストしながら 再度、考えていきます。 今回、いろいろ現時点で理解できたことを少し 補足説明させていただきますと、 新規ブックを導入したときに得られる仮想ファイル名が、 その後、手動で保存を行おうとしたとき、この仮想ファイル 名が表示されるのであると言う事が理解できました。 このことから、この新規ブックを導入するときに、この 仮想ファイル名に対して処理、もしくは何らかの擬似的操作 を行っていく必要があるのかな? と考えたりしております。 頂いたコードもまだ、現時点ではテストできていませんので、 この後、試行錯誤を行って行きたいと思います。 ご返答頂きありがとうございます。
- fumufumu_2006
- ベストアンサー率66% (163/245)
ANo.1さんが >新規でブックを開いたときは、まだ、本当は、".xls" の拡張子はついていません。保存して初めて拡張子がつきます。 と説明した後にサンプルも書いていますが、若干操作をしているため、 捕捉で、 >を招いてしまいました。もしくはご回答していた >だいた内容を自分が理解できていないのかも >しれません。 となっているのではないでしょうか? もっと直観的に、以下を試してみると、わかると思います。 特に、2回目以上実行すると、1回目との違いがわかると思います。(必ずしも「Book1.xls」ではない) 2回目以降は上書きするか聞いてくるので、「はい」を選んでください。 Sub test() Dim 新規のブック As Workbook Set 新規のブック = Workbooks.Add MsgBox 新規のブック.Name '<-とりあえずつけられた名前 新規のブック.SaveAs Filename:="c:\名前付けのテスト" '"c:\サンプル.xls" でも同じ結果 MsgBox 新規のブック.Name '保存したので、名前が確定して、.xlsも付く 新規のブック.Close End Sub かえってわからなくなったらすみません。
補足
fumufumu_2006様、ご回答ありがとうございます。 もう一度、皆さんがご提示いただいたコードを 試しながら、自分の理解できていないところを 整理していきたいと思います。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 どちらでもよいかもしれませんが、ぱっと見た感じでは、 >1)Bファイルから、Aファイルを開いて、検索、条件に合うデーターを配列で抽出。 >2)新規ブックを追加 逆かなって思います。新規ブックを作って、そのオブジェクトを保持しながら、Aファイルを配列で抽出して掃出し、保存ですね。 >新規ブックを保存するとき、初期ファイル名は「Book1.xls」となって >いると思うのですが、この値を変更することってできますでしょうか? 新規でブックを開いたときは、まだ、本当は、".xls" の拡張子はついていません。保存して初めて拡張子がつきます。 基礎レベルの話ですが、こんな感じですね。 fn = "aaa.csv" BaseFn = Mid(fn, 1, Len(fn) - 4) With Workbooks.Add 'ここでCSVインポート(サブルーチンでも良い) .SaveAs BaseFn & ".xls" '本当は、.xls は要らない End With
補足
wendy02様、いつもご回答ありがとうございます。 自分の質問の仕方が上手く出来ていないため誤解 を招いてしまいました。もしくはご回答していた だいた内容を自分が理解できていないのかも しれません。 今回、VBAでは保存の動作をさせない方向で考えております。 ただ、VBAで導入した新規エクセルbookに対して 保存する場合のときに(Ctrl + S) を したときに表示されるファイル名の初期値を 変更することが可能なのかな?と考えております。
関連するQ&A
- Excel VBA ブックが本当に閉じられた時だけ別のブックを閉じたい
Excel VBA ブックが本当に閉じられた時だけ別のブックを閉じたい A.xls B.xls と二つのブックがあります。 A.xlsが閉じられる時、B.xlsも同時に閉じたいです。 A.xlsに以下のマクロを入れました。 Private?Sub?Workbook_BeforeClose(Cancel?As?Boolean) ?Workbooks("B.xls").Close?SaveChanges:=False End?Sub 問題はA.xlsが保存してない場合、「A.xlsへの変更を保存しますか?」というメッセー ジが 出てきますが、そこでキャンセルを押された場合でもB.xlsが閉じられてしまいます。 A.xlsが本当に閉じられた時だけB.xlsを閉じたいのですが そのようなことは可能でしょうか?
- ベストアンサー
- パフォーマンス・チューニング
- excel vba
テーブル情報に基づきシートをコピーするVBAマクロを記述したい。 ExcelのBook111のSheet1に次のような データが入っています。 (1、2)セルにn=3という数字が入っているものとします。 その数値に合わせて、この場合は3なので Sub Sample01() Workbooks("Book3.xls").Worksheets("booksheet3").Copy After:=Workbooks("Book111.xls").Sheet(1) End Sub のようなつまり、booksheet3なるシートをBook111(固定なBOOK)にコピーしようとしています。 このようなことをVBAで書くにはどうすればいいのでしょうか。 ただしBook名とシート名はあくまでデータの値にもとづいたデータをもってくることになります。 要するに間接参照したデータに基づき処理するのをどのように記述するかという質問です。 A列 B列 1 回数 n=3 2 3 4 Book1.xls book1sheet ←n=1 5 Book2.xls book2sheet ←n=2 6 Book3.xls book3sheet ←n=3 7 Book4.xls book4sheet 8 Book5.xls book5sheet 9 Book6.xls book6sheet ←n=6 10 Abc,xls Defsheet ←n=7
- ベストアンサー
- オフィス系ソフト
- EXCEL VBAについて
VBAでCSVファイルをテンプレートのBBOKに読込むコードを 作り、CSVファイルから読込んだBOOK1データを集計する BOOK2を作成しています。 BOOK1・11/21・・・11/21・・・11/22・・・11/23と続きます A B C D 1 ID 店名 売上 日付 2 1104567 渋谷店 190,809 11/21 3 1102031 新宿店 209,808 11/21 4 1103450 横浜店 108,765 11/21 BOOK2・集計 A B C D E 1 ID 店名 11/21 11/22 11/23 2 1104567 渋谷店 190,809 203,487 3 1102031 新宿店 209,808 340,876 4 1103450 横浜店 108,765 547,627 ※BOOK1とBOOK2のIDの並び順は一致していません。 上記のBOOK1のデータをBOOK2に読込ませたいと考えています。 VLOOKUPやINDEX関数を使用しようかと考えたのですが、日付毎に ファイル名が違うのと、集計のファイルには外部参照をさせたくないと 考えています。 VBAで作成したいコードはBOOK1からBOOK2の日付のセルにIDを検索条件として日付毎のファイルを読込ませたいです。 フォームで日付を入力し、コピーするBOOK2のセルを指定後、BOOK1を選択するためにダイアログボックスを出したいです。 BOOK2のIDを検索条件としてBOOK1から一致する売上セルを抽出するコードだけでもわかれば何とか作成できそうなのですが、 ご教授いただけませんでしょうか?
- ベストアンサー
- オフィス系ソフト
- 新しいBookの作成マクロ
現在使用しているBOOKの一部をクリアして、同じフォルダ内にBOOKの名前だけ変えて年度が変わっても使えるように更新マクロを作成したのですが下のエラ-がでます。 実行時エラ-’70’書き込みできません BOOKを保護している訳でもありませんし、読み込み専用にもなっていません。ご教授ください。 Sub 更新() ' 入力内容を消去 Sheets("シ-ト").Select Range("B3:T65536").Select Selection.ClearContents ’・・・・・・・・・・・・・・・・ FFF:フォルダF11が保存されているフォルダ名 F11:ブックBBBが保存されているフォルダ名 BBB:現在使用しているブック 名 B22:新しく使う(変更後の)ブック名 ’・・・・・・・・・・・・・・・・・・・・・ ’BOOK1(ブック名BBB)を複写してBOOK2(ブック名B22)をつくる FileCopy "D:\FFF\F11\BBB.xls", "D:¥FFF\F11\B22.xls" ’BOOK1の名前をBOOK2へ変更 Name "D:\FFF\F11\BBB.xls" As "D:FFF\F11\B22.xls" 'メニュー画面を表示 Worksheets("初期画面").Activate Range("A1").Select End Sub
- 締切済み
- オフィス系ソフト
- Excel VBA別ブックのシートをコピーするには
Excel2010のVBAで別ブックのシートをコピーしてくる方法 Excelファイル(C:\test\BOOK2.xls)のシート名が TESTというシートを自分のExcelファイル(C:\doc\BOOK1.xls)に コピーするにはどのように記述すればよいのでしょうか。 ・コピー先:自分のExcelファイル(C:\doc\BOOK1.xls) VBAのコードがあるファイルです ・コピー元:C:\test\BOOK2.xlsのTESTシート なお、TESTシートを持つ同じ名前(BOOK2.xls)のファイルが 別フォルダにもあります Workbooks( )の引数にファイル名(BOOK2.xls)は指定できるのですが、 フルパス名(C:\test\BOOK2.xls)で指定できないので困っています。
- ベストアンサー
- Visual Basic
- EXCEL VBA 別ブックから貼り付け
お世話になります。 A、Bという2つのブックがあります。 A.xls データファイル B.xls 処理実行ファイル Bブックを開いてSheet1に置いてあるボタンを押すとファイル洗濯ダイヤログが出てきて、そこで指定したBブックをsrtPathに格納(シートは1つだけ)のBブックのA1から全データをAブックのSheet1に貼り付けたいのです。 下記VBAを書いてみましたがエラーになってうまく動きません。 Workbooks(strPath).Range("A1").Copy ActiveWorkbooks.Worksheets("Sheet1").Range("A1").PasteSpecial どなたが解決方法をご教授いただけませんでしょうか。 よろしくお願い致します。
- ベストアンサー
- Excel(エクセル)
- VBA(Excel):他のブックからシートごと取込みたい
他のブックからシートを取込む(シート名を変更して)VBAがわからないのですが、どなたか詳しい方がいましたら、ご教授下さいませ。 以下を例として、ご回答いただけると幸いです。 よろしくお願いします。 ---------------------------------- 次の3つのブックが存在するとします。 a.xls b.xls c.xls a.xlsにはシートが1つだけあり、シート名は"sheet1"です。 b.xlsにはシートが1つだけあり、シート名は"sheet1"です。 c.xlsにはシートが3つあり、シート名は"sheet1"、"sheet2"、"sheet3"です。 a.xlsにVBAマクロを作り、a.xls上で実行させて、 a.xlsの"sheet1"は残したまま、 b.xlsの"sheet1"のシート名を"sheet1-b"に変更して、 a.xlsのシートとして取込み、 同様に今度は、 a.xlsの"sheet1"、"sheet1-b"は残したまま、 c.xlsの"sheet1"のシート名を"sheet1-c"に変更し、 c.xlsの"sheet2"のシート名を"sheet2-c"に変更し、 c.xlsの"sheet3"のシート名を"sheet3-c"に変更し、 a.xlsのシートとして取込み、 最終的に、a.xlsには、 "sheet1"、"sheet1-b"、"sheet1-c"、"sheet2-c"、"sheet3-c" の、5つのシートが存在するようにしたいのです。 (各シート上のデータは、a.xlsの各シートとしてすべて移行されている) ----------------------------------
- ベストアンサー
- その他(プログラミング・開発)
- エクセルVBAで困っています。
Excell2003でマクロを作成したのですが、思うような結果が出なくて困っています。 どなたかお力をお貸しください。 お願いします。 【作成したマクロ】 Sub テスト() myPath = ThisWorkbook.Path buf = Dir(myPath & "¥データ¥" & "*.xls") Do While buf <> "" Target = "'" & myPath & "[" & buf & "]Sheet1'!R1C1" i = i + 1 Cells(i, 1) = buf Cells(i, 2) = ExecuteExcel4Macro(Target) buf = Dir() Loop End Sub 【設定状況】 ・デスクトップ上に "サンプル.xls" があり、ThisWorkBookに上記マクロを書きました。 ・デスクトップ上に "データ" というフォルダがあり、その中に、"Book1.xls" と "Book2.xls" があります。 ・"Book1.xls" のSheet1のRange("A1")には "あいうえお" が入力されています。 ・"Book2.xls" のSheet1のRange("A1")には "かきくけこ" が入力されています。 【マクロ実行結果】 ・Range("A1") ・・・ Book1.xls ・Range("B1") ・・・ #REF! ・Range("A2") ・・・ Book2.xls ・Range("B2") ・・・ #REF! となってしまいます。 【求めたい結果】 ・Range("A1") ・・・ Book1.xls ・Range("B1") ・・・ あいうえお ・Range("A2") ・・・ Book2.xls ・Range("B2") ・・・ かきくけこ よろしくお願いします。
- ベストアンサー
- その他MS Office製品
- 一覧表から一行ごとのデータを別ブックに保存するには?
あまり使用頻度はないかもしれませんが・・・・ (例) ○元になる一覧表のブック(BOOK_1.xls) 1行目:項目 (A1:一連番号 B1:氏名 C1:住所) 2行目:データ1(A2:1 B2:山田太郎 C2:東京都) 3行目:データ2(A3:2 B3:山田次郎 C3:大阪府) ・ ・ 以降10行目まで同様のデータが入っているとします。 上記のファイルから ○あらかじめ決められた単票形式のブック(FORMAT.xls) A1:一連番号(文字列) B1:空白 A2:氏名(文字列) B2:空白 A3:住所(文字列) B3:空白 を呼び出し ○BOOK_1.xlsの一行目の項目のデータを FORMAT.xlsの B1 B2 B3 の空白部分にコピーペーストし ○BOOK_1.xlsのA2の一連番号の数字をファイル名として取得 し"1.xls"として新規保存をする。 ○そのあとは10行目までその作業を繰り返し、1.xlsから10.xls というファイルを10個作成し終了する 以上のようなことが可能でしょうか? 実際は列数は30程度、行数が1500行程度あり、1500ほどの ファイルができるようになるんですけど・・・。 よろしくおねがいします。
- ベストアンサー
- オフィス系ソフト
- ブックの共有をしているexcelファイルの複製
ブックの共有を設定しているbook1.xlsというexcelファイルがあります。 ブックの共有を行なっているとだんだんデータサイズが肥大化してくるので、その対策として 【1】"book1.xls"のシート単位で全て新しい"book2.xls"にコピーする。 【2】"book1.xls"を別のフォルダへ移動。 【3】"book2.xls"の名前を"book1.xls"に変え、ブックの共有設定を行う。 ということをしています。 これらの作業を自動で行えたらと思うのですが、 タスクスケジューラー?.batファイル?VBA?など、何をどう組み合わせたらよいのかがよくわかりません。 アドバイスよろしくお願いします。
- 締切済み
- その他MS Office製品
お礼
deus_ex_machina様、ご回答ありがとうございました。 今回のコードを試行錯誤している間に本職の業務の方が 多忙となってしまい、課題に取り組めていないのが現状で あります。 ただ、サンプルコードをテストして、解決の糸口が見えて 来ている状態であります。 今後、更に皆様のコードを試行錯誤行いながら、望むもの を作って行きたいと思っております。 ご回答頂き、誠にありがとうございます。
補足
deus_ex_machina様、ご回答ありがとうございます。 趣旨の点については、ご返答いただいた通りであります。 まだ、サンプルコードの方は現時点でテストできていませんので この後、コードを試して行きたいと思います。 まずは、お礼申し上げます。 皆様のコードをこれから試して、理解していきたいと思いますの で、少しお時間をいただきたく思います。 ありがとうございます