• ベストアンサー

エクセル2003VBA 新規ブックを作成、保存の時に

いつも勉強させていただいております。 今回、VBAで以下の事をできるのかな?と思い質問させていただきました。 まず、VBAで以下の動作を作成しました。 Aファイル、データーベースCSVファイル Bファイル、VBA記述ファイル 1)Bファイルから、Aファイルを開いて、検索、条件に合うデーター を配列で抽出。 2)新規ブックを追加 3)新規ブックに抽出したデーターを書き出し と言うVBAを作成しました。 で、質問なのですが、新規ブックは保存するか、しないかがその時々に よって任意でするため、VBAで保存の所までは作成していないのですが 、保存する場合、ファイル名に規則性を持たせたいため、ファイル保存 をしたときに表示させる初期ファイル名をBファイルのVBAから変更 させる事はできるのでしょうか? 新規ブックを保存するとき、初期ファイル名は「Book1.xls」となって いると思うのですが、この値を変更することってできますでしょうか? もし可能であれば、ヒントや参考になるHPなど教えていただけないで しょうか。

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

  • ベストアンサー
noname#52504
noname#52504
回答No.4

ご質問の趣旨を取り違えていましたらすみません。 ・自動保存はしない(保存するか否か、事前にはわからない) ・手動で[名前を付けて保存]しようとした場合に  ダイアログで表示されるファイル名を指定したい。  ということですよね。 ●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ココマデ↑-------------------------- もっとスマートな方法がありそうな気もしますが、とりあえずご参考まで。

tmgolf
質問者

お礼

deus_ex_machina様、ご回答ありがとうございました。 今回のコードを試行錯誤している間に本職の業務の方が 多忙となってしまい、課題に取り組めていないのが現状で あります。 ただ、サンプルコードをテストして、解決の糸口が見えて 来ている状態であります。 今後、更に皆様のコードを試行錯誤行いながら、望むもの を作って行きたいと思っております。 ご回答頂き、誠にありがとうございます。

tmgolf
質問者

補足

deus_ex_machina様、ご回答ありがとうございます。 趣旨の点については、ご返答いただいた通りであります。 まだ、サンプルコードの方は現時点でテストできていませんので この後、コードを試して行きたいと思います。 まずは、お礼申し上げます。 皆様のコードをこれから試して、理解していきたいと思いますの で、少しお時間をいただきたく思います。 ありがとうございます

その他の回答 (4)

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

こんにちは。 #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

tmgolf
質問者

お礼

Wendy02様、ご回答ありがとうございます。 また、こちらのお返事が遅くなりまして、申し訳ありません。 現段階で、本職の業務が忙しくなってしまい、VBAの検討について 中途の状態で止まってしまっております。 まだ、現段階で課題をクリアできていませんが、サンプル コードを基にスキルアップしていきたく思っております。 今回の質問については、一度これにて閉じさせていただきます。 毎回、質問のたびにご回答頂き、誠に感謝しております。 ありがとうございます。

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

こんにちは。 #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

tmgolf
質問者

補足

Wendy02様、いつもありがとうございます。 ご提示いただいたコードをテストしながら 再度、考えていきます。 今回、いろいろ現時点で理解できたことを少し 補足説明させていただきますと、 新規ブックを導入したときに得られる仮想ファイル名が、 その後、手動で保存を行おうとしたとき、この仮想ファイル 名が表示されるのであると言う事が理解できました。 このことから、この新規ブックを導入するときに、この 仮想ファイル名に対して処理、もしくは何らかの擬似的操作 を行っていく必要があるのかな? と考えたりしております。 頂いたコードもまだ、現時点ではテストできていませんので、 この後、試行錯誤を行って行きたいと思います。 ご返答頂きありがとうございます。

回答No.2

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 かえってわからなくなったらすみません。

tmgolf
質問者

補足

fumufumu_2006様、ご回答ありがとうございます。 もう一度、皆さんがご提示いただいたコードを 試しながら、自分の理解できていないところを 整理していきたいと思います。

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

こんばんは。 どちらでもよいかもしれませんが、ぱっと見た感じでは、 >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

tmgolf
質問者

補足

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)で指定できないので困っています。

  • 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 どなたが解決方法をご教授いただけませんでしょうか。 よろしくお願い致します。

  • 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") ・・・ かきくけこ よろしくお願いします。

  • 一覧表から一行ごとのデータを別ブックに保存するには?

    あまり使用頻度はないかもしれませんが・・・・ (例) ○元になる一覧表のブック(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?など、何をどう組み合わせたらよいのかがよくわかりません。 アドバイスよろしくお願いします。

専門家に質問してみよう