【问题标题】:deleting rows containing excel vba删除包含 excel vba 的行
【发布时间】:2014-11-04 00:23:00
【问题描述】:

VBA 新手,这是我第一次发布问题。我有一个包含大约 50k 条记录的工作簿。数据包括大约。 2700 只美国股票,每两周更新一次数据,以查看价格、交易量等。我将每两周更新一次数据,当我这样做时,我将消除不符合某些标准的证券。每次更新时,可能有 30 到 50 只证券需要删除,因此为每个证券过滤并删除该证券的所有行非常耗时。

我希望能够在名为“过滤器”的工作表上维护一个表格,每次我需要删除某些证券时,我可以手动填充我的“删除”,然后运行一个宏来过滤到这些证券并删除所有行。

到目前为止,这是我尝试将数据过滤到所需行的方法。我似乎无法让它工作。我在下面的粗体行中收到错误。

我有一个名为“Filtering”的表,名为“Filters”表(第五张表),原始数据位于名为“Data”的表中(第一张表)。任何帮助是极大的赞赏。

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

【问题讨论】:

  • 你的桌子是怎么命名的?你是用 this method 做的吗?
  • 这类使用自动过滤器完成删除的问题已经被讨论过很多次了。您没有在SO中进行搜索吗? :)
  • 这就是问题所在,我认为我的表命名不正确。我是通过名称管理器通过公式完成的。我回去创建了一个表格,并按照@jeeped 的建议添加了标题名称,效果很好。我也在 SO 中搜索了这个,这就是我能够创建我发布的基本代码的方式。我只是不明白为什么我一直收到 1004 错误,所以我发布了这个问题。非常感谢您的帮助。

标签: vba excel rowdeleting


【解决方案1】:

我设置了一个快速测试工作簿,并通过将其中一行更改为:

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

我在 Filters 工作表上创建的 tableInsert, Table 然后 Table Tools, Table NameFiltering)有一个带有列标签的标题行是库存。我不清楚您创建的表格的确切性质,但这对我有用。我相信您只需要更改引用表中数据列的方式即可。如果你不能让它快速工作,生成一个宏,记录去股票列,然后点击Ctrl+<spacebar>选择表格中的股票名称列。这可能会清除从表中选择数据列的任何语法问题。

【讨论】:

    【解决方案2】:

    你也许可以适应这样的事情。我假设“过滤”范围是一个单列范围,其中包含要删除的项目。

    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
    

    【讨论】:

    • 感谢您的回复。我尝试了这段代码,但是当我到达该行时仍然遇到相同的错误:“Set sedol = ws2.Range("Filtering")。错误是'运行时错误'1004':对象的方法'范围' _Worksheet' 失败。
    • 这表明您确实没有ws2 上存在这样的命名范围。仔细检查您的命名范围是否存在:)
    • 另外,看起来你可能有一个表(这是一个列表对象),所以你可以试试这个:Set sedo1 = ws2.ListObjects("Filtering").DataBodyRange
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2018-02-21
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多