Страницы: 1
RSS
Макрос поиска в других файлах не берёт из них нужные значения
 
      Здравствуйте, уважаемые форумчане.
     Есть код:
   
Код
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)
    With GetObject(p & f)
    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
    End With
    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
Однако почему-то кусок кода
Код
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

не отрабатывает. Помогите, пожалуйста.
Изменено: Неопытный_Экселист - 25.06.2021 14:11:11
 
наличие кода - уже хорошо
не плохо бы еще понимать для каких целей он написан (какую задачу решает)
ну и пример файла с данными с которыми не работает
Изменено: Ігор Гончаренко - 25.06.2021 14:17:40
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Неопытный_Экселист: Есть код
кто вам этого Франкенштейна слепил, у того и спрашивайте, а лучше пристрелите, чтобы не мучился и создайте новую тему с описанием, что и откуда хотите брать
Откуда была взята функция получения данных
КАК ПОЛУЧИТЬ ДАННЫЕ ИЗ ЗАКРЫТОЙ КНИГИ?
Тема
Изменено: Jack Famous - 25.06.2021 14:27:40
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
кто вам этого Франкенштейна слепил
\
Да я сам и слепил.
Мне важно понять, почему после нахождения нужного слова, указанного в inputbox, код не вставляет в файл, откуда он запущен, значения из файла, где указанное слово было найдено в соответствии с указаниями в макросе (нижняя часть кода из- стартпоста)?
Изменено: Неопытный_Экселист - 25.06.2021 15:07:33
 
Может лучше пропишете, какая задача, - так проще и интереснее, чем разбирать чужой громоздкий код. (ну как по мне :)
Или уже F8, F9 - там ответы на все вопросы
Изменено: vladjuha - 25.06.2021 17:22:29
 
Намек: вот этот кусок(и ему подобные)
Код
If Range(g + 5, h).Value <> "Да" Or Range(g + 5, h).Value <> "ДА" Or Range(g + 5, h).Value <> "да" Then
всегда просматривает данные не на листе цикла(Sht), а на активном листе. Который может как совпадать в каких-то случаях с Sht, так и различаться. Потому что обращение к Range без указания родителя всегда будет относится к активному листу.
Для общего образования: Как обратиться к диапазону из VBA
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх