• ベストアンサー

Excel VBA 開いているブック名を取得してその名前で保存する方法を教えてください

フォルダから不特定のファイル名「FoundFiles(i)」を取得してそのブックを開きます。セルA1が空の場合は、開いた場所と異なるフォルダにそのブックを保存させたいと、なんとか、かんとか作ってみたのですが、保存したファイル名がFoundFiles(i).csvになってしまいます。 もともとcsvを読み込んでいるので、拡張子はcsvで良いのですが、その開いたブック名を取得する方法を教えてください。 いろいろ考えて、変えては見たのですがうまくいきません。 使用しているオフィスはExcel2000です。宜しくお願いします。 ↓前後は省略していますが、こんな感じです。 Workbooks.Open Filename:=.FoundFiles(i) Select Case ThisWorkbooks Case Range("A1") = "" ActiveWorkbook.SaveAs Filename:="C:\WINDOWS\デスクトップ\空\FoundFiles(i)"

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

  • ベストアンサー
  • yukapapa
  • ベストアンサー率60% (60/100)
回答No.4

#2です。 .FoundFiles(i) からファイル名を取り出すなら DIR関数でも良いかと思います。 ActiveWorkbook.SaveAs Filename:="C:\WINDOWS\デスクトップ\空\" & Dir(.FoundFiles(i)) ちなみに FileSearch は問題ありありでOSが変わった時とかに結構苦労しました。 http://support.microsoft.com/kb/259738/ja http://support.microsoft.com/kb/305342/ja http://support.microsoft.com/kb/920229/ja

その他の回答 (4)

  • pulsa
  • ベストアンサー率57% (34/59)
回答No.5

補足の補足みたくなりますが Dir関数にも実は困ったバグがあります http://officetanaka.net/excel/vba/tips/tips69.htm で、確実なのは、Scripting.FileSystemObjectを使って自作するのが確実です 後はFor Eachで、そのFilesをぐるぐるまわして行けば、ファイル名でも拡張子でも、好きに調べられます あと、他の方からも指摘がありましたがタイプミスがあるようですね VBEで ツール→オプション→編集のタブ 宣言を強要するにチェック 今作っているマクロにはモジュールの一番上に Option Explicit と書いて、一度コンパイルしてみてください コンパイルは デバッグ→一番上です

mugigohan
質問者

お礼

Dir関数のこと、色々教えてくださりありがとうございました。Scripting.FileSystemObjectを使ったやり方は今後の課題とさせていただきます。(正直・・・使い方がわからないのでこれから勉強していきます。)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

No2の回答にもあるように提示のコードは質問の件云々以前の問題もあるように思えますが それなりに動作しているということは、たぶんタイプミスなのでしょう。 で、本題。 原因は.FoundFiles(i)にはファイル名だけではなく、パス名も入っているからです。 ですから別フォルダーに保存したいときは、その中からファイル名だけ取り出す必要があります。 ファイル名取り出しの部分だけかくと以下のようになります。 '------使用変数--------------------------------  Dim myFullPath As String  Dim myFileName As String  Dim S As String '--------- ファイル名取り出し ----------------  myFullPath = .FoundFiles(i)  S = StrReverse(myFullPath)  myFileName = Right(myFullPath, InStr(S, "\") - 1) '---------------------------------------------------- 取り出したあと、 ActiveWorkbook.SaveAs Filename:="C:\WINDOWS\デスクトップ\空\" & myFileName とすればいいわけです。  .FoundFiles(i) には必ず、”.”を付加すること 老婆心ながら一言。 寄せられた回答をサクサクと修正できるスキルがある場合は別として、 そうでない場合は、前後を省略することなくそこら辺りのコードをある程度は提示した方がいいと思いますよ。 なぜなら、提示の部分ではなくその省略した部分に原因があるかも知れないからです。 以上。  

  • yukapapa
  • ベストアンサー率60% (60/100)
回答No.2

省略されていて良く解りませんけど、保存する際のファイル名以外は正常に動いているのでしょうか?   Select Case ThisWorkbooks   Case Range("A1") = ""   ActiveWorkbook.SaveAs Filename:="C:\WINDOWS\デスクトップ\空\FoundFiles(i)" この Case を正常に抜けて保存されているならば不思議です。 ThisWorkbook(s)←なんてありませんし、、、   Select Case ActiveWorkbook.Worksheets(1).Range("A1").Value   Case ""   ActiveWorkbook.SaveAs Filename:="C:\WINDOWS\デスクトップ\空\FoundFiles(i)" ならまだ納得も出来ますけど。 --- こういったケースは Open 時に変数に入れてやるとアクティブか否かに関係なく操作できるので便利です。 あと、FileSearch は難ありで個人的に苦労しましたので DIR を使ったサンプルを載せておきます。 エラー処理はしてません。(指定した移動先フォルダが無いなど) Sub Test() Dim fName As String, cfName As String Dim wb As Workbook, flg As Boolean   fName = Dir("C:\Work\*.csv")   Do While fName <> ""     fName = "C:\Work\" & fName  '移動元のフルパス     Set wb = Workbooks.Open(fName)     cfName = "C:\空\" & wb.Name '移動先のフルパス     flg = (wb.Worksheets(1).Range("A1").Value = "")     wb.Close     If flg Then Name fName As cfName     fName = Dir()   Loop End Sub

mugigohan
質問者

お礼

保存する際のファイル名以外は正常に動いているのでしょうか? →今の環境では正常に動いていますが・・・・ DIR を使ったサンプルありがとうございました。 こちらのやり方で作り直してみます。 FileSearch を使ったやり方は問題が多いと皆様から教えていただき本当に勉強になりました。 今まで簡単なものしかつくっていなかったので、今回は大苦戦でした。 まだまだ問題山積ですがあちこち調べながらつくって行きたいとおもいます。 本当にありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>ActiveWorkbook.SaveAs Filename:="C:\WINDOWS\デスクトップ\空\FoundFiles(i)" 変数名を "" で囲ってしまえば文字列ですから、実行結果は正常です。 ActiveWorkbook.SaveAs Filename:="C:\WINDOWS\デスクトップ\空\" & FoundFiles(i)

mugigohan
質問者

補足

\" & FoundFiles(i)として、試して見ましたが、subまたはファンクションが定義されていませんと出てしまいます。 \" & .FoundFiles(i)とするとフォルダが存在しません。のようなメッセージが出てしまいます。 どうしたら良いものでしょうか?

関連するQ&A

  • ExcelのVBAでブックの保存

    ExcelのVBAでブックを追加し保存を行っています。 その際、保存は、どこに行うのがよいのですか bookですか。sheetですか。 両方で、SaveAsができまが、使い分けがあるのでしょうか。 どのように使い分けするのでしょうか。 Workbooks.Add ActiveSheet.Name = "サンプル" ActiveSheet.SaveAs OutFileName ActiveWorkbook.SaveAs OutFileName ActiveWorkbook.Close

  • エクセル VBA についてご教授願います。

    ActiveWorkbook.SaveAs Filename:= "C:\Documents and Settings\ユーザー名\材料明細\" & Range("A1").Value & ".xls" このコマンドで、材料明細に("A1")の値のファイル名で保存しています。 材料明細にいくつかのフォルダがあります。そのフォルダを選択して、("A1")の値のファイル名で保存する方法を教えて下さい。

  • エクセルVBAで 名前を付けて保存の方法、もしくは・・・

    エクセルVBAで名前を付けて保存は、 SaveAsを使って・・・というのは、解っているのですが、 これだと指定した名前しか、保存できないですよね;; 自分的には、エクセルの名前を付けて保存を押すと出てくる、画面を出したいのです。 それか、とあるセルに入っている数字を利用して保存の名前にしたいのですが、どなたかわかる方宜しくお願いいたします。 (本当は下のほうのやり方が良いんですけどね;;) ActiveWorkbook.SaveAs FileName:= ("A1")"月分" 見たいな感じで VBAを打てたら良いのにな・・・と思っています;; 宜しくお願いいたします。

  • 名前の取得のマクロ

    マクロを使って、ファイルの保存をしようと考えています。 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

  • 新しく作成したBOOKを上書き保存

    いつも大変お世話になっております。 新規作成したBOOKを指定の場所に、指定の名前で保存しようとしています。 例)C:\ファイル名.xls 保存したいものの sFileName="C:\ファイル名.xls" WorkbookName="ファイル名.xls" ActiveWorkbook.SaveAs Filename:=sFileName '保存して閉じる Workbooks(WorkbookName & "_" & sNowTime & ".xls").Close SaveChanges:=True 上記のように設定したところ、 既にファイルがある場合はウィンドウが表示されます。 その際、MsgBoxにフルパスで表示されてしまい、大変見づらく困っています。 また、新規作成したブックは必ず上書き保存で良いものになっています。 C:\ファイル名.xls というものが既にある場合は、 メッセージを出さず、上書き保存にしたいと思っています。 下記のように、既にブックがあるかも確認したのですが、 違い?が良く分からず、上手くいきませんでした。 '======================使わない上に、プログラムが間違っているためコメントアウトしてます。=========-- 'Dim buf As String ' buf = Dir(sFileName) 'ファイルの存在を調べる ' If buf <> "" Then ' '保存 ' ActiveWorkbook.SaveAs Filename:=sFileName '保存して閉じる ' ' '=================ファイル作成完了 ' Else ' ActiveWorkbook.SaveAs Filename:=sFileName '保存して閉じる ' Workbooks(WorkbookName & "_" & sNowTime & ".xls").Close SaveChanges:=True ' End If '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 質問内容がぐちゃぐちゃしてきたので、まとめさせて頂きます。 ●新規ブックを指定場所に、指定名で保存したい ●指定場所に指定名のブックがあった場合、メッセージを出さずに上書き保存したい です、よろしくお願いいたします。

  • エクセルでセル値をファイル名にして保存しようと思っています。

    エクセルでセル値をファイル名にして保存しようと思っています。 エクセル2003では以下の方法でセル値を取得して保存しています。 'Cell値を取得 strName2 = Sheets("#######").Range("A1").Value strName3 = Sheets("*******").Range("B2").Value 'strName2の値が空の場合、現在のブック名を代入 If strName2 = "" Then strName = ThisWorkbook.Name 'セル値の結合 sName = strName3 + strName2 '名前を付けて保存] ダイアログ ボックスを表示 fName = Application.GetSaveAsFilename(InitialFileName:=sName, fileFilter:="Excel(*.xls), *.xls") 'ファイル名を取得したら保存 If fName <> False Then ActiveWorkbook.SaveAs fName 同様の操作を2007以降で「マクロを有効にして保存」を行いたいのですが、どの様にすればいいのでしょうか? (自動保存では以下の様になる状態の事です。) ActiveWorkbook.SaveAs Filename:="#:\*******.xlsm", FileFormat:= _ xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False 2007の時の「'名前を付けて保存] ダイアログ ボックスを表示」の方法が分かりません。 共通の命令文では出来でしょうから、最終的にはエクセルのバージョンを取得して、IFで分岐させようと思っています。 宜しくお願い致します。

  • VBA 前月の月の名前でブックを保存

    VBA 前月の月の名前でブックを保存 お世話になっております。 上記の通りです。 今月の月で名前は保存できるのですが、先月の月にすることは可能なのでしょうか? *001.東京 7月分    ↓ *001.東京 6月分 //////現在使用しているコード//////// Dim Filename As String Filename = Range("K1") & "." & Range("A3") & Format(Date, "mm""月分") & ".xls" ActiveWorkbook.SaveAs "保存先" & Filename ActiveWindow.Close 宜しくお願い致します。

  • エクセルVBAでファイルをCSV保存の仕方

    エクセルのシートをCSVファイルに保存するため以下のようなマクロを書きました。 Sub Macro1() Cells.Select Selection.Copy Workbooks.Add ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.SaveAs FileName:="C:\WINDOWS\デスクトップ\Book1.csv", FileFormat _ :=xlCSV, CreateBackup:=False ActiveWindow.Close ThisWorkbook.Activate End Sub 一応これで保存できるのですが、自動記録でやったためファイルの名前が出てしまいました。 この部分をわたし以外の誰でも任意の名前をつけ、任意のフォルダーに保存できるように書き換えたいのです。 どのように記述すれば良いかお教えください。お願いします。

  • シンクライアントでのVBAによるファイル保存

    ExcelのテンプレートファイルにVBAマクロを記述しています。 VBAにより新しいブックを開き、データを作り込んだ後、テンプレートファイルが置かれているフォルダに保存するマクロを作成しました。 リッチクライアント上では問題なく動くのですが、シンクライアント上で実行すると、  ActiveWorkbook.SaveAs Filename:='フルパスのファイル名'  ※フルパスのファイル名は、"C:\folder\file.xlsx"というような形式になっています。 のところでエラーになってしまいます。 パス付きのファイル名について、作法があるようでしたらお教えいただけますか。 よろしくお願い致します。

  • ブックCloseでVBAが続かない

    エクセル2002を使用しています ブック(A)をコピーして名前(B)をつけて別ブックで保存しました ブック(A)を呼び出し後、ブック(B)を閉じてブック(A)のVBAを継続したいのですが 継続しません 作成したモジュールは以下です   Application.DisplayAlerts = False   '【不要なシートを削除する】 Sheets(Array("注文書入手差異表", "入手予定履歴", "main", "営C")).Select ActiveWindow.SelectedSheets.Delete   '【ThisWorkbook.Pathの『注文書確認フォルダ』の中に、名前をつけて別ブックで保存する   '   …ユーザーフォームを使用するのでマクロごと保存】 Dim myFolder As String Dim Filename As String myFolder = ThisWorkbook.Path & "\注文書確認フォルダ" Filename = Format(Date, "yyyymmdd") & "注文書入手予定表" If Dir$(myFolder, vbDirectory) = "" Then MkDir myFolder End If ActiveWorkbook.SaveAs Filename:= _ myFolder & "\" & Filename Application.DisplayAlerts = True '【保存した別ブック名を再取得】 Dim myName0 As String myName0 = ThisWorkbook.Name   '【コピー元のファイルを開く】 Dim myPath As String myPath = Application.Substitute(ThisWorkbook.Path, "\注文書確認フォルダ", "") Workbooks.Open (myPath & "\" & "注文書入手予定表")   MsgBox "【注文書確認フォルダ】の中に別ブックが作成されました"     '【保存した別ブックを閉じる】 Workbooks(myName0).Activate Windows(myName0).Activate ActiveWorkbook.Close '******下のマクロが続かない***************** '====================== Call Macro6 '======================   VBA ステップインで原因を探ろうとしたのでですが   「中断モードでは入力できません」のメッセージがでて   デバッグができません   八方ふさがりの状態です。助けていただけませんか。