Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / FileSearch в 2007-м офисе / 10 сообщений из 10, страница 1 из 1
26.03.2009, 13:41
    #35893584
kanalex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FileSearch в 2007-м офисе
Уважаемые!
А как быть с такой функцией в 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
26.03.2009, 14:36
    #35893811
kanalex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FileSearch в 2007-м офисе
ну вот как-то так получилось:

Код: 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
26.03.2009, 14:44
    #35893845
kanalex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FileSearch в 2007-м офисе
Или лучше так: :)

Код: 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
26.03.2009, 14:59
    #35893913
kanalex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FileSearch в 2007-м офисе
гад:( а теперь он пишет:

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


Чего с этим делать?
...
Рейтинг: 0 / 0
26.03.2009, 16:42
    #35894336
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FileSearch в 2007-м офисе
В 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
26.03.2009, 16:53
    #35894384
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FileSearch в 2007-м офисе
Еще 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
26.03.2009, 17:00
    #35894407
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FileSearch в 2007-м офисе
Для комплектности и вариант с 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
27.03.2009, 00:34
    #35895237
ZVI
ZVI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FileSearch в 2007-м офисе
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
27.03.2009, 15:44
    #35896833
kanalex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FileSearch в 2007-м офисе
Вообщем, спасибо. Вот, что получилось в итоге:
Закомментированное пришлось убрать, т.к. требует подключить
"Доверять доступ к объектной модели проектов 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
Период между сообщениями больше года.
16.10.2010, 19:50
    #36903192
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FileSearch в 2007-м офисе
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
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / FileSearch в 2007-м офисе / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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