Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2009, 16:26   #1
Rossoman
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 14
По умолчанию Как с помощью FileSystemObject

Как с помощью FileSystemObject сделать следующее:
1) как найти все файлы по маске x??x.txt например

2) как считать в переменные 2 и 4 строку файла dd.txt например

неужели с помощью вба так не сделать?
Rossoman вне форума Ответить с цитированием
Старый 17.10.2009, 17:22   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Можно это сделать только с помощью VBA
Найти все файлы по маске:
Код:
Sub FindFiles()
  'Имя файла
  Dim sFileName As String
  'Путь к папке с файлами
  Dim sPath As String: sPath = "d:\Мои документы\Программы\test\"
  'Маска для файлов
  Dim sMask As String: sMask = "x??x.txt"
  'Сообщение
  Dim sMsg As String
  
  sFileName = Dir(sPath & sMask)
  Do While Len(sFileName) > 0
    sMsg = sMsg & sFileName & vbCrLf
    sFileName = Dir
  Loop
  MsgBox "В папке """ & sPath & """ найдены следующие файлы, соответствующие маске """ & _
          sMask & """:" & vbCrLf & sMsg, vbInformation + vbOKOnly, "Поиск файлов по маске"
End Sub
Чтение из файла нужных строк
Код:
Sub ReadString()
  'Переменные, в которые читать строки. Объявлены как Variant, _
  но если известен тип данных, которые нужно получить из файла, _
  то можно указать этот тип при объявлении
  Dim a, b
  'Содержимое строки
  Dim sLine As String
  'Счетчик строк
  Dim nLineCntr As Long: nLineCntr = 1
  'Идентификатор для файла
  Dim FileNum As Byte
  
  FileNum = FreeFile 'Получаем свободный идентификатор для файла
  'Открываем файл для чтения
  Open "d:\Мои документы\Программы\test\dd.txt" For Input As FileNum
  Do While Not EOF(FileNum)
    Line Input #1, sLine 'Читаем построчно
    Select Case nLineCntr
      Case 2
        a = sLine
      Case 4
        b = sLine
    End Select
    nLineCntr = nLineCntr + 1
  Loop
  Close FileNum
  Debug.Print "a:=" & CStr(a) & " b=" & CStr(b)
End Sub
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 17.10.2009, 18:34   #3
Rossoman
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 14
По умолчанию

спасибо тебе огромное ) еще бы было круто, если бы мне кто-нибудь показал поиск файла по маске, но с поиском по вложенным папкам тоже.
filsesearch не предлагать)

Последний раз редактировалось Rossoman; 17.10.2009 в 18:38.
Rossoman вне форума Ответить с цитированием
Старый 17.10.2009, 19:18   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию поиск файла по маске во вложенных каталогах

Делал я такую штуку, вот мой код, а ты можешь разобраться и подогнать под свои потребности
Код:
Dim scolFilePaths As New Collection 'пути ко всем файлам, которые должна обрабатывать программа
'Перечисление для определения диапазона поиска файлов.
'Можно обойтись и без него, но зачем?
Enum WhichFilesProceed
  wfpOnlyInRootFolder = 0
  wfpInRootAndSubFolders = 1
  wfpOnlyInSubFolders = 2
End Enum
'Получение списка файлов
Sub GetFilePaths(sRootFolderPath As String, sMask As String, WhichFiles As WhichFilesProceed)
  Dim FSO As Object
  Dim oFldr As Object
  Dim oSubFldr As Object
  Dim sFileName As String
  
  Set FSO = CreateObject("Scripting.FileSystemObject")
  
  If Right(sRootFolderPath, 1) <> "\" Then sRootFolderPath = sRootFolderPath & "\"
  
  'Получаем имена файлов из корневого каталога
  If WhichFiles = wfpOnlyInRootFolder Or WhichFiles = wfpInRootAndSubFolders Then
    sFileName = Dir(sRootFolderPath & sMask)
    While Len(sFileName) > 0
      scolFilePaths.Add sRootFolderPath & sFileName
      sFileName = Dir
    Wend
  End If
  
  'Получаем имена файлов из всех подкаталогов
  If WhichFiles = wfpOnlyInSubFolders Or WhichFiles = wfpInRootAndSubFolders Then
    Set oFldr = FSO.GetFolder(Left(sRootFolderPath, Len(sRootFolderPath) - 1))
    For Each oSubFldr In oFldr.SubFolders
      sFileName = Dir(oSubFldr.Path & "\" & sMask)
      While Len(sFileName) > 0
        scolFilePaths.Add oSubFldr.Path & "\" & sFileName
        sFileName = Dir
      Wend
    Next
  End If
  Set FSO = Nothing: Set oFldr = Nothing: Set oSubFldr = Nothing
End Sub
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 17.10.2009, 19:57   #5
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Rossoman.
образцы не решают Вашу задачу, но дают представление о "многих вещах" в том числе о том, что не "только с помощью VBA"....
Евгений.
Вложения
Тип файла: zip ClearFolder.zip (579 байт, 23 просмотров)
Тип файла: zip FileSystemObject.zip (13.3 Кб, 28 просмотров)
Teslenko_EA вне форума Ответить с цитированием
Старый 18.10.2009, 02:36   #6
Rossoman
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 14
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Найти все файлы по маске:
Код:
Sub FindFiles()
  'Имя файла
  Dim sFileName As String
  'Путь к папке с файлами
  Dim sPath As String: sPath = "d:\Мои документы\Программы\test\"
  'Маска для файлов
  Dim sMask As String: sMask = "x??x.txt"
  'Сообщение
  Dim sMsg As String
  
  sFileName = Dir(sPath & sMask)
  Do While Len(sFileName) > 0
    sMsg = sMsg & sFileName & vbCrLf
    sFileName = Dir
  Loop
  MsgBox "В папке """ & sPath & """ найдены следующие файлы, соответствующие маске """ & _
          sMask & """:" & vbCrLf & sMsg, vbInformation + vbOKOnly, "Поиск файлов по маске"
End Sub
Уважаемый, помогите пожалуйста, изменить данный код, чтоб искал с учетом по дате? т.е. сначала например самый поздний файл, который был создан...просто мне именно в таком порядке конечно было бы лучше проводить с ними операции..
Нужно в данном случае использовать массив?

P.S. С вашей помощью я почти переписал свой скрипт)) еще раз спасибо.
Rossoman вне форума Ответить с цитированием
Старый 18.10.2009, 13:10   #7
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Ну, если в лоб, тогда так. Записываем пути к файлам в массив, потом массив сортируем:
Код:
Sub FindFiles()
  'Имя файла
  Dim sFileName As String
  'Путь к папке с файлами
  Dim sPath As String: sPath = "d:\Мои документы\Программы\test\"
  'Маска для файлов
  Dim sMask As String: sMask = "x??x.txt"
  'Сообщение
  Dim sMsg As String
  Dim ar() As String
  ReDim ar(0)
  
  sFileName = Dir(sPath & sMask)
  Do While Len(sFileName) > 0
    ar(UBound(ar)) = sFileName
    sMsg = sMsg & sFileName & vbCrLf
    sFileName = Dir
    If Len(sFileName) <> 0 Then ReDim Preserve ar(UBound(ar) + 1)
  Loop
  'Сортировка методом пузырька
  Dim i As Integer, j As Integer, sTmp As String
  For i = 0 To UBound(ar)
    For j = 0 To UBound(ar) - 1 - i
      If FileDateTime(sPath & ar(j)) < FileDateTime(sPath & ar(j + 1)) Then
        sTmp = ar(j)
        ar(j) = ar(j + 1)
        ar(j + 1) = sTmp
      End If
    Next j
  Next i
  sMsg = Join(ar, vbCrLf)
  MsgBox "В папке """ & sPath & """ найдены следующие файлы, соответствующие маске """ & _
          sMask & """ (самый поздний файл первый):" & vbCrLf & sMsg, vbInformation + vbOKOnly, "Поиск файлов по маске"
End Sub
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 18.10.2009 в 14:26.
viter.alex вне форума Ответить с цитированием
Старый 19.10.2009, 07:09   #8
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
как считать в переменные 2 и 4 строку файла dd.txt например
С применением объекта FileSystemObject это действительно проще. Например, так:
Код:
Sub ReadStrings()
    Dim a As String, b As String, t As String: On Error Resume Next
    t = CreateObject("Scripting.FileSystemObject").OpenTextFile("D:\Мои документы\Программы\test\dd.txt", 1).ReadAll
    a = Application.Clean(Split(t, Chr(10))(1)): b = Application.Clean(Split(t, Chr(10))(3)): ts.Close
    MsgBox a & " : " & b
End Sub
Цитата:
поиск файла по маске, но с поиском по вложенным папкам тоже
Для получения всех подпапок используйте свойство SubFolders метода GetFolder объекта FileSystemObject, и в каждой подпапке для поиска требуемых файлов организуйте цикл Do...Loop, который позволяет использовать маску.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 19.10.2009 в 07:16.
SAS888 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как с помощью Word.... Kotik123 Microsoft Office Word 2 17.06.2009 13:24
Как с помощью Word... Busine2009 Microsoft Office Word 1 09.06.2009 20:19
как решить с помощью формул? Liko Microsoft Office Excel 10 09.12.2008 17:05
как вы думаете можно с помощью delphi написать online игру ну к примеру как muonline 0pex Свободное общение 9 28.06.2007 14:20