удаление строк, содержащих excel vba

Новичок в VBA, и я впервые задаю вопрос. У меня есть рабочая книга, содержащая около 50 тысяч записей. Данные состоят из ок. 2700 акций США с двухнедельным обновлением данных для просмотра цены, объема торгов и т. д. Я буду обновлять данные раз в две недели, и когда я это сделаю, я собираюсь исключить ценные бумаги, которые не соответствуют определенным критериям. При каждом обновлении может быть от 30 до 50 ценных бумаг, которые необходимо удалить, поэтому фильтрация каждой из них и удаление всех строк для этой ценной бумаги занимает много времени.

Я надеюсь, что смогу поддерживать таблицу на листе под названием «Фильтры», которую я могу вручную заполнять своими «удалениями» каждый раз, когда мне нужно удалить определенные ценные бумаги, а затем запускать макрос, который фильтрует только эти ценные бумаги и удаляет все ряды.

Вот что я пробовал до сих пор, чтобы отфильтровать данные до необходимых строк. Кажется, я не могу заставить его работать. Я получаю ошибку в жирной строке ниже.

У меня есть таблица под названием «Фильтрация», названная на листе «Фильтры» (пятый лист), а необработанные данные находятся на листе под названием «Данные» (первый лист). Любая помощь приветствуется.

Sub deleterows()

Dim Filtering As Variant
Dim ws1 As Worksheet, ws2 As Worksheet
Dim sedol As Range, rngData As Range


Set ws1 = Worksheets("Data")
Set ws2 = Worksheets("Filters")

Set rngData = ws1.Range("$D$1").CurrentRegion
**Set sedol = ws2.Range("Filtering")**

Filtering = sedol.Value

rngData.AutoFilter Field:=1, _
                  Criteria1:=Application.Transpose(Filtering), _
                  Operator:=xlFilterValues

person KPC    schedule 03.11.2014    source источник
comment
Как вы назвали свой стол? Вы сделали это с помощью этот метод?   -  person bp_    schedule 03.11.2014
comment
Такие вопросы, когда удаление выполняется с помощью автофильтра, обсуждались много раз. Вы не делали поиск в SO? :)   -  person Siddharth Rout    schedule 03.11.2014
comment
В этом была проблема, я думаю, что моя таблица была названа неправильно. Я сделал это через менеджер имен по формуле. Я вернулся и создал таблицу, и добавил имя заголовка, как рекомендовано @jeeped, и это отлично сработало. Я также искал это в SO, и именно так я смог создать базовый код, который я опубликовал. Я просто не мог понять, почему я продолжал получать ошибку 1004, поэтому я разместил вопрос. Большое спасибо за помощь.   -  person KPC    schedule 03.11.2014


Ответы (2)


Я создал рабочую книгу для быстрого тестирования и сразу же заработал, изменив эту строку на:

Set sedol = ws2.Range("Filtering[Stock]")

В таблице, которую я создал (Insert, Table, затем Table Tools, Table Name Фильтрация) на листе Фильтры, была строка заголовка с меткой столбца Запасы. Мне неясна точная природа созданной вами таблицы, но это сработало для меня. Я считаю, что вам просто нужно изменить способ ссылки на столбец данных в вашей таблице. Если вы не можете заставить его работать быстро, создайте макрос, который записывает переход к столбцу акций, а затем нажатие Ctrl+<spacebar> для выбора столбца с названиями акций в таблице. Это может устранить любые проблемы с синтаксисом при выборе столбца данных из таблицы.

person Community    schedule 03.11.2014

Возможно, вы сможете адаптировать что-то вроде этого. Я предполагаю, что диапазон «Фильтрация» представляет собой диапазон из одного столбца, который содержит элемент, который нужно удалить.

Dim r as Integer

Set sedol = ws2.Range("Filtering")

For r = 1 to sedo1.Rows.Count

    Filtering = sedol(r).Value

    rngData.AutoFilter Field:=1, _
                  Criteria1:=Filtering, _
                  Operator:=xlFilterValues

    rngData.SpecialCells(xlCellTypeVisible).EntireRow.Delete

Next

Выше приведен объект диапазона Name. Если вместо этого у вас есть таблица ListObject, попробуйте изменить назначение на sedo1, например:

Set sedo1 = ws2.ListObjects("Filtering").DataBodyRange
person David Zemens    schedule 03.11.2014
comment
Спасибо за ответ. Я попробовал этот код, но все еще получаю ту же ошибку, когда дохожу до строки: Set sedol = ws2.Range(Filtering). Ошибка «Ошибка времени выполнения» «1004»: сбой метода «Диапазон» объекта «_Worksheet». - person KPC; 03.11.2014
comment
Это предполагает, что у вас нет такого именованного диапазона, который существует на ws2. Дважды проверьте, существует ли ваш именованный диапазон :) - person David Zemens; 03.11.2014
comment
В качестве альтернативы, похоже, у вас может быть таблица (которая является объектом списка), поэтому вы можете попробовать это: Set sedo1 = ws2.ListObjects("Filtering").DataBodyRange - person David Zemens; 03.11.2014