#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
атрибут. И огромное количество способов, которые, похоже, могли бы сработать, делали метод проб и ошибок утомительным. Вы экономите мне много времени!