Страницы: 1
RSS
Не копируются данные с неактивного листа VBA
 
Всем всего хорошего.Что-то я делаю не так, а что не пойму.
Требуется собрать данные со всех листов из определенных ячеек на один лист в умную таблицу. В общем-то всё работает, но только если код запускается не с того листа, куда всё должно собираться. А я как раз хотел подвесить макрос на кнопочку именно на листе куда производится сбор.
Что я делаю не так? Я уж и опрашиваемый лист пробовал активировать, понимаю что глупо, но не помогло.
Код
    For i = Worksheets.Count To 2 Step -1 ' Проход по листам
        iDate = Worksheets(i).Name
        For z = 1 To UBound(task)
            Set Findtask1 = Worksheets(i).UsedRange.Find(task(z), , xlValues, xlPart) ' начало блока
            If z = UBound(task) Then
                lastrow = Cells(Rows.Count, 3).End(xlUp).Row
                Set Findtask2 = Cells(lastrow + 1, 3)
                    Else
                Set Findtask2 = Worksheets(i).UsedRange.Find(task(z + 1), , xlValues, xlPart) ' конец блока
            End If
            For x = Findtask1.Row + 1 To Findtask2.Row - 1
                If IsEmpty(Cells(x, 3)) = False Then
                Worksheets(i).Activate
                Set NewRow = tbl.ListRows.Add
                    With NewRow.Range
                      .Columns(1).Value = iDate
                      .Columns(2).Value = Sheets(i).Cells(x, 2).Value
                      .Columns(3).Value = Findtask1
                      .Columns(4).Value = Sheets(i).Cells(x, 3).Value
                      .Columns(5).Value = Sheets(i).Cells(x, 4).Value
                      .Columns(6).Value = Sheets(i).Cells(x, 5).Value
                      .Columns(7).Value = Sheets(i).Cells(x, 6).Value
                      .Columns(8).Value = Sheets(i).Cells(x, 7).Value
                    End With
                End If
            Next x
        Next z
    Next i

 
Без файла тяжеловато
самое быстрое решение, в начале добавить строку выбора другого листа (select),  с которого макрос работает корректно, но это костыль конечно  
 
У каждого Cells должен быть указан лист-родитель. Тогда можно будет запускать макрос с любого листа. А пока у вас в макросе будут просто Cells - это значит активный лист
 
Ham13, файл смогу только завтра вечером. А работает, (думаю) со всех, кроме нужного, но проверял только на двух (всего 126), выбранных наугад. Отрабатывает на ура.
 
New, а разве в строке: .Columns(4).Value = Sheets(i).Cells(x, 3).Value  - Sheets(i) не является указателем на родителя? Я и Worksheets(i).Cells(x, 3) пробовал, результат прежний.
Изменено: cuprum - 24.11.2022 23:04:19
 
Является. Но я ещё 3 штуки Cells вижу без родителя
Изменено: New - 24.11.2022 23:05:37
 
Цитата
New написал:
3 штуки Cells вижу без родителя
Точно, добавил в эти строки Sheets(i). и всё получилось. Большое спасибо. Я всегда говорил - нужен свежий взгляд со стороны, чтобы обнаружить проблему.
 
Вам просто нужно запомнить, что у Range, Cells - всегда нужно указывать лист-родителя, иначе будете долго ломать голову, почему вот там одни данные, а тут другие. Я даже когда на одном листе работаю, то пишу вот так, хотя казалось бы НАФИГА??? мы же всего лишь работаем с активным листом... можно же просто Cells(), Range() -  а это просто хорошая практика программирования всегда указывать лист-родителя.

Код
    With ActiveSheet
        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 'обязательна точка перед Cells и Rows
        arrData = .Range("A2:B" & LastRow).Value  'обязательна точка перед Range
        'и т.д.
    
    End With

а если позже у вашего кода изменится бизнес логика, то просто ActiveSheet заменяется на Worksheets("Отчёт") и всё прекрасно работает
P.S. А когда укажите родителя у каждого Cells, то вам уже не понадобится строка Worksheets(i).Activate в вашем коде
Изменено: New - 24.11.2022 23:28:40
Страницы: 1
Наверх