[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ファイル名の変わるファイル指定2』(初心者なーくん)
いつもお世話になります。 以前に、『ファイル名の変わるファイル指定』 (初心者なーくん)で 教えてもらったマクロで教えて欲しい事があります。
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) With Target If (.Column = 6 Or .Column = 8) And .Count = 1 Then If .Value = "PDF" Or .Value = "DXF" Then FileModule Target End If End If End With End Sub
Sub FileModule(myRng As Range) ' Const FindRootFolder As String = "C:\Documents and Settings\user\デスクトップ\標準\" '・・・・・(1) Const FindRootFolder As String = "C:\test\" '・・・・・(4) Dim FindFileName As String Dim FoundPath As String Dim FileSaveName As String Dim Ans As Long
FindFileName = myRng.EntireRow.Cells(2).Value & myRng.EntireRow.Cells(4).Value & "*." & myRng.Value UserForm1.Show vbModeless FoundPath = GetDirAll(FindRootFolder, FindFileName) Unload UserForm1 If FoundPath = "" Then MsgBox "該当ファイルがありません。", vbExclamation Else Ans = MsgBox("ファイルが見つかりました。" & vbLf & _ "ファイル名 : " & FoundPath & vbLf & vbLf & _ "ファイルを開く" & vbTab & ": はい" & vbLf & _ "ファイルを保存" & vbTab & ": いいえ" & vbLf & _ "処理を中止する" & vbTab & ": キャンセル" & vbLf & vbLf & _ "を押してください。", vbYesNoCancel) Select Case Ans Case vbYes ThisWorkbook.FollowHyperlink FoundPath Case vbNo FileSaveName = Application.GetSaveAsFilename(StrReverse(Split(StrReverse(FoundPath), "\", 2)(0)), _ fileFilter:=myRng.Value & "ファイル, *." & myRng.Value) If FileSaveName <> "False" Then FileCopy FoundPath, FileSaveName End If End Select End If End Sub
Private Function GetDirAll(DirFolder As String, FindFileName As String) As String Const bufPath As String = "C:\myDirBuffer.txt" Dim strCommand As String Dim n As Long Dim buf() As Byte Dim AryBuf As Variant strCommand = "Dir " & DirFolder & " /S/B > " & bufPath CreateObject("WScript.Shell").Run "Cmd /C " & strCommand, 7, True n = FreeFile() Open bufPath For Binary As n If LOF(n) = 0 Then Exit Function ReDim buf(1 To LOF(n)) Get #n, , buf Close n Kill bufPath AryBuf = Split(StrConv(buf, vbUnicode), vbCrLf) For Each C In AryBuf If StrConv(C, vbLowerCase) Like StrConv("*" & FindFileName, vbLowerCase) Then GetDirAll = C Exit For End If Next C End Function
これで、 Const FindRootFolder As String = "C:\test\" '・・・・・(4) の時は問題なく検索ができ、 Const FindRootFolder As String = "C:\Documents and Settings\user\デスクトップ\標準\" '・・・・・(1) では、 MsgBox "該当ファイルがありません。", vbExclamation となります。
1.(1)の状態でマクロを走らした後、(1)をコメントアウトして、(4)の状態でマクロを走らすと MsgBox "該当ファイルがありません。", vbExclamation となります。(4)の状態では問題なく検索できるのに一旦"該当ファイルがありません。"となるとどうにもなりません。 一度ファイルを閉じ、開きなおして(4)ですると検索できます。 なぜですか?どうか教えて下さい。
Excel2003,WindowsXP (初心者なーくん)
久しぶりなコードですね。 え〜っと、私のちょんぼだと思いますが
Open bufPath For Binary As n If LOF(n) = 0 Then Exit Function ReDim buf(1 To LOF(n)) Get #n, , buf Close n
のコードのここで If LOF(n) = 0 Then Exit Function 中身が無い時にExitしてしまってるので Close n を通らないためにリダイレクトで出力したファイルが開いたままで 書き込みできない状態になってしまっていますね。(すみません)
GetDirAllファンクションの該当部分を
Open bufPath For Binary As n If LOF(n) <> 0 Then ReDim buf(1 To LOF(n)) Get #n, , buf End If Close n
のように書き換えてみてください。 あと、補足ですがデスクトップのパスは Const FindRootFolder As String = "C:\Documents and Settings\user\デスクトップ\標準\" とすると、PCやユーザーによって違うので
Dim FindRootFolder As String FindRootFolder = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\標準\"
とするのが一般的です。 (momo)
(momo)さん、また覗いていただいてありがとうです。
>のように書き換えてみてください。 できました。
>Dim FindRootFolder As String >FindRootFolder = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\標準\" >とするのが一般的です。 了解です。(以前にも教えてもらっていましたね。)
ですが、やっぱり "該当ファイルがありません。" となります。
今、新発見した事があります。 Const FindRootFolder As String = "C:\te st\" とフォルダ名にスペースがあると "該当ファイルがありません。" となります。 本番のフォルダにも途中のフォルダ名にスペースがあります。 Const FindRootFolder As String = "C:\Documents and Settings\user\デスクトップ\標準\" これも Documents and Settings にスペースがあるし・・・。 教えていただいたマクロはフォルダ名にスペースがあると"該当ファイルがありません。" になりますか? (初心者なーくん)
そうですね、コマンドラインだとスペースがあると見つからないですね。 対策としては
>strCommand = "Dir " & DirFolder & " /S/B > " & bufPath
の1行を
If DirFolder Like "* *" Then ChDrive Split(DirFolder, ":")(0) ChDir DirFolder strCommand = "Dir " & " /S/B > " & bufPath Else strCommand = "Dir " & DirFolder & " /S/B > " & bufPath End If
にしてみてください。
内容は、もしスペースが入っていたらカレントディレクトリを変更して カレントディレクトリに対してDirを打つようにしています。 (momo)
あ、良く考えたら
>strCommand = "Dir " & DirFolder & " /S/B > " & bufPath を strCommand = "Dir """ & DirFolder & """ /S/B > " & bufPath
にするだけで大丈夫なはずです。 パスを""で囲む。です (momo)
ありがとうございます。 両方出来ました。また1つ便利になりました。(前回モヤモヤしてたのがスッキリしました)
理解できるにはまだまだ時間がかかりそうです。 "" & DirFolder & "" でどう言う意味になるんですか?
(初心者なーくん)
出来ましたか。よかったです。
>"" & DirFolder & "" でどう言う意味になるんですか?
こんなコードで試してみるとわかりますかね?
Sub test() Dim a As String a = "TEST"
MsgBox "普通は " & a & " と表示されます" MsgBox "今度は """ & a & """ 何か増えていますよね?" End Sub
「"」を付け加えるのに「""」と2つ続けるのがVBAでの決まりなのです。 (momo)
(momo)さん、ありがとうです。
>そうですね、コマンドラインだとスペースがあると見つからないですね。 >対策としては >あ、良く考えたら >>strCommand = "Dir " & DirFolder & " /S/B > " & bufPath >を >strCommand = "Dir """ & DirFolder & """ /S/B > " & bufPath >にするだけで大丈夫なはずです。
>普通は TEST と表示されます >今度は "TEST" 何か増えていますよね? "TEST"とする事でスペースを認識させれるんですか?
(初心者なーくん)
私用で返信が遅れました。
VBAでというより、Shellを使っているのでDOSコマンドでの扱いになります。 DOSでは""で挟むことでディレクトリ名などのスペースが使えます。 (momo)
(初心者なーくん)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.