プロが教えるわが家の防犯対策術!

マクロ初心者です、パスからファイル名を指定する際にファイル名に変数入れたいのですが変数認識してくれず困っています。

どなたか、どういう風にすれば変数認識するのかご教示お願いします。


'指定額の抽出
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件)

#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 で、実際どんな文字列が命令に与えられて、エラーが発生しているのか、調べます。理由は、ルートからのファイル名でも、文字長は決められています。あまりフォルダーが深すぎると、エラーが発生することがあるからなのです。入れてはならない文字やら、後で調べてみないと分からないことがあります。
    • good
    • 0
この回答へのお礼

遅れてすいません
そうですね、逆のところが違ったというよりも
変数を入れたパス名がダメという感じです。

No3の回答のとおり変数のところをrange指定にしたら
エラーが出ませんでしたので、逆でも大丈夫な気もします。

お礼日時:2016/06/28 15:05

No.3 のお礼にいきなり「' ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & Range("f4") & ".txt", FileFormat:=xlText」が入ってますが、「'」でコメントアウトされているので無視していいということでしょうか?


それとも本当は「ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & Range("f4") & ".txt", FileFormat:=xlText」としたいのでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます
本当は読み込んだファイル名を出力のファイル名に入れたいので
変数を指定したいのです

とりあえず急場しのぎで出力ファイル名を「何か」にする必要が
あったので「range」で指定したので、無視してください。

お礼日時:2016/06/24 10:11

> これで実行すると


> ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & a & ".txt""" _
> , FileFormat:=xlText

2行目「.txt」の右側のダブルクォートは1個で良いのでは?
    • good
    • 0
この回答へのお礼

ご指摘すいません、消し忘れた時のコードを貼り付けてしまっていました
これ取ってもダメなんです。

お礼日時:2016/06/24 09:32

こんにちは。



昔の記録を見てみました。昔の私には分かったようです。今の私には、さっぱり理屈が分かりません。確かに、これで出来ました。(^^;

むろん、#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
    • good
    • 0
この回答へのお礼

回答ありがとうございます
エラー部分を書き換えたのですが
同じエラーが発生してしまいました。
ちなみに「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

お礼日時:2016/06/24 09:34

「'↓ここのパスが今の時点でエラーなんです」


のところに「MsgBox("D:\Library\Desktop\新しいフォルダー\" & a & ".txt")」と入れた場合に表示されたものは、思ったとおりのパス名とファイル名になっていますか?
    • good
    • 0
この回答へのお礼

ありがとうございます!
とりあえず、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

お礼日時:2016/06/24 09:31

「D:\Library\Desktop\新しいフォルダー」は、存在しますか?


など、エラーメッセージに沿って確認してみてください。
または、もともと同じファイルが存在してたりしませんか?
    • good
    • 0
この回答へのお礼

ありがとうございます
ちょっと自分では解決できそうにない感じです
どこで見ても変数は
”スペース&スペース変数スペース&スペース”
で指定する、とありますが、上手くいきません

お礼日時:2016/06/23 13:57

よく見てませんけど


「ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\"a"&".txt""」ではなく
「ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & a & ".txt"」ではないでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます
はい、ご指摘の通りなのですが、これでやると下記のエラーがでるので
いろいろとチョコマカ変えています。何を間違っているのでしょうか。

これで実行すると
ActiveWorkbook.SaveAs Filename:="D:\Library\Desktop\新しいフォルダー\" & a & ".txt""" _
, FileFormat:=xlText

下記のエラー

実行時エラー’1004’
ファイルにアクセスできませんでした。次のいずれかを行ってみてください。
?指定したフォルダーがあることを確認します。
?ファイルを含むフォルダーが読み取り専用になっていないことを確認します。
?指定したファイルの名前に次のいずれかの文字もふくまれていないことを確認します:<>?[]:|*
?ファイル名およびパス名が半角で218文字より長くないことを確認します。

お礼日時:2016/06/23 13:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!