powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / FileSearch в 2007-м офисе
10 сообщений из 10, страница 1 из 1
FileSearch в 2007-м офисе
    #35893584
kanalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые!
А как быть с такой функцией в 2007-м офисе? FileSearch в нем не работает:(

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Function FindMaxNumM11InDay(Optional D As Date) As Integer
    FindMaxNumM11InDay =  0 
    If CDate(D) = "0:00:00" Then
        D = Date
    End If
    Set fs = Application.FileSearch
    With fs
        .NewSearch
        .LookIn = AppPath & "\Out"
        .Filename = "M11-" & D & "*.xls"
        If .Execute >  0  Then
            'Нашли. Возвращаем номер последнего файла
            FindMaxNumM11InDay = Mid(.FoundFiles(.FoundFiles.Count), Len(.FoundFiles(.FoundFiles.Count)) -  6 ,  3 )
        Else
            'Ничего не нашли
        End If
    End With
End Function
...
Рейтинг: 0 / 0
FileSearch в 2007-м офисе
    #35893811
kanalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот как-то так получилось:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function FindMaxNumM11InDay(Optional D As Date) As Integer
    Dim fso As New FileSystemObject
    Dim fold1 As Folder
    Dim iFile As File
    
    Set fold1 = fso.GetFolder(AppPath & "\Out")
    
    FindMaxNumM11InDay =  0 
    If CDate(D) = "0:00:00" Then
        D = Date
    End If
    
    For Each iFile In fold1.Files
        If UCase(Left(Right(iFile,  22 ),  15 )) = "M11-" & D & "." Then
            'Нашли. Запоминаем номер...
            FindMaxNumM11InDay = Mid(iFile, Len(iFile) -  6 ,  3 )
       End If
     Next
End Function
...
Рейтинг: 0 / 0
FileSearch в 2007-м офисе
    #35893845
kanalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или лучше так: :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function FindMaxNumM11InDay(Optional D As Date) As Integer
    Dim fso As New FileSystemObject
    Dim fold1 As Folder
    Dim iFile As File
    
    Set fold1 = fso.GetFolder(AppPath & "\Out")
    
    FindMaxNumM11InDay =  0 
    If CDate(D) = "0:00:00" Then
        D = Date
    End If
    
    For Each iFile In fold1.Files
        If Left(iFile.Name,  15 ) = "M11-" & D & "." Then
            'Нашли. Запоминаем номер...
            FindMaxNumM11InDay = Mid(iFile.Name, Len(iFile.Name) -  6 ,  3 )
       End If
     Next
End Function
...
Рейтинг: 0 / 0
FileSearch в 2007-м офисе
    #35893913
kanalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гад:( а теперь он пишет:

Run-time error '-2147319779 (8002801d)':
Automation error
Библиотека не зарегистрирована.


Чего с этим делать?
...
Рейтинг: 0 / 0
FileSearch в 2007-м офисе
    #35894336
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Excel2007 метод .FileSearch хоть и есть в справке, но отключен.

Работает Dir, но лучше использовать FileSystemObject с поздним связыванием:
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

или с ранним связывание, как у Вас в коде, только нужно из VBE-Tools-References установить ссылку на Microsoft Scripting Runtime (файл scrrun.dll)

Кроме того в Вашем коде:
1. AppPath нужно заменить на ThisWorkbook.Path т.к. VBA
2. iFile возвращает путь и имя файла, поэтому условие в цикле не сработает.
Чтобы получить только имя используйте в условии iFile.Name
...
Рейтинг: 0 / 0
FileSearch в 2007-м офисе
    #35894384
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще If CDate(D) = "0:00:00" не случится никогда, т.к. Cdate() как и D As Date означает, по-сути, число типа Double, а не String.
И. наверное, имеет смысл прервать цикл, как только будет найдено совпадение:
Код: plaintext
1.
2.
3.
4.
If If Left(iFile.Name,  15 ) =... Then
  ...
  Exit For
End If
...
Рейтинг: 0 / 0
FileSearch в 2007-м офисе
    #35894407
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для комплектности и вариант с Dir (путь и имя файла подправить)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub Test()
  If Len(Dir("C:\Out\M11-*.xls")) =  0  Then
    MsgBox "Файл найден"
  Else
    MsgBox "Файл не найден"
  End If
End Sub
...
Рейтинг: 0 / 0
FileSearch в 2007-м офисе
    #35895237
ZVI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVIДля комплектности и вариант с Dir (путь и имя файла подправить)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Sub Test()
  If Len(Dir("C:\Out\M11-*.xls")) =  0  Then
    MsgBox "Файл найден"
  Else
    MsgBox "Файл не найден"
  End If
End Sub

Извиняюсь - наоборот. конечно:
Dir("C:\Out\M11-*.xls") выдает пустую строку "" для которой Len()=0 в случае, если файл не найден. А если найден, то Dir() выдает имя файла, длина такой строки больше нуля.
...
Рейтинг: 0 / 0
FileSearch в 2007-м офисе
    #35896833
kanalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем, спасибо. Вот, что получилось в итоге:
Закомментированное пришлось убрать, т.к. требует подключить
"Доверять доступ к объектной модели проектов VBA"... Как это будет у заказчика:( хрен знает.
т.ч. обошелся без этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Public WithEvents App As Application
'Private Function IsScriptingRef() As Boolean
'    IsScriptingRef = False
'    For i = 1 To ActiveWorkbook.VBProject.References.Count
'        If ActiveWorkbook.VBProject.References.Item(i).Name = "Scripting" Then
'            IsScriptingRef = True
'        End If
'    Next
'End Function

Sub Workbook_Open()
    With Application
        .DisplayAlerts = False
        .ScreenUpdating = False
    End With
    
    Windows("M11 FGTN.XLS").Visible = True
    
    'Если не подключена библиотека, то подключаем ее
'    If Not IsScriptingRef Then
'        ActiveWorkbook.VBProject.References.AddFromFile ("scrrun.dll")
'    End If
    
    Set App = Application
    AppName = ActiveWorkbook.Name
    Sheets("Spr").Select
    i =  1 
    While Range("A" & i).Text <> ""
        i = i +  1 
    Wend
    NumRowsInSpr = i
    Sheets.Item( 1 ).Select
    Range("H4").Value = "Исходный файл не выбран!"
    Range("H4").Font.ColorIndex =  3 
    Range("H4").Font.Bold = True
    AppPath = CStr(ActiveWorkbook.Path)
End Sub

Ну и далее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function FindMaxNumM11InDay(Optional D As Date) As Integer
    Dim fso As New FileSystemObject
    Dim fold1 As Folder
    Dim iFile As File
    
    Set fold1 = fso.GetFolder(AppPath & "\Out")
    
    FindMaxNumM11InDay =  0 
    If CDate(D) = "0:00:00" Then
        D = Date
    End If
    
    For Each iFile In fold1.Files
        If Left(iFile.Name,  15 ) = "M11-" & D & "." Then
            'Нашли. Запоминаем номер...
            FindMaxNumM11InDay = Mid(iFile.Name, Len(iFile.Name) -  6 ,  3 )
       End If
     Next
End Function

Что касается:
ZVI
Еще If CDate(D) = "0:00:00" не случится никогда, т.к. Cdate() как и D As Date означает, по-сути, число типа Double, а не String.

Я исключаю только пустой аргумент, собственно.
Если в CDate передать пустой аргумент, то получим "0:00:00". Я это и проверяю.
Может можно и проще.
Вроде как все работает.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FileSearch в 2007-м офисе
    #36903192
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZVIВ Excel2007 метод .FileSearch хоть и есть в справке, но отключен.

Работает Dir, но лучше использовать FileSystemObject с поздним связыванием:
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

или с ранним связывание, как у Вас в коде, только нужно из VBE-Tools-References установить ссылку на Microsoft Scripting Runtime (файл scrrun.dll)

Кроме того в Вашем коде:
1. AppPath нужно заменить на ThisWorkbook.Path т.к. VBA
2. iFile возвращает путь и имя файла, поэтому условие в цикле не сработает.
Чтобы получить только имя используйте в условии iFile.Name
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / FileSearch в 2007-м офисе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]