Прошу помощи у специалистов. Часто сталкиваюсь с обработкои однотипных фаилов .xls, которые расположены в папках с разными названиями. В каждой папке вложены одинаковые фаилы .xls с одинаковои структурои внутри. Пример: Имеем папку с названием "Планета Земля", внутри нее подкатегории (папки) с названиями стран "Россия" Япония", в странах папки с городами и т.п., и в каждой папке(городе) лежит фаил "статистика.xls" и внутри нее таблица: численность, рождаемость, смертность и т.п. Задача: Изменилась численность в Японии и теперь надо в каждом городе его изменить ячейка к примеру А1. Другими словами, включаем макрос, он открывает все подпапки и находит фаил "1.xls" на листе "лист1", берет ячеку А1 и заменяет на нашу цифру. Имею в наличии макрос, но он работает по заданному конкретному пути, например если конкретно прописать что город Рязань, хотелось бы чтоб макрос просматривал все подряд папки в стране и в каждом городе в нужном фаиле заменял значение в нужной (одной) ячейке. МАКРОС: [vba]
Код
Sub b() Dim awb As Workbook Set awb = Application.Workbooks.Open("C:\Documents and Settings\2\3\1\3\Рязань.xls") With ThisWorkbook.Worksheets(1) awb.Worksheets(1).[C10] = .[A1].Value End With End Sub
[/vba]
Прошу помощи у специалистов. Часто сталкиваюсь с обработкои однотипных фаилов .xls, которые расположены в папках с разными названиями. В каждой папке вложены одинаковые фаилы .xls с одинаковои структурои внутри. Пример: Имеем папку с названием "Планета Земля", внутри нее подкатегории (папки) с названиями стран "Россия" Япония", в странах папки с городами и т.п., и в каждой папке(городе) лежит фаил "статистика.xls" и внутри нее таблица: численность, рождаемость, смертность и т.п. Задача: Изменилась численность в Японии и теперь надо в каждом городе его изменить ячейка к примеру А1. Другими словами, включаем макрос, он открывает все подпапки и находит фаил "1.xls" на листе "лист1", берет ячеку А1 и заменяет на нашу цифру. Имею в наличии макрос, но он работает по заданному конкретному пути, например если конкретно прописать что город Рязань, хотелось бы чтоб макрос просматривал все подряд папки в стране и в каждом городе в нужном фаиле заменял значение в нужной (одной) ячейке. МАКРОС: [vba]
Код
Sub b() Dim awb As Workbook Set awb = Application.Workbooks.Open("C:\Documents and Settings\2\3\1\3\Рязань.xls") With ThisWorkbook.Worksheets(1) awb.Worksheets(1).[C10] = .[A1].Value End With End Sub
Перебрать все файлы в папках и подпапках можно так:
[vba]
Код
Private Type BrowseInfo hwndOwner As Long pIDLRoot As Long pszDisplayName As Long lpszTitle As String ulFlags As Long lpfnCallback As Long lParam As Long iImage As Long End Type
Dim strPath As String Private Declare Function SHBrowseForFolder _ Lib "shell32" (lpbi As BrowseInfo) As Long Private Declare Function SHGetPathFromIDList _ Lib "shell32" (ByVal pidList As Long, _ ByVal lpBuffer As String) As Long Private Declare Sub CoTaskMemFree _ Lib "ole32.dll" (ByVal hMem As Long)
Public Function BrowseForFolder(hwndOwner _ As Long, sPrompt As String) As String Const BIF_RETURNONLYFSDIRS = 1, MAX_PATH = 260 Dim intNull As Integer, lngIdList As Long Dim udtBI As BrowseInfo
With udtBI .hwndOwner = hwndOwner .lpszTitle = sPrompt .ulFlags = BIF_RETURNONLYFSDIRS End With lngIdList = SHBrowseForFolder(udtBI) If lngIdList Then strPath = String$(MAX_PATH, 0) SHGetPathFromIDList lngIdList, strPath CoTaskMemFree lngIdList intNull = InStr(strPath, vbNullChar) If intNull Then strPath = Left$(strPath, intNull - 1) End If BrowseForFolder = strPath End Function
Sub Кнопка3_Щелкнуть() Dim K BrowseForFolder ЭтаКнига.Application.Hwnd, "Выбери каталог ... " Dim NewName MyPath = strPath & "\" ' Указывает путь. MyName = (Dir(MyPath, vbNormal)) ' Возвращает первый элемент. Do While MyName <> "" ' Начинает цикл. ' Игнорирует текущий каталог и каталог предыдущего уровня. If MyName <> "." And MyName <> ".." Then If StrComp(Right$(MyName, 4), ".xls", vbTextCompare) = 0 Then K = K + 1 Debug.Print MyName ' здесь код открытия файла и ..... End If End If MyName = Dir ' Возвращает следующий элемент. Loop End Sub
[/vba]
Перебрать все файлы в папках и подпапках можно так:
[vba]
Код
Private Type BrowseInfo hwndOwner As Long pIDLRoot As Long pszDisplayName As Long lpszTitle As String ulFlags As Long lpfnCallback As Long lParam As Long iImage As Long End Type
Dim strPath As String Private Declare Function SHBrowseForFolder _ Lib "shell32" (lpbi As BrowseInfo) As Long Private Declare Function SHGetPathFromIDList _ Lib "shell32" (ByVal pidList As Long, _ ByVal lpBuffer As String) As Long Private Declare Sub CoTaskMemFree _ Lib "ole32.dll" (ByVal hMem As Long)
Public Function BrowseForFolder(hwndOwner _ As Long, sPrompt As String) As String Const BIF_RETURNONLYFSDIRS = 1, MAX_PATH = 260 Dim intNull As Integer, lngIdList As Long Dim udtBI As BrowseInfo
With udtBI .hwndOwner = hwndOwner .lpszTitle = sPrompt .ulFlags = BIF_RETURNONLYFSDIRS End With lngIdList = SHBrowseForFolder(udtBI) If lngIdList Then strPath = String$(MAX_PATH, 0) SHGetPathFromIDList lngIdList, strPath CoTaskMemFree lngIdList intNull = InStr(strPath, vbNullChar) If intNull Then strPath = Left$(strPath, intNull - 1) End If BrowseForFolder = strPath End Function
Sub Кнопка3_Щелкнуть() Dim K BrowseForFolder ЭтаКнига.Application.Hwnd, "Выбери каталог ... " Dim NewName MyPath = strPath & "\" ' Указывает путь. MyName = (Dir(MyPath, vbNormal)) ' Возвращает первый элемент. Do While MyName <> "" ' Начинает цикл. ' Игнорирует текущий каталог и каталог предыдущего уровня. If MyName <> "." And MyName <> ".." Then If StrComp(Right$(MyName, 4), ".xls", vbTextCompare) = 0 Then K = K + 1 Debug.Print MyName ' здесь код открытия файла и ..... End If End If MyName = Dir ' Возвращает следующий элемент. Loop End Sub