Страницы: 1
RSS
Вернуть значение промежуточных итогов из неактивной книги
 
Помогите пожалуйста с кодом. Уже 2 день бьюсь и не могу никак победить.

То есть он должен найти книгу с почти таким названием, посчитать количество строк в отфильтрованном столбце и вернуть значения в переменную.
Если Вместо Workbooks(Wb.name) использовать Application.Worksheetfunction то работает, но я должен находиться на этой книге .
Хотелось бы как нибудь это делать с той книги от куда запускаю код. Это возможно? и как?
Код
Dim Line as Integer
Dim Wb As Workbook
    For Each Wb In Workbooks
        If Wb.Name Like ["Книга*"] Then Line = Workbooks(Wb.Name).Subtotal(2, Range("I3:I" & Rows(Rows.Count).End(xlUp).Row))
        
    Next
End Sub
 
пока не знаю, как вам помочь, но у Excel вот такая Объектная модель Application - Workbooks - Worksheets - Range. А вы сразу к Workbook хотите Subtotal. Я не уверен, что у Workbook есть Subtotal. Посмотреть бы ваш файл-пример (не рабочую вашу книгу, а небольшой файл-пример)

P.S. Вот так делать правильно
Код
Workbooks("Книга2.xlsx").Worksheets("Лист1").Range("A1") = 5

А вот так неправильно
Код
Workbooks("Книга2.xlsx").Range("A1") = 5
Изменено: New - 21.10.2021 19:36:25
 
Цитата
New написал:
Объектная модель Application - Workbooks - Worksheets - Range
Я и по такой модели пробовал то есть Line = Workbook(Wd.name).Worksheets("Лист 2").Subtotal(...)

Все ровно ошибка - "object doesn't support this property or method"
 
Так Subtotal это, вроде, свойство Сводной, а не листа
"object doesn't support this property or method" - Объект (лист) НЕ поддерживает данное свойство или метод
Изменено: New - 21.10.2021 19:43:36
 
Так код работает в таком виде:
Код
Then Line = Application.Worksheetfunction.Subtotal(2, Range("I3:I" & Rows(Rows.Count).End(xlUp).Row))
Просто мне надо находиться в данной книге на данном листе

Range перед сабтотлом не работает. Тогда что я должен туда указывать?

Я как понял что внутри сабтотла указан диапозон и этого достаточно...
Изменено: Ленар - 21.10.2021 19:49:07
 
Возможное название: Вернуть значение промежуточных итогов из неактивной книги
Обратите внимание на конструкцию With... End With и точки перед .Range, .Cells, .Rows
Код
Sub Макрос1()
    Dim Line As Long
    Dim Wb As Workbook
    
    For Each Wb In Workbooks
        If Wb.Name Like ["Книга*"] Then
            With Wb.Worksheets("Лист1")
                Line = Application.WorksheetFunction.Subtotal(2, .Range("I3:I" & .Cells(.Rows.Count, "I").End(xlUp).Row))
            End With
        End If
    Next
End Sub
Изменено: New - 21.10.2021 20:00:56
 
Да Вы гений! Спасибо огромной. Сработало.

Конструкцию With... and with я почерпаю, а вот точки перед range cells rows для чего?
 
Цитата
Ленар написал:
Да Вы гений!
на форуме самое сложное - это понять, что хочет просящий помощи. Иногда час-два-три, а то и день-два-три пытаешься понять, что нужно и 5 минут пишешь код.
По поводу WIth... End with
Для краткости записи кода. Если вы используете With.. End with, то внутри нужно использовать точки у объектов.
Посмотрите 2 вида одинакового кода
Код
With Wb.Worksheets("Лист1")
Line = Application.WorksheetFunction.Subtotal(2, .Range("I3:I" & .Cells(.Rows.Count, "I").End(xlUp).Row))
End With

Протяните ползунок вправо >>>>
Код
Line = Application.WorksheetFunction.Subtotal(2, Wb.Worksheets("Лист1").Range("I3:I" & Wb.Worksheets("Лист1").Cells(Wb.Worksheets("Лист1").Rows.Count, "I").End(xlUp).Row))

коды по смыслу одинаковые. какой короче?
Если точки внутри With...End with не поставите, то Range, Cells - будут относится к активному на данный момент листу, а вам нужны Range, Cells с неактивного листа
Изменено: New - 22.10.2021 13:08:25
 
Вот для этого With и нужно.
Сравните:
Код
a = Sheets("лист").Range("A2").Value + Sheets("лист").Range("B2").Value

With Sheets("лист")
       a = .Range("A2").Value + .Range("B2").Value
And With

Если во втором варианте точки не будет - ссылка на диапазон активного листа. И беда будет, если активен другой лист
 
Цитата
New написал:
Посмотрите 2 вида одинакового кода
Я понял в чем была моя ошибка и что вы пытались до меня донести. Спасибо!
Страницы: 1
Наверх