Есть ли способ перебрать видимые ячейки в столбце таблицы (listobject)?

#excel #loops #visible #listobject

#превосходить #петли #видимый #listobject

Вопрос:

В таблице Excel ( ListObject ) я начал отслеживать сотни фильмов и их статус, когда я записываю их на диск для использования в Plex. В таблице нет ничего необычного; в ней хранятся вещи, которые вы ожидаете, такие как папка для копирования, папка Plex media, название фильма, год его выпуска, папка резервного копирования, в которой я храню копию файлов необработанных дисков и т. Д. Я создал рабочую книгу после того, как уже снял несколько сотен фильмов, чтобы упростить отслеживание. В результате несоответствия в моих методах до того, как я создал книгу, теперь мне нужно выполнить некоторую очистку в книге. Я хочу сделать это с помощью VBA, так как ручное исправление было бы утомительным, подверженным ошибкам и заняло бы много времени. У меня есть алгоритм, который, как я полагаю, будет работать, но он основан на возможности перебирать видимые ячейки в столбце отфильтрованной таблицы-столбец, который я буду использовать, чтобы определить, нужно ли мне вносить какие-либо исправления в эту строку, а затем, при необходимости, столбцы, в которых необходимо внести исправления.

Любое руководство здесь будет оценено по достоинству! Спасибо

Комментарии:

1. Почему цикл должен выполняться по отфильтрованным строкам? Почему условия, применяемые в качестве табличных фильтров, не могут быть преобразованы в условные операторы в цикле?

2. Хороший вопрос. Короткий ответ заключается в том, что я ожидаю, что условия изменятся таким образом, который я не могу предсказать, потому что они основаны на любых ошибках, которые я совершу в будущем. Я сделал 400 фильмов; мне осталось сделать около 1000, и для повышения эффективности у меня есть 3 машины, настроенные для их обработки, поэтому я буду обновлять книгу со всех 3 машин (у которых есть разные локальные диски, которые могут использоваться для промежуточной стадии копирования). Этот процесс утомителен и долог, поэтому я ожидаю, что в будущем допущу несколько ошибок. Поэтому я хочу, чтобы этот корректирующий процесс был достаточно гибким, чтобы справиться с этим.

3. Еще одна причина @JosWoolley заключается в том, что я хочу ограничить область действия-и потенциальный ущерб-который может нанести процедура в случае обнаружения ошибки в моем коде, и использовать только подмножество моих данных, когда код запускает ограничения, в которых мне нужно будет проверить наличие ошибок. Я не уверен, спрашивали ли вы, потому что то, что я хочу сделать, либо невозможно, либо нецелесообразно. В любом случае, я хотел бы знать, так как у меня есть только промежуточные навыки работы с VBA, и я здесь, чтобы учиться. Спасибо

Ответ №1:

 Sub Test()  Set MyTable = Worksheets("Sheet1").ListObjects("Table1")  With MyTable  For i = 1 To .DataBodyRange.Rows.Count  If .DataBodyRange.Rows(i).EntireRow.Hidden = False Then  [Do Something]  End If  Next i End With  End Sub  

[Do Something] Замените желаемым действием видимые строки, например:

 Sub Test()  Set MyTable = Worksheets("Sheet1").ListObjects("Table1")  With MyTable  For i = 1 To .DataBodyRange.Rows.Count  If .DataBodyRange.Rows(i).EntireRow.Hidden = False Then  .DataBodyRange(i, 3).Value = "I'm not hidden!"  End If  Next i End With  End Sub  

который вводит «Я не скрыт!» в третий столбец этой таблицы для каждой видимой строки.

Комментарии:

1. Спасибо @joswoolley. Я реализовал модифицированную версию вашего решения, и оно хорошо работает! Я видел это .EntireRow свойство раньше, но не знал, что у него есть .Hidden атрибут. И огромное количество способов, которые, похоже, могли бы сработать, делали метод проб и ошибок утомительным. Вы экономите мне много времени!