powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Проблема с Dir
20 сообщений из 20, страница 1 из 1
Проблема с Dir
    #37819951
Azeke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет
Есть папка в которой находятся файлы с расширением .xls (количество заранее не известно, и название файлов тоже может быть разное) мне необходимо по очереди открыть их и сравнить данные в них с шаблоном. Задача не сложная раньше я так делал но сейчас когда при помощи функции Dir() просматриваю файлы в папке он djpdhfoftnна какой-то файл с именем ".." хотя в папке у меня ничего такого нет.
Вот список файлов в папке :
65.xls
gtyrr.xls
tgrtrtt.xls
54.xls
tyt1.xls


Вот программа:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Public Sub CompareCO2WEB()

   
    InFolder$ = GetPath() & "\input\XLS\"
    f$ = Dir(InFolder$ & "*.xls")
    Do While f$ <> ""
        Set xlBook = GetObject(InFolder$ & f$)
        Set xlSheet = xlBook.Sheets(1)
        sMes = Left(Right(Trim(xlSheet.Cells(2, 1)), 7), 2)
        sYear = Right(Right(Trim(xlSheet.Cells(2, 1)), 7), 4)
        
...........................................................

        f$ = Dir
    Loop
 End Sub
...
Рейтинг: 0 / 0
Проблема с Dir
    #37819958
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azekeхотя в папке у меня ничего такого нет.Есть, просто скрытый, винда его не показывает. Это ссылка на родительскую папку.
...
Рейтинг: 0 / 0
Проблема с Dir
    #37819961
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProAzekeхотя в папке у меня ничего такого нет.Есть, просто скрытый, винда его не показывает. Это ссылка на родительскую папку.набери Dir в командной строке - увидишь.
...
Рейтинг: 0 / 0
Проблема с Dir
    #37819978
Azeke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как это убрать.
Раньше такое не встречалось.
...
Рейтинг: 0 / 0
Проблема с Dir
    #37820004
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azekeкак это убрать.
Раньше такое не встречалось.использовать маски
dir("с:\*.xls")
...
Рейтинг: 0 / 0
Проблема с Dir
    #37820009
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AzekeРаньше такое не встречалось.это могло не встречать только в корневой папке диска
...
Рейтинг: 0 / 0
Проблема с Dir
    #37820019
Azeke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я в программе использую маски.
InFolder$ = GetPath() & "\input\XLS\"
f$ = Dir(InFolder$ & "*.xls")
И у меня такая же программа с файлами в подкаталогах и работает нормально.
...
Рейтинг: 0 / 0
Проблема с Dir
    #37820039
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПРИВЕДЕННЫЙ КОД не выдает ".."
Ищи там, где вместо кода точки.
Возможно вложенный вызов Dir
...
Рейтинг: 0 / 0
Проблема с Dir
    #37820751
Azeke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот весь код процедуры, да действительно есть вложенные Dir, а что делать если так надо.
Код: vbnet
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
Public Sub CompareCO2WEB()
    Dim xlApp As New Excel.Application
    Dim xlBook As Excel.Workbook, xlBook1 As Excel.Workbook
    Dim xlSheet As Excel.Worksheet, xlSheet1 As Excel.Worksheet
    Dim sMes As String, sYear As String, sFilfer() As String, vt As String, dor As String, dor_p As String
    Dim a As Integer, h As Integer, r As Integer, c As Integer, p As Long
    
    InFolder$ = GetPath() & "\input\XLS\"
    f$ = Dir(InFolder$ & "*.xls")
    Do While (f$ <> "")
    
        Set xlBook = GetObject(InFolder$ & f$)
        Set xlSheet = xlBook.Sheets(1)
        sMes = Left(Right(Trim(xlSheet.Cells(2, 1)), 7), 2)
        sYear = Right(Right(Trim(xlSheet.Cells(2, 1)), 7), 4)
        sFilfer() = Split(Trim(xlSheet.Cells(4, 1)), " ")
        For h = LBound(sFilfer) To UBound(sFilfer)
            Select Case Trim(sFilfer(h))
                Case "е1:": vt = Trim(sFilfer(h + 1))
                Case "у2:": dor_p = Trim(sFilfer(h + 1))
                Case "в:": dor = Trim(sFilfer(h + 1))
            End Select
        Next h
        Set db = DBEngine.OpenDatabase(GetPath() & "\base.mdb")
        vt = db.OpenRecordset("select VT_FILE from VT where VT_FN='" & vt & "'")(0)       
        dor = db.OpenRecordset("select DOR from DOR where DOR_FN='" & dor & "'")(0)         
        dor_p = db.OpenRecordset("select DOR from DOR where DOR_FN='" & dor_p & "'")(0)     
        
        sPathCO2$ = GetPath() & "\output\" & sMes & "_" & sYear & "\"
        sPathWEB$ = GetPath() & "\analysis\CompareCO2WEB\" & sMes & "_" & sYear & "\"
        If Len(Dir(sPathCO2$, vbDirectory)) <> 0 Then
            sFile$ = sMes & Right(sYear, 2) & vt & "_" & Left(dor, 2) & "in" & Left(dor_p, 2) & ".xls"
            If Len(Dir(sPathCO2$ & "\" & sFile$)) <> 0 Then
                My_MkDir (sPathWEB$)
                FileCopy sPathCO2$ & sFile$, sPathWEB$ & sFile$
                Set xlBook1 = GetObject(sPathWEB$ & sFile$)
                Set xlSheet1 = xlBook1.Sheets(1)
                a = 1  
                s = 8  
                c = 4  
                Do While a <= 14
                    If a = Trim(xlSheet1.Cells(s, c)) Then
                        For r% = 1 To 30
                            With xlSheet1.Cells(r% + s, c)
                            p = CLng(IIf(xlSheet.Cells(r% + s, c) = "", "0", xlSheet.Cells(r% + s, c))) - CLng(IIf(.Value = "", "0", .Value))
                            Select Case p
                                Case Is > 0
                                    .Interior.Color = 255              
                                    .NoteText ("1753")
                                Case Is < 0
                                    .Interior.Color = 65535              
                                    .NoteText ("1752")
                            End Select
                            .Value = IIf(p = 0, "", CStr(Abs(p)))       
                            End With
                        Next r%
                        a = a + 1
                    End If
                    c = c + 1
                Loop
                xlBook1.Windows(1).Visible = True
                xlBook1.Close True
                Set xlSheet1 = Nothing
                Set xlBook1 = Nothing
            End If
        End If
        xlBook.Close
        Set xlSheet = Nothing: Set xlBook = Nothing
        f$ = Dir
    Loop
    db.Close: Set db = Nothing
    xlApp.Quit
End Sub
...
Рейтинг: 0 / 0
Проблема с Dir
    #37820809
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azekeа что делать если так надо.Воспользоваться FileSystemObject
...
Рейтинг: 0 / 0
Проблема с Dir
    #37820889
QValD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azeke,

решение в лоб - поставь лишний if на ".." и "."
...
Рейтинг: 0 / 0
Проблема с Dir
    #37820967
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Azeke
> да действительно есть вложенные Dir, а что делать если так надо.

Вынеси все вложенные Dir'ы в отдельные функции и тогда никакой Dir не будет мешать другому, не зависимо от уровня
вложенности

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с Dir
    #37820979
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносВынеси все вложенные Dir'ы в отдельные функции и тогда никакой Dir не будет мешать другому, не зависимо от уровня
вложенностиО как. Я полагал - Dir глобален...
...
Рейтинг: 0 / 0
Проблема с Dir
    #37821013
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> Dir глобален...

Да?
Не знаю, как освобожусь - нарисую пример, посмотрим.
Но я бы сделал именно через функции. Каждая функция - свой контекст выполнения. Хотя можент я и не прав

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с Dir
    #37821103
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносХотя можент я и не правНе прав, я проверил. Дир глобален. Вроденный дир даже в функцию перебивает предыдущий.
...
Рейтинг: 0 / 0
Проблема с Dir
    #37821104
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроденный=Вложенный ))
...
Рейтинг: 0 / 0
Проблема с Dir
    #37821495
Azeke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
заменил вложенные Dir на fso, не помогло.
...
Рейтинг: 0 / 0
Проблема с Dir
    #37821712
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Azekeзаменил вложенные Dir на fso, не помогло.значит неправильно заменил. Показывай код с FSO
...
Рейтинг: 0 / 0
Проблема с Dir
    #37830265
EducatedFool
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А зачем что-то изобретать?
Возьмите готовый код для получения списка файлов из папке (по заданной маске):
http://excelvba.ru/code/FilenamesCollection
...
Рейтинг: 0 / 0
Проблема с Dir
    #37830351
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Azekeзаменил вложенные Dir на fso, не помогло.Один из вложенных Dir, тот, что с vbDirectory, - был лишним.
Код: vbnet
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
Private Const INVALID_FILE_ATTRIBUTES& = -1

' возвращает перечень атрибутов файла по его имени
' в случае ошибки (файл не существует, нет прав доступа, файл блокирован(?), etc) 
' возвращает INVALID_FILE_ATTRIBUTES
Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" ( _
    ByVal lpFileName As String _
    ) As Long

Public Sub CompareCO2WEB()
  'объект Excel создадим только если есть файлы для обработки
    'Dim xlApp As New Excel.Application
  Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook, xlBook1 As Excel.Workbook
    Dim xlSheet As Excel.Worksheet, xlSheet1 As Excel.Worksheet
    Dim sMes As String, sYear As String, sFilfer() As String, vt As String, dor As String, dor_p As String
    Dim a As Integer, h As Integer, r As Integer, c As Integer, p As Long
  Dim myPath As String  
    
  
  myPath = GetPath() ' ументшим количество вызовов GetPath()
    InFolder$ = myPath & "\input\XLS\"
    f$ = Dir(InFolder$ & "*.xls")
    
  If StrComp("", f) = 0 Then Exit Sub
  
  Set db = DBEngine.OpenDatabase(myPath & "\base.mdb")
  Set xlApp = New Excel.Application

  Do 
    'Set xlBook = GetObject(InFolder$ & f$)
    Set xlBook = xlApp.Workbooks.Open(InFolder$ & f$) ' открыть файл СРАЗУ в экселе будет быстрее, чем по ассоцииации расширения
    Set xlSheet = xlBook.WorkSheets(1)
    
    'sMes = Left(Right(Trim(xlSheet.Cells(2, 1)), 7), 2)
    'sYear = Right(Right(Trim(xlSheet.Cells(2, 1)), 7), 4)
    sYear = Right$(RTrim$(xlSheet.Cells(2, 1)), 7)
    sMes = Left$(sYear, 2)
    sYear = Right$(sYear, 4)
    
    sFilfer() = Split(Trim(xlSheet.Cells(4, 1)), " ")
    
    For h = LBound(sFilfer) To UBound(sFilfer)
      'Select Case Trim(sFilfer(h))
      Select Case sFilfer(h) 'элементы sFilter() получены сплитом по пробелу, - Trim уже лишний 
        Case "е1:": vt = sFilfer(h + 1):    h = h + 1 'экономим один шаг цикла :)
        Case "у2:": dor_p = sFilfer(h + 1): h = h + 1
        Case "в:":  dor = sFilfer(h + 1):   h = h + 1
      End Select
    Next h
    
    vt = db.OpenRecordset("select VT_FILE from VT where VT_FN='" & vt & "'")(0)       
    dor = db.OpenRecordset("select DOR from DOR where DOR_FN='" & dor & "'")(0)         
    dor_p = db.OpenRecordset("select DOR from DOR where DOR_FN='" & dor_p & "'")(0)     
    
    sPathCO2$ = myPath & "\output\" & sMes & "_" & sYear & "\"
    sFile$ = sMes & Right(sYear, 2) & vt & "_" & Left(dor, 2) & "in" & Left(dor_p, 2) & ".xls"
    
    If GetFileAttributes(sPathCO2$ & sFile) <> INVALID_FILE_ATTRIBUTES Then
    
      sPathWEB$ = myPath & "\analysis\CompareCO2WEB\" & sMes & "_" & sYear & "\"
    
    ' REM на самом деле нам не интересно существует ли папка, 
    ' REM т.к. двумя строками ниже мы проверяем наличие определённого файла в этой папке
    ' REM и только при его наличии что-то делаем.
    'If Len(Dir(sPathCO2$, vbDirectory)) <> 0 Then
      'sFile$ = sMes & Right(sYear, 2) & vt & "_" & Left(dor, 2) & "in" & Left(dor_p, 2) & ".xls"
      'If Len(Dir(sPathCO2$ & "\" & sFile$)) <> 0 Then
        
      My_MkDir (sPathWEB$)
      FileCopy sPathCO2$ & sFile$, sPathWEB$ & sFile$
      
      'Set xlBook1 = GetObject(sPathWEB$ & sFile$)
      Set xlBook1 = xlApp.Workbooks.Open(sPathWEB$ & sFile$) ' открыть файл в СРАЗУ экселе будет быстрее, чем по ассоцииации расширения
      Set xlSheet1 = xlBook1.WorkSheets(1)
      
      a = 1  
      s = 8  
      c = 4  
      Do While a <= 14
        If a = Trim(xlSheet1.Cells(s, c)) Then
          For r% = 1 To 30
            With xlSheet1.Cells(r% + s, c)
            ' REM явные преобразования к Long в данном случае имют смысл только если 
            ' REM в ячейках содержатся дробные числа, которые надо округлить
            ' REM если там только целые числа, то можно записать короче
            ' p = Val(xlSheet.Cells(r% + s, c)) - Val(.Value)
            p = CLng(IIf(xlSheet.Cells(r% + s, c) = "", "0", xlSheet.Cells(r% + s, c))) - CLng(IIf(.Value = "", "0", .Value))
            Select Case p
              Case Is > 0
                .Interior.Color = 255              
                .NoteText ("1753")
              Case Is < 0
                .Interior.Color = 65535              
                .NoteText ("1752")
            End Select
            ' REM тут преобразование к строке вылядит неуместным, учитывая, что формат у ячейки "общий"
            ' REM вполне достаточно .Value = IIf(p = 0, "", Abs(p))
            .Value = IIf(p = 0, "", CStr(Abs(p)))
            End With
          Next r%
          a = a + 1
        End If
        c = c + 1
      Loop
      'xlBook1.Windows(1).Visible = True 'зачем делать файл видимым перед закрытием - так и не понял...
      Set xlSheet1 = Nothing
      xlBook1.Close True: Set xlBook1 = Nothing
      'End If
    'End If
    
    End If
    Set xlSheet = Nothing
    xlBook.Close: Set xlBook = Nothing
    f$ = Dir
  Loop Until StrComp("", f$) = 0
  
  db.Close: Set db = Nothing
  xlApp.Quit: Set xlApp = Nothing
  
End Sub

...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Проблема с Dir
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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