Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1138 / 13645 ツリー ←次へ | 前へ→

【76091】ファイル名に指定された文字が含まれるファイルを集約したい ペンネーム船長 14/9/23(火) 11:32 質問[未読]
【76092】Re:ファイル名に指定された文字が含まれる... カリーニン 14/9/23(火) 18:14 発言[未読]
【76093】Re:ファイル名に指定された文字が含まれる... カリーニン 14/9/23(火) 18:18 発言[未読]
【76095】Re:ファイル名に指定された文字が含まれる... kanabun 14/9/24(水) 12:08 発言[未読]
【76097】Re:ファイル名に指定された文字が含まれる... kanabun 14/9/24(水) 14:26 発言[未読]
【76100】Re:ファイル名に指定された文字が含まれる... kanabun 14/9/24(水) 16:56 発言[未読]
【76103】Re:ファイル名に指定された文字が含まれる... ペンネーム船長 14/9/26(金) 0:50 お礼[未読]
【76104】Re:ファイル名に指定された文字が含まれる... kanabun 14/9/26(金) 1:16 発言[未読]

【76091】ファイル名に指定された文字が含まれるフ...
質問  ペンネーム船長  - 14/9/23(火) 11:32 -

引用なし
パスワード
   【質問】
PC環境:win7、エクセル2010
環境:1.Cドライブ直下にtest1というフォルダーがあります。2.test1フォルダーの中に多数のフォルダーがあります。『A』フォルダー『B』フォルダー『C』フォルダー・・・3.各フォルダーの中に『おはよう.xlsx』『こんにちは1.xlsx』『こんにちは2.xlsx』『ようこそ5.xlsx』・・・など多数のファイルがあります。
やりたい事:各フォルダー(『A』『B』『C』・・・)の中のファイル名に『こんにちは』の文字の入ったエクセルをCドライブ直下のtest2にコピーしたい。

For Each 〜 In 〜
  Dim FSO As Object
  Set FSO = CreateObject("Scripting.FileSystemObject")
  FSO.CopyFile "C:\test1\(フォルダー名)\*こんにちは*.xlsx", "C:\test2\"
  Set FSO = Nothing
Next

行き詰ってます。宜しくお願いします

【76092】Re:ファイル名に指定された文字が含まれ...
発言  カリーニン  - 14/9/23(火) 18:14 -

引用なし
パスワード
   Dir関数
でファイル名に特定の文字列が含まれるファイルを抽出できます。

FSOでファイルコピーするのなら、↓が参考になると思います。
ht tp://www.officetanaka.net/excel/vba/filesystemobject/filesystemobject03.htm

【76093】Re:ファイル名に指定された文字が含まれ...
発言  カリーニン  - 14/9/23(火) 18:18 -

引用なし
パスワード
   Dir関数については↓が参考になると思います。

ht tp://officetanaka.net/excel/vba/tips/tips69.htm

【76095】Re:ファイル名に指定された文字が含まれ...
発言  kanabun  - 14/9/24(水) 12:08 -

引用なし
パスワード
   ▼ペンネーム船長 さん:
こんにちは〜

>やりたい事:各フォルダー(『A』『B』『C』・・・)の中のファイル名に『こんにちは』の文字の入ったエクセルをCドライブ直下のtest2にコピーしたい。
>
>  FSO.CopyFile "C:\test1\(フォルダー名)\*こんにちは*.xlsx", "C:\test2\"

一例ですが、
あるフォルダのなかにあるSubFolder は
Dirコマンドのオプションを指定すると取得できます。


'関数 DirFolder を呼び出し、SubFolderを取得し、
' イミディエイト・ウィンドウに表示する例
Sub Try1a()
 Dim fData
 Dim i&
 Dim n&
 
 n = DirFolder("C:\Test1", fData)
 If n = 0 Then Exit Sub
 For i = 1 To n
   Debug.Print i; fData(i)
 Next
End Sub

'関数 DirFolder を呼び出し、SubFolderを取得し、
'各サブフォルダ内の対象ファイルをコピーする例
Sub Try1b()
 Dim fData
 Dim i&
 Dim n&
 Dim Fso As Object
 Const TOP_FOLDER = "C:\Test1"
 Const COPY_TO = "C:\Test2"
 
 n = DirFolder(TOP_FOLDER, fData)
 If n = 0 Then Exit Sub
 
 Set Fso = CreateObject("Scripting.FileSystemObject")
 For i = 1 To n
   On Error Resume Next
   Fso.CopyFile fData(i) & "\*こんにちは*.xlsx", COPY_TO
   If Err().Number Then
     Debug.Print fData(i), Err().Description
     Err().Clear
   End If
   On Error GoTo 0
 Next
End Sub


'Dirコマンドのオプション
' /a:D フォルダ(Directory) 属性のみ検索
' /s SubDirも検索
' /b ファイル名のみ表示
Private Function DirFolder(Pathname As String, fData) As Long
  Dim tmpPath As String
  Dim sCmd As String
  Dim ok As Long
  
  tmpPath = Environ$("Temp") & "\Dir.tmp"  '一時ファイルパス
  sCmd = "DIR """ & Pathname & """ /a:D /s /b > """ & tmpPath & """"
  ok = CreateObject("WScript.Shell") _
    .Run("%ComSpec% /C " & sCmd, 7, True) 'Dirコマンド実行

  If FileLen(tmpPath) > 0 Then
    Dim buf() As Byte
    Dim io As Integer
    io = FreeFile()
    Open tmpPath For Binary As io
     ReDim buf(1 To LOF(io))
     Get io, , buf
    Close io
    Kill tmpPath
    fData = Split(vbCrLf & StrConv(buf, vbUnicode), vbCrLf)
    DirFolder = UBound(fData) - 1
  Else
    DirFolder = 0
  End If
End Function

【76097】Re:ファイル名に指定された文字が含まれ...
発言  kanabun  - 14/9/24(水) 14:26 -

引用なし
パスワード
   なんだか FSOで CopyFile すると思いっきり時間がかかるので、
Dirコマンドでファイル名取得して、
VBA組み込みの FileCopy ステートメントでCopyしたほうが多少早いかも?

Sub Try2()
 Dim fData
 Dim i&, j&
 Dim n&
 Dim ss$
 Const TOP_FOLDER = "C:\Test1"
 Const COPY_TO = "C:\Test2"
 
 n = FileSearch(TOP_FOLDER & "\*おはよう*.xlsx", fData)
 If n = 0 Then Exit Sub
 
 For i = 1 To n
   j = InStrRev(fData(i), "\")
   FileCopy fData(i), COPY_TO & Mid$(fData(i), j)
 Next

End Sub

Private Function FileSearch(PathFilename As String, fData) As Long
  Dim tmpPath As String
  Dim sCmd As String
  Dim ok As Long
  
  tmpPath = Environ$("Temp") & "\Dir.tmp"  '一時ファイルパス
  sCmd = "DIR """ & PathFilename & """ /s /b > """ & tmpPath & """"
  ok = CreateObject("WScript.Shell") _
    .Run("%ComSpec% /C " & sCmd, 7, True) 'Dirコマンド実行

  If FileLen(tmpPath) > 0 Then
    Dim buf() As Byte
    Dim io As Integer
    io = FreeFile()
    Open tmpPath For Binary As io
     ReDim buf(1 To LOF(io))
     Get io, , buf
    Close io
    Kill tmpPath
    fData = Split(vbCrLf & StrConv(buf, vbUnicode), vbCrLf)
    FileSearch = UBound(fData) - 1
  End If
End Function

【76100】Re:ファイル名に指定された文字が含まれ...
発言  kanabun  - 14/9/24(水) 16:56 -

引用なし
パスワード
   どうもFileCopy に時間がかかるようなので、
Windows APIの FileCopyOperation 使って Copyするサンプル書いてみました。
ウラ(画面の)でコピーしていると不安になるけど、コピーの情況が出るので、
同じ時間がかかっても安心できます(^^

'---------------------------------------------- 新しい標準モジュール
Option Explicit
Declare Function FileCopyOperation Lib "shell32.dll" Alias _
    "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
    
Type SHFILEOPSTRUCT
  hwnd As Long
  wFunc As Long
  pFrom As String
  pTo As String
  fFlags As Integer
  fAnyOperationsAborted As Boolean
  hNameMappings As Long
  lpszProgressTitle As String
End Type

Public Const FO_DELETE = &H3
Public Const FOF_ALLOWUNDO = &H40
Public Const FOF_NOCONFIRMATION = &H10
Public Const FO_COPY = &H2

Public Sub opFileCopy(SrcFile As String, DestFile As String)
  Dim FT As SHFILEOPSTRUCT
  Dim ok As Long
  
  FT.hwnd = Application.hwnd
  FT.fFlags = FOF_ALLOWUNDO + FOF_NOCONFIRMATION
  FT.wFunc = FO_COPY
  FT.pFrom = SrcFile
  FT.pTo = DestFile
  
  ok = FileCopyOperation(FT)
    
End Sub

Private Function FileSearch(PathFilename As String, fData) As Long
  Dim tmpPath As String
  Dim sCmd As String
  Dim ok As Long
  
  tmpPath = Environ$("Temp") & "\Dir.tmp"  '一時ファイルパス
  sCmd = "DIR """ & PathFilename & """ /s /b > """ & tmpPath & """"
  ok = CreateObject("WScript.Shell") _
    .Run("%ComSpec% /C " & sCmd, 7, True) 'Dirコマンド実行

  If FileLen(tmpPath) > 0 Then
    Dim buf() As Byte
    Dim io As Integer
    io = FreeFile()
    Open tmpPath For Binary As io
     ReDim buf(1 To LOF(io))
     Get io, , buf
    Close io
    Kill tmpPath
    fData = Split(vbCrLf & StrConv(buf, vbUnicode), vbCrLf)
    FileSearch = UBound(fData) - 1
  End If
End Function

Sub Try3()
 Dim fData
 Dim i&, j&
 Dim n&
 Dim ss$
 Const TOP_FOLDER = "C:\Test1"
 Const COPY_TO = "C:\Test2"
 
 n = FileSearch(TOP_FOLDER & "\*a*.csv", fData)
 If n = 0 Then Exit Sub
 
 For i = 1 To n
   j = InStrRev(fData(i), "\")
   opFileCopy CStr(fData(i)), COPY_TO & Mid$(fData(i), j)
 Next

End Sub

【76103】Re:ファイル名に指定された文字が含まれ...
お礼  ペンネーム船長  - 14/9/26(金) 0:50 -

引用なし
パスワード
   ▼kanabun さんへ:
kanabunさん有難う御座いました。
やりたい事が予想以上に(私にとって)高度な内容だったので、驚いています。
やはり、お手伝いいただかなければ自分では到底作れませんでした。
try2が使いやすそうだったので、これを仕事用に変更し、実行してみたところ、望み通りの動作をしてくれました。本当に感謝いたします。全てを理解出来ていませんが、多少の変更をして動かせるようになったのは、私にとっても喜びです。
kanabunさんというニックネームは、もしかしたら、エクセルラウンジでもお世話になった方ではないかと思います。ひと違いであったら、スミマセン。いずれにしても、今後とも宜しくお願いいたします。

【76104】Re:ファイル名に指定された文字が含まれ...
発言  kanabun  - 14/9/26(金) 1:16 -

引用なし
パスワード
   ▼ペンネーム船長 さん:
こんばんは〜

>try2が使いやすそうだったので、これを仕事用に変更し、実行してみたところ、望み通りの動作をしてくれました。
> 全てを理解出来ていませんが、多少の変更をして動かせるようになったのは、私にとっても喜びです。
判りやすさでは Try2() かもしれませんね。
ただ、あとで時間を測定したところ、 Try2が一番時間がかかったのも事実です。

>kanabunさんというニックネームは、もしかしたら、エクセルラウンジでもお世話になった方ではないかと思います。

ラウンジがあんな風になって、大勢の(ラウンジ常連の?)方が、ココや moug に避難
されています。どの板に行っても、同じHNで発言しましょう(^^)

1138 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free