Страницы: 1
RSS
Цикл по отдельным листам, не по всем, но по избранным
 
 Добрый день!

Подскажите, пожалуйста, в какую сторону двигаться.. :sceptic:

Имеется потребность обрабатывать данные в книге не со всех листов, а только с отдельных.
Например, только с листов с названием месяцев - Янв, Фев и т.д. (при наличии других).

Способ "For Each Sheet In WorkSheets" явно не подходит.
Подозреваю, что можно сделать свою собственную коллекцию листов.
Вопрос:
Но как это сделать так, чтобы можно было объявить один раз в начале модуля, дабы использовать потом в отдельных процедурах?

Заранее благодарю!     :idea:
 
добрый день.
Цитата
AlexTM написал:
For Each Sheet In WorkSheets
а почему нет? просто делать еще дополнительную проверку:
Код
Sub test()
    Dim sh As Worksheet
    
    Dim arrName()
    arrName = Array("янв", "фев", "мар")
    
    For Each sh In ThisWorkbook.Worksheets
        If Not IsError(Application.Match(sh.Name, arrName, 0)) Then
            Debug.Print sh.Name
        End If
    Next sh
End Sub
 
Код
ShtName = array("янв", "фев", "мар", "и пр.")
for i=lbound(ShtName) to ubound(ShtName)
  with worksheets(ShtName(i))
  ...
  end with
next
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
webley, да, можно, но когда листов много - тяжеловато получается. Ищу более универсальный метод, чтобы можно было его один раз объявить, а затем использовать в разных процедурах одного модуля.
Ігор Гончаренко, спасибо за идею, но, насколько понимаю, этот подход также применим только внутри одной процедуры?
 
Цитата
AlexTM написал: один раз объявить, а затем использовать в разных процедурах одного модуля.
Объявите переменную ShtName на уровне модуля, в первой процедуре наполните ее значениями (именами нужных листов) и используйте далее во всех процедурах модуля
Согласие есть продукт при полном непротивлении сторон
 
Цитата
AlexTM написал:
этот подход также применим только внутри одной процедуры
нет не правильно понимаете. этот подход применим так, как Вы его примените
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Еще вариант
Код
Public Const ShtName = "Лист1 Лист3"

Sub MyCicle()
Dim I&, iSh As Worksheet, iNm
iNm = Split(ShtName)
    For I = 0 To UBound(iNm)
        Set iSh = Worksheets(iNm(I))
    Next
End Sub
Согласие есть продукт при полном непротивлении сторон
 
немного измененный и  скорректированный вариант Ігор Гончаренко,

Код
ShtNames = array("янв", "фев", "мар", "и пр.")
for each Shtname in ShtNames
  is error resume next
  set Sht=worksheets(ShtName)

  if err.number =0 then
  on erroro goto 0

  ...
  end if
  on erroro goto 0
next
Изменено: БМВ - 21.05.2018 21:11:36
По вопросам из тем форума, личку не читаю.
 
Цитата
AlexTM написал:
Ищу более универсальный метод, чтобы можно было его один раз объявить, а затем использовать в разных процедурах одного модуля
Код
Dim mySheets As Sheets

Sub Init()
Set mySheets = Worksheets(Array("янв", "фев", "ноя"))
End Sub

Sub OtherSub()
For Each Sheet In mySheets
  '...
Next
End Sub
 
Казанский,
Если все листы указанные в массиве присутствуют, то да, а если нет, то совсем ничего не будет в объекте.
Изменено: БМВ - 21.05.2018 21:23:08
По вопросам из тем форума, личку не читаю.
 
Sanja, Ігор Гончаренко, БМВ, Казанский, огромное спасибо за помощь!
Удалось в разы сократить количество мусора в тексте кода!
За основу взял способ Казанский, т.к. его понял и смог применить :)
Цитата
БМВ написал:
Если все листы указанные в массиве присутствуют, то да, а если нет, то совсем ничего не будет в объекте.
Именно это и хорошо тем, что можно лишний раз проконтролировать "взлом" (переименование листов) формуляра, т.к. все названия строго статичны. :)
Хотя, все же, я попался именно на этой ошибке, когда запустил без открытия книги с нужными листами :oops:  
 
AlexTM, ох как вам тут напомогали  :D вставлю и я свои 5 копеек (может пригодится)
Вместо двойного цикла типа такого
Можно обойтись одним
Метод обсуждался тут
Изменено: Jack Famous - 22.05.2018 13:36:52
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous,
А этот код к чему в данной теме?
Код
 
Sub Test1
Dim x,arrSh()
arrSh=Array("янв", "фев", "ноя")
    For each x in arrSh
        For each sh in ActiveWorkbook.Sheets
            If sh.Name=x Then 'Обрабатываем данные
        Next sh
    Next x
End Sub
 
"Все гениальное просто, а все простое гениально!!!"
 
Nordheim, в начале предлагали циклы типа такого - вот и решил предложить быстрый способ сравнения.
При обычных циклах количество сравнений = кол-во справочных элементов * кол-во листов в книге
При предложенном способе количество сравнений = кол-во листов в книге

Не думаю, что это оффтоп, если вы об этом…
Получим что-то такое
таким образом, во всех процедурах уровня модуля эта константа будет доступна
Цитата
AlexTM написал:
объявить один раз в начале модуля, дабы использовать потом в отдельных процедурах
Кажется, в этом и был вопрос  :)
Изменено: Jack Famous - 22.05.2018 14:15:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
БМВ написал:
Если все листы указанные в массиве присутствуют, то да, а если нет, то совсем ничего не будет в объекте
добавим проверку для #9
Код
...
If mySheets Is Nothing Then exit sub
For Each Sheet In mySheets
...
Изменено: TheBestOfTheBest - 22.05.2018 14:12:37
Неизлечимых болезней нет, есть неизлечимые люди.
 
TheBestOfTheBest,  а разве не на этапе
Set mySheets = Worksheets(Array("янв", "фев", "ноя"))
уже ошибка будет.
По вопросам из тем форума, личку не читаю.
 
Ну что вы придираетесь...
Код
Dim mySheets As Sheets
 
Sub Init()
On Error Resume Next
Set mySheets = Worksheets(Array("янв", "фев", "ноя"))
End Sub
 
Sub OtherSub()
If mySheets Is Nothing Then Exit Sub
For Each Sheet In mySheets
  '...
Next
End Sub
код из #9
Изменено: TheBestOfTheBest - 22.05.2018 14:24:29
Неизлечимых болезней нет, есть неизлечимые люди.
 
Цитата
TheBestOfTheBest написал:
Ну что вы придираетесь...
Ни в коем случае, тем более, что в зависимости от задачи может быть применимы разные методы.

Если листы по списку должны строго присутствовать, то  №17 и как раз если не соотв. то алерт, при этом еще при инициализации можно.
Если нужно обработать только листы подходящие под список , то возможны варианты включая наполнение mySheets только теми листами что представлены в книге.
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх