Здравствуйте. Пишу с помощью форума макрос для поиска данных ячейках файлов *. xls в другой папке. Вроде написал код, но дальше запроса информации для поиска дело не идёт. Помогите, пожалуйста. Код: [vba]
Код
Private Function GetValue(path, file, sheet, ref) Dim arg As String If Right(path, 1) <> "\" Then path = path & "\" If Dir(path & file) = "" Then GetValue = "Файл не найден" Exit Function End If arg = "'" & path & "[" & file & "]" & sheet & "'!" & _ Range(ref).Range("A1").Address(, , xlR1C1) GetValue = ExecuteExcel4Macro(arg) End Function Sub Найти_документы() Const AddrresCell = 4 Dim p As String 'Директория файлов Dim f As String 'Имя файла Dim s As String 'Имя листа Dim a As String 'Адрес ячейки Dim Rng As Range, Sht As Worksheet Dim d&, i&, g&, h& 'Вызываем диалоговое окно для определения папки с файлами With Application.FileDialog(msoFileDialogFolderPicker) .InitialFileName = Application.DefaultFilePath & "\" .Title = "Укажите папку, в которой находятся файлы" .Show If .SelectedItems.Count = 0 Then MsgBox "Отменено" 'Прекращение работы Else PName = .SelectedItems(1) 'Получение пути
'Считаем количество файлов в папке для создания массива названий файлов FName = Dir(PName & "\*.xls") 'Получаем имя первого файла FQuant = 0 'обнуляем кол-во файлов ' Цикл подсчета кол-ва файлов Do Until FName = "" 'Пока имя файла не станет пустым FQuant = FQuant + 1 'Счетчик кол-ва FName = Dir 'Получение следующего имени файла Loop 'Заполняем массив названиями файлов ReDim arr(1 To FQuant) As String 'Задание размерности массива на основе кол-ва файлов FName = Dir(PName & "\*.xls") 'Получаем имя первого файла N = 0 'обнуляем счетчик ' Цикл заполнения массива именами файлов Do Until FName = "" 'Пока имя файла не станет пустым N = N + 1 'Счетчик размерности массива arr(N) = FName 'Заполнение ячейки массива FName = Dir 'Получение следующего имени файла Loop N = 0 'Цикл перебора файлов For N = 1 To FQuant p = PName & "\" 'Директория файлов f = arr(N) 'получаем имя файла s = Left(arr(N), Len(arr(N)) - 5) 'получаем имя листа On Error Resume Next Windows(f).Activate For Each Sht In ActiveWorkbook.Sheets 'цикл по всем листам в файле d = InputBox("Что ищем?") If d = "" Then Exit Sub Set Rng = Sht.Cells.Find(d, , xlFormulas, xlWhole) 'xlWhole - ячейка целиком, xlPart - часть ячейки If Not Rng Is Nothing Then 'если нашли 'MsgBox "Найдено на листе " & Rng.Parent.Name & " в ячейке " & Rng.Address(0, 0), vbInformation, "Конец" For Each Cell In Rng g = Rng.Adress.Row h = Rng.Adress.Column If Range(g + 5, h).Value <> "Да" Or Range(g + 5, h).Value <> "ДА" Or Range(g + 5, h).Value <> "да" Then For i = 1 To Rng If Range(g, h) = Range("D", h) Then Range("B" & i).Value = Range(g - 3, h).Value Range("C" & i).Value = Range(g - 1, h).Value Range("D" & i).Value = Range(g + 2, h).Value Range("E" & i).Value = Range(g + 3, h).Value ElseIf Range(g, h) = Range("H", h) Then Range("B" & i).Value = Range(g - 4, h).Value Range("C" & i).Value = Range(g + 1, h).Value Range("D" & i).Value = Range(g + 4, h).Value Range("E" & i).Value = Range(g + 3, h).Value End If Next i End If Next Cell End If Next Sht If Rng Is Nothing Then 'если не нашли GoTo Metka End If Metka: Next N If Rng Is Nothing Then 'если не нашли MsgBox "Не найдено ни на одном листе!", vbExclamation, "Конец" End If End If End With End Sub
[/vba]
Здравствуйте. Пишу с помощью форума макрос для поиска данных ячейках файлов *. xls в другой папке. Вроде написал код, но дальше запроса информации для поиска дело не идёт. Помогите, пожалуйста. Код: [vba]
Код
Private Function GetValue(path, file, sheet, ref) Dim arg As String If Right(path, 1) <> "\" Then path = path & "\" If Dir(path & file) = "" Then GetValue = "Файл не найден" Exit Function End If arg = "'" & path & "[" & file & "]" & sheet & "'!" & _ Range(ref).Range("A1").Address(, , xlR1C1) GetValue = ExecuteExcel4Macro(arg) End Function Sub Найти_документы() Const AddrresCell = 4 Dim p As String 'Директория файлов Dim f As String 'Имя файла Dim s As String 'Имя листа Dim a As String 'Адрес ячейки Dim Rng As Range, Sht As Worksheet Dim d&, i&, g&, h& 'Вызываем диалоговое окно для определения папки с файлами With Application.FileDialog(msoFileDialogFolderPicker) .InitialFileName = Application.DefaultFilePath & "\" .Title = "Укажите папку, в которой находятся файлы" .Show If .SelectedItems.Count = 0 Then MsgBox "Отменено" 'Прекращение работы Else PName = .SelectedItems(1) 'Получение пути
'Считаем количество файлов в папке для создания массива названий файлов FName = Dir(PName & "\*.xls") 'Получаем имя первого файла FQuant = 0 'обнуляем кол-во файлов ' Цикл подсчета кол-ва файлов Do Until FName = "" 'Пока имя файла не станет пустым FQuant = FQuant + 1 'Счетчик кол-ва FName = Dir 'Получение следующего имени файла Loop 'Заполняем массив названиями файлов ReDim arr(1 To FQuant) As String 'Задание размерности массива на основе кол-ва файлов FName = Dir(PName & "\*.xls") 'Получаем имя первого файла N = 0 'обнуляем счетчик ' Цикл заполнения массива именами файлов Do Until FName = "" 'Пока имя файла не станет пустым N = N + 1 'Счетчик размерности массива arr(N) = FName 'Заполнение ячейки массива FName = Dir 'Получение следующего имени файла Loop N = 0 'Цикл перебора файлов For N = 1 To FQuant p = PName & "\" 'Директория файлов f = arr(N) 'получаем имя файла s = Left(arr(N), Len(arr(N)) - 5) 'получаем имя листа On Error Resume Next Windows(f).Activate For Each Sht In ActiveWorkbook.Sheets 'цикл по всем листам в файле d = InputBox("Что ищем?") If d = "" Then Exit Sub Set Rng = Sht.Cells.Find(d, , xlFormulas, xlWhole) 'xlWhole - ячейка целиком, xlPart - часть ячейки If Not Rng Is Nothing Then 'если нашли 'MsgBox "Найдено на листе " & Rng.Parent.Name & " в ячейке " & Rng.Address(0, 0), vbInformation, "Конец" For Each Cell In Rng g = Rng.Adress.Row h = Rng.Adress.Column If Range(g + 5, h).Value <> "Да" Or Range(g + 5, h).Value <> "ДА" Or Range(g + 5, h).Value <> "да" Then For i = 1 To Rng If Range(g, h) = Range("D", h) Then Range("B" & i).Value = Range(g - 3, h).Value Range("C" & i).Value = Range(g - 1, h).Value Range("D" & i).Value = Range(g + 2, h).Value Range("E" & i).Value = Range(g + 3, h).Value ElseIf Range(g, h) = Range("H", h) Then Range("B" & i).Value = Range(g - 4, h).Value Range("C" & i).Value = Range(g + 1, h).Value Range("D" & i).Value = Range(g + 4, h).Value Range("E" & i).Value = Range(g + 3, h).Value End If Next i End If Next Cell End If Next Sht If Rng Is Nothing Then 'если не нашли GoTo Metka End If Metka: Next N If Rng Is Nothing Then 'если не нашли MsgBox "Не найдено ни на одном листе!", vbExclamation, "Конец" End If End If End With End Sub
Мне нужен макрос, который искал бы заданное в inputbox слово во всех файлах в заданной папке и выписывал бы в книгу значение соседней ячейки с ячейкой, в которой он нашёл искомое слово. Я пробовал написать (код в стартпост), но он почему-то не работает. Помогите, пожалуйста.
Мне нужен макрос, который искал бы заданное в inputbox слово во всех файлах в заданной папке и выписывал бы в книгу значение соседней ячейки с ячейкой, в которой он нашёл искомое слово. Я пробовал написать (код в стартпост), но он почему-то не работает. Помогите, пожалуйста.Фомулист
Терпение и труд всё перетрут!
Сообщение отредактировал Фомулист - Четверг, 24.06.2021, 16:15
Пора упрощать код. Полезно сделать(заяндить) отдельные методы(функции, процедуры) для получения/выполнения одного дела: - название каталога - строка поиска - смещение (строк, столбцов) - на какой лист класть результат - список файлов - коллекция листов - коллекция диапазонов - цикл поиска по диапазонам поиск по диапазону обработка результата поиска по диапазону
Видите сколько работы? А ещё нужно обрабатывать ошибки - то файл не откроется, то лист защищён ...
Привет!
Пора упрощать код. Полезно сделать(заяндить) отдельные методы(функции, процедуры) для получения/выполнения одного дела: - название каталога - строка поиска - смещение (строк, столбцов) - на какой лист класть результат - список файлов - коллекция листов - коллекция диапазонов - цикл поиска по диапазонам поиск по диапазону обработка результата поиска по диапазону
Видите сколько работы? А ещё нужно обрабатывать ошибки - то файл не откроется, то лист защищён ...InExSu
Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac
Private Function GetValue(path, file, sheet, ref) Dim arg As String If Right(path, 1) <> "\" Then path = path & "\" If Dir(path & file) = "" Then GetValue = "Файл не найден" Exit Function End If arg = "'" & path & "[" & file & "]" & sheet & "'!" & _ Range(ref).Range("A1").Address(, , xlR1C1) GetValue = ExecuteExcel4Macro(arg) End Function Sub Найти_документы() Const AddrresCell = 4 Dim p As String 'Директория файлов Dim f As String 'Имя файла Dim s As String 'Имя листа Dim a As String 'Адрес ячейки Dim Rng As Range, Sht As Worksheet Dim i&, g&, h& 'Вызываем диалоговое окно для определения папки с файлами With Application.FileDialog(msoFileDialogFolderPicker) .InitialFileName = Application.DefaultFilePath & "\" .Title = "Укажите папку, в которой находятся файлы" .Show If .SelectedItems.Count = 0 Then MsgBox "Отменено" 'Прекращение работы Else PName = .SelectedItems(1) 'Получение пути
'Считаем количество файлов в папке для создания массива названий файлов FName = Dir(PName & "\*.xls") 'Получаем имя первого файла FQuant = 0 'обнуляем кол-во файлов ' Цикл подсчета кол-ва файлов Do Until FName = "" 'Пока имя файла не станет пустым FQuant = FQuant + 1 'Счетчик кол-ва FName = Dir 'Получение следующего имени файла Loop 'Заполняем массив названиями файлов ReDim arr(1 To FQuant) As String 'Задание размерности массива на основе кол-ва файлов FName = Dir(PName & "\*.xls") 'Получаем имя первого файла N = 0 'обнуляем счетчик ' Цикл заполнения массива именами файлов Do Until FName = "" 'Пока имя файла не станет пустым N = N + 1 'Счетчик размерности массива arr(N) = FName 'Заполнение ячейки массива FName = Dir 'Получение следующего имени файла Loop N = 0 'Цикл перебора файлов d = InputBox("Что ищем?") If IsNull(d) Then Exit Sub For N = 1 To FQuant p = PName & "\" 'Директория файлов f = arr(N) 'получаем имя файла s = Left(arr(N), Len(arr(N)) - 5) 'получаем имя листа On Error Resume Next Set WB = Application.Workbooks.Open(p & f) WB.Activate For Each Sht In WB.Sheets 'цикл по всем листам в файле Set Rng = Sht.Cells.Find(d, , xlFormulas, xlWhole) 'xlWhole - ячейка целиком, xlPart - часть ячейки If Not Rng Is Nothing Then 'если нашли 'MsgBox "Найдено на листе " & Rng.Parent.Name & " в ячейке " & Rng.Address(0, 0), vbInformation, "Конец" For Each Cell In Rng g = Rng.Adress.Row h = Rng.Adress.Column If Range(g + 5, h).Value <> "Да" Or Range(g + 5, h).Value <> "ДА" Or Range(g + 5, h).Value <> "да" Then For i = 1 To Rng If Range(g, h) = Range("D", h) Then MsgBox (Workbooks(f).Range(g - 3, h).Value) Workbooks("Поиск.xlsm").Range("B" & i).Value = Workbooks(f).Range(g - 3, h).Value Workbooks("Поиск.xlsm").Range("C" & i).Value = Workbooks(f).Range(g - 1, h).Value Workbooks("Поиск.xlsm").Range("D" & i).Value = Workbooks(f).Range(g + 2, h).Value Workbooks("Поиск.xlsm").Range("E" & i).Value = Workbooks(f).Range(g + 3, h).Value ElseIf Range(g, h) = Range("H", h) Then Workbooks("Поиск.xlsm").Range("B" & i).Value = Workbooks(f).Range(g - 4, h).Value Workbooks("Поиск.xlsm").Range("C" & i).Value = Workbooks(f).Range(g + 1, h).Value Workbooks("Поиск.xlsm").Range("D" & i).Value = Workbooks(f).Range(g + 4, h).Value Workbooks("Поиск.xlsm").Range("E" & i).Value = Workbooks(f).Range(g + 3, h).Value End If Next i End If Next Cell End If Next Sht If Rng Is Nothing Then 'если не нашли GoTo Metka End If Metka: WB.Close Next N If Rng Is Nothing Then 'если не нашли MsgBox "Не найдено ни на одном листе!", vbExclamation, "Конец" End If End If End With End Sub
[/vba] Но на деле кусок кода после [vba]
Код
For each cell in rng
[/vba] почему-то не выполняется. Помогите, пожалуйста.
Код я поправил, теперь он выглядит так: [vba]
Код
Private Function GetValue(path, file, sheet, ref) Dim arg As String If Right(path, 1) <> "\" Then path = path & "\" If Dir(path & file) = "" Then GetValue = "Файл не найден" Exit Function End If arg = "'" & path & "[" & file & "]" & sheet & "'!" & _ Range(ref).Range("A1").Address(, , xlR1C1) GetValue = ExecuteExcel4Macro(arg) End Function Sub Найти_документы() Const AddrresCell = 4 Dim p As String 'Директория файлов Dim f As String 'Имя файла Dim s As String 'Имя листа Dim a As String 'Адрес ячейки Dim Rng As Range, Sht As Worksheet Dim i&, g&, h& 'Вызываем диалоговое окно для определения папки с файлами With Application.FileDialog(msoFileDialogFolderPicker) .InitialFileName = Application.DefaultFilePath & "\" .Title = "Укажите папку, в которой находятся файлы" .Show If .SelectedItems.Count = 0 Then MsgBox "Отменено" 'Прекращение работы Else PName = .SelectedItems(1) 'Получение пути
'Считаем количество файлов в папке для создания массива названий файлов FName = Dir(PName & "\*.xls") 'Получаем имя первого файла FQuant = 0 'обнуляем кол-во файлов ' Цикл подсчета кол-ва файлов Do Until FName = "" 'Пока имя файла не станет пустым FQuant = FQuant + 1 'Счетчик кол-ва FName = Dir 'Получение следующего имени файла Loop 'Заполняем массив названиями файлов ReDim arr(1 To FQuant) As String 'Задание размерности массива на основе кол-ва файлов FName = Dir(PName & "\*.xls") 'Получаем имя первого файла N = 0 'обнуляем счетчик ' Цикл заполнения массива именами файлов Do Until FName = "" 'Пока имя файла не станет пустым N = N + 1 'Счетчик размерности массива arr(N) = FName 'Заполнение ячейки массива FName = Dir 'Получение следующего имени файла Loop N = 0 'Цикл перебора файлов d = InputBox("Что ищем?") If IsNull(d) Then Exit Sub For N = 1 To FQuant p = PName & "\" 'Директория файлов f = arr(N) 'получаем имя файла s = Left(arr(N), Len(arr(N)) - 5) 'получаем имя листа On Error Resume Next Set WB = Application.Workbooks.Open(p & f) WB.Activate For Each Sht In WB.Sheets 'цикл по всем листам в файле Set Rng = Sht.Cells.Find(d, , xlFormulas, xlWhole) 'xlWhole - ячейка целиком, xlPart - часть ячейки If Not Rng Is Nothing Then 'если нашли 'MsgBox "Найдено на листе " & Rng.Parent.Name & " в ячейке " & Rng.Address(0, 0), vbInformation, "Конец" For Each Cell In Rng g = Rng.Adress.Row h = Rng.Adress.Column If Range(g + 5, h).Value <> "Да" Or Range(g + 5, h).Value <> "ДА" Or Range(g + 5, h).Value <> "да" Then For i = 1 To Rng If Range(g, h) = Range("D", h) Then MsgBox (Workbooks(f).Range(g - 3, h).Value) Workbooks("Поиск.xlsm").Range("B" & i).Value = Workbooks(f).Range(g - 3, h).Value Workbooks("Поиск.xlsm").Range("C" & i).Value = Workbooks(f).Range(g - 1, h).Value Workbooks("Поиск.xlsm").Range("D" & i).Value = Workbooks(f).Range(g + 2, h).Value Workbooks("Поиск.xlsm").Range("E" & i).Value = Workbooks(f).Range(g + 3, h).Value ElseIf Range(g, h) = Range("H", h) Then Workbooks("Поиск.xlsm").Range("B" & i).Value = Workbooks(f).Range(g - 4, h).Value Workbooks("Поиск.xlsm").Range("C" & i).Value = Workbooks(f).Range(g + 1, h).Value Workbooks("Поиск.xlsm").Range("D" & i).Value = Workbooks(f).Range(g + 4, h).Value Workbooks("Поиск.xlsm").Range("E" & i).Value = Workbooks(f).Range(g + 3, h).Value End If Next i End If Next Cell End If Next Sht If Rng Is Nothing Then 'если не нашли GoTo Metka End If Metka: WB.Close Next N If Rng Is Nothing Then 'если не нашли MsgBox "Не найдено ни на одном листе!", vbExclamation, "Конец" End If End If End With End Sub
[/vba] Но на деле кусок кода после [vba]
Код
For each cell in rng
[/vba] почему-то не выполняется. Помогите, пожалуйста.Фомулист
Можете описать словами что Вы хотели начиная со строки
Хотел, если в столбце на 5 столбцов правее столбца, в котором нашли заданное слово, не написано Да в любом регистре, то берём значения из столбцов, которые вычисляют я указаниям в строках ниже строки, указанной в Вашей цитате из предыдущего поста и записываем их в ячейки файла, указанннве во всё тех же строках кода. Помогите, пожалуйста.
Можете описать словами что Вы хотели начиная со строки
Хотел, если в столбце на 5 столбцов правее столбца, в котором нашли заданное слово, не написано Да в любом регистре, то берём значения из столбцов, которые вычисляют я указаниям в строках ниже строки, указанной в Вашей цитате из предыдущего поста и записываем их в ячейки файла, указанннве во всё тех же строках кода. Помогите, пожалуйста.Фомулист
Код должен выполнять поиск указанного мной слова. Если нашёл, - смотреть, есть ли в крайней справа колонке таблицы, в которой нашлось слово, ДА в любом регистре, если нет - выписать значения некоторых столбцов этой таблицы в файл, откуда был запущен макрос. Помогите, пожалуйста.
Код должен выполнять поиск указанного мной слова. Если нашёл, - смотреть, есть ли в крайней справа колонке таблицы, в которой нашлось слово, ДА в любом регистре, если нет - выписать значения некоторых столбцов этой таблицы в файл, откуда был запущен макрос. Помогите, пожалуйста.Фомулист
Терпение и труд всё перетрут!
Сообщение отредактировал Фомулист - Пятница, 25.06.2021, 15:53