マクロ初心者です、パスからファイル名を指定する際にファイル名に変数入れたいのですが変数認識してくれず困っています。
どなたか、どういう風にすれば変数認識するのかご教示お願いします。
'指定額の抽出
Private Const MESSAGE_START = "ファイルの読み込みを開始します" & vbCrLf & "フォルダを選択してください。"
Private Const MESSAGE_FINISH = "ファイルの読み込みが完了しました"
Sub テキスト出力()
'-------------------------------------------------------------------------------------------------------
'処理開始
'-------------------------------------------------------------------------------------------------------
MsgBox MESSAGE_START
'
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = 0 Then Exit Sub
Fol = .SelectedItems(1)
End With
Application.ScreenUpdating = False
Dim Fn
Dim Wb As Workbook
'開始行の指定(データ最終行の次の行
Dim n
n = Cells(Rows.Count, 1).End(xlUp).Row + 1
'セットするシートの指定
Dim w
Set w = Worksheets(1)
Dim a As Variant
'ファイル名(拡張子なし)を取得するためのFileSystemObjectオブジェクト - GetBaseNameメソッド
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Fn = Dir(Fol & "\*.xls*")
Do Until Fn = ""
Set Wb = Workbooks.Open(Fol & "\" & Fn)
Wb.Unprotect
ActiveSheet.Unprotect
w.Range("a" & n).Value = n - 5
w.Range("b" & n).Value = FSO.getbasename(Fn)
a = FSO.getbasename(Fn)
w.Range("c" & n).Value = Wb.Worksheets("R3取込シート").Range("h26").Value
w.Range("a" & n).Resize(1, 3).Borders.LineStyle = xlContinuous
n = n + 1
' Application.DisplayAlerts = False
Wb.Worksheets("R3取込シート").Copy
'↓ここのパスが今の時点でエラーなんです
ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\"a"&".txt"" _
, FileFormat:=xlText
ActiveWindow.Close
Wb.Save
' Application.DisplayAlerts = True
Wb.Close savechanges:=False
Fn = Dir
Loop
Range("A4").Select
MsgBox MESSAGE_FINISH
End Sub
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
#4の回答者です。
私の回答の要点は、FileFormat と Filename の順序を逆にすることだったのですが、それがダメだったのでしょうか。
私は、同じような条件で、何度やってみても、テキスト出力(Windowsタイプなど)では、FileFormat を後にするとエラーが出たし、過去の記録をみても、逆にしていたからなのです。それで、ご指摘したわけなのです。
>「a」の変数の型は何にすべきでしょうか?
常識的にString 型と言いたいのですが、実際、ファイル名は、Variant型のほうが圧倒的に多いはずです。変数の型とかの問題ではなくて、ファイル名そのものだと思います。
なお、ファイル名やパス名は、一旦全体を変数に入れてから、出力に与えたり、その前に、Dir関数などでファイル名をチェックするのは、実務上は一般的です。リテラルでは、どうしても不備が出てきます。
http://dobon.net/vb/dotnet/file/invalidpathchars …
ここで見てみると、ファイル名正規表現で調べろ、となっているのですが、
"[\\x00-\\x1f<>:\"/\\\\|?*]" +
"|^(CON|PRN|AUX|NUL|COM[0-9]|LPT[0-9]|CLOCK\\$)(\\.|$)" +
"|[\\. ]$",
こちらでは、エスケープシーケンスが紛れ込むことはないはずですが、VBA用にファイル名チェッカーも考えてみました。
'//その一部になりますが、ユーザー定義関数で作ります。(仮)
'//ルートからのファイル名の長さもチェックが必要です。(割愛-要再考)
BaseFileName =WorksheetFunction.Clean(BaseFileName)
For Each v In Array(":", "\", "/", "?", "*", "[", "]", "|")
i = InStr(1, BaseFileName, v, vbBinaryCompare)
If i > 0 Then Flg = True: Exit For
Next v
ここのスレに出てくる「ファイル名の」エラーですと、ファイル名エラーチェッカーが必要だと思います。ファイル名の精査するプログラムが一つも入っていないと、実務上はエラーが発生することはあります。
セルからなどで、直接渡すとこのようなことがエラーを発生させますので、難しく考えないで、Application.GetSaveAsFilename を通して、ファイル名チェックを行ったりする人も多いようです。
なお、私は、MsgBoxではなく、Degug.Print で、実際どんな文字列が命令に与えられて、エラーが発生しているのか、調べます。理由は、ルートからのファイル名でも、文字長は決められています。あまりフォルダーが深すぎると、エラーが発生することがあるからなのです。入れてはならない文字やら、後で調べてみないと分からないことがあります。
遅れてすいません
そうですね、逆のところが違ったというよりも
変数を入れたパス名がダメという感じです。
No3の回答のとおり変数のところをrange指定にしたら
エラーが出ませんでしたので、逆でも大丈夫な気もします。
No.6
- 回答日時:
No.3 のお礼にいきなり「' ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & Range("f4") & ".txt", FileFormat:=xlText」が入ってますが、「'」でコメントアウトされているので無視していいということでしょうか?
それとも本当は「ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & Range("f4") & ".txt", FileFormat:=xlText」としたいのでしょうか?
回答ありがとうございます
本当は読み込んだファイル名を出力のファイル名に入れたいので
変数を指定したいのです
とりあえず急場しのぎで出力ファイル名を「何か」にする必要が
あったので「range」で指定したので、無視してください。
No.4
- 回答日時:
こんにちは。
昔の記録を見てみました。昔の私には分かったようです。今の私には、さっぱり理屈が分かりません。確かに、これで出来ました。(^^;
むろん、#3さんのご指摘をパスしてからですが。
まさかですが、
If Dir("D:\Library\Desktop\新しいフォルダー", vbDirectory) = "" Then
MsgBox "フォルダーがありません。", vbCritical
Exit Sub
End If 'Dir の中のフォルダーは、語尾にセパレータ(\)は不要です
'↓エラー部分の書き換え
ActiveWorkbook.SaveAs _
FileFormat:=xlCurrentPlatformText, _
Filename:="D:\Library\Desktop\新しいフォルダー\" & a & ".txt"
ActiveWindow.Close , False
回答ありがとうございます
エラー部分を書き換えたのですが
同じエラーが発生してしまいました。
ちなみに「a」の変数の型は何にすべき
でしょうか?
今は指定せず「Dim aaa」としています。
'↓ここのパスが今の時点でエラーなんです
MsgBox ("D:\Library\Desktop\新しいフォルダー\" & aaa & ".txt")
' ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & Range("f4") & ".txt", FileFormat:=xlText
ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & aaa & ".txt", FileFormat:=xlText
No.3
- 回答日時:
「'↓ここのパスが今の時点でエラーなんです」
のところに「MsgBox("D:\Library\Desktop\新しいフォルダー\" & a & ".txt")」と入れた場合に表示されたものは、思ったとおりのパス名とファイル名になっていますか?
ありがとうございます!
とりあえず、msgboxの中身で確認したところ
パス+ファイル名+拡張子になっていました。
ちなみにrangeをアンパで挟んで指定した、下記コードは
上手くいきました。今使っている変数「aaa」はあえて
型をきめず「Dim aaa」としています。
もはや解明不能って感じです。
'↓ここのパスが今の時点でエラーなんです
MsgBox ("D:\Library\Desktop\新しいフォルダー\" & aaa & ".txt")
' ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & Range("f4") & ".txt", FileFormat:=xlText
ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & aaa & ".txt", FileFormat:=xlText
No.1
- 回答日時:
よく見てませんけど
「ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\"a"&".txt""」ではなく
「ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & a & ".txt"」ではないでしょうか?
回答ありがとうございます
はい、ご指摘の通りなのですが、これでやると下記のエラーがでるので
いろいろとチョコマカ変えています。何を間違っているのでしょうか。
これで実行すると
ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & a & ".txt""" _
, FileFormat:=xlText
下記のエラー
実行時エラー’1004’
ファイルにアクセスできませんでした。次のいずれかを行ってみてください。
?指定したフォルダーがあることを確認します。
?ファイルを含むフォルダーが読み取り専用になっていないことを確認します。
?指定したファイルの名前に次のいずれかの文字もふくまれていないことを確認します:<>?[]:|*
?ファイル名およびパス名が半角で218文字より長くないことを確認します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルvbaでdocuworksprinter...
-
バッチファイル 二つ上のディ...
-
xcopyコマンドの進行状況を表示...
-
開いているファイルを削除し、...
-
ExcelVBAの使い方 ¥の使い方...
-
エクセルVBAで一つ上の階層...
-
【VB.NET】App.configにファイ...
-
【VBA】ExcelマクロでCSVファイ...
-
【VB6】デバイスマネージャを表...
-
パスワード保護されたExcelファ...
-
エクセルのマクロで特定フォル...
-
Eclipse
-
SaveAsの保存先について
-
fopenでのパス指定
-
コマンドプロンプトでファイル...
-
AccessからExcel最小化
-
アプリケーションのインストー...
-
【VBA】複数のtxtファイルから...
-
Excel 相対パス
-
VBA★PDFをPDFアプリで印刷し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイル 二つ上のディ...
-
エクセルvbaでdocuworksprinter...
-
Excel 相対パス
-
エクセルVBAで一つ上の階層...
-
xcopyコマンドの進行状況を表示...
-
初心者powershellのPS1ファイル...
-
【VB.NET】App.configにファイ...
-
【VBA】ExcelマクロでCSVファイ...
-
エクセルのマクロで特定フォル...
-
VBA★PDFをPDFアプリで印刷し...
-
パスワード保護されたExcelファ...
-
SaveAsの保存先について
-
ExcelVBAの使い方 ¥の使い方...
-
Windows PowerShellでscoopコマ...
-
開いているファイルを削除し、...
-
VBS パスに変数を入れたい
-
C#でのProcess.Startと変数path
-
コマンドプロンプトのコピー関...
-
EXCEL(VBA)で指定フォルダ内の...
-
実行ファイルのパスを取得したい
おすすめ情報