VBA根据另一个工作表上的2个条件从工作表中删除行

时间:2014-02-02 20:38:56

标签: excel-vba conditional-statements vba excel

我在网上搜索并尝试了所有可能的解决方案,但是徒劳无功。

有审计员在特定领域查看特定客户。

我有三个包含数据的工作表:摘要表,原始数据表和区域表。数据从数据表传输到汇总表,但包含不属于特定审计员的区域。区域列表中有一个指示符是/否,必须用于清除不需要区域的摘要表。

因此,我需要先从两个工作表上的区域名称中删除不需要的区域,然后删除区域清单上标有“否”的区域。

我尝试过的核心编码:

If ActiveCell.Formula = "=VLookup(B2,Areas!C2:D,1,False)"=True _
    And Sheets("Areas").Range("D2").Value = "No" Then     
    Sheets("Summary").EntireRow.Delete   

其中B2是包含区域的摘要中的列,C2是区域中相应的列,D2是区域中的列,列出是/否的选择。

如何编写代码以删除摘要中的行,其中区域在“摘要”和“区域”表中匹配,“区域”表中的指示符为“否”?

我也尝试过:

For I = LastRowCheck To 1 Step -1
     If Sheets("Summary").Range("B" & LastRowCheck).Value = _
        Sheets("Areas").Range("C" & sdRow).Value _
        And Sheets("Areas").Range("D" & NoRow).Value = "No" Then
     If DelRange is Nothing Then
       Set DelRange = Sheets("Summary").Rows(i)
  End If
  If not DelRange Is Nothing Then DelRange.EntireRow.Delete
  End If  
  Next i

有人可以告诉我我在哪里错过了船吗?

1 个答案:

答案 0 :(得分:0)

在我看来,区域表将会有...让我们说50个不同的区域,而汇总表将有许多行,每个行都有一个区域表区域。所以多行将具有相同的区域。因此,您希望遍历摘要表上的所有行,从区域表中找到相应的区域,并查看该区域在D列中是否具有“否”值。

鉴于上述理解,以下两个选项都应该起作用:

A)

  • 遍历区域表上的所有行,并使用D
    加载所有区域名称 列数值为“否”的数组。

  • 循环摘要表

  • 上的所有行
  • 使用内部循环检查并查看摘要表中的当前行是否为 发现在“坏区”中
  • 删除整行

B)

  • 使用循环查找区域表中D列值为“No”的所有行,并将每个区域中的名称加载到数组中。

  • 使用所述数组作为数据过滤器的条件,过滤摘要表中的区域名称列

  • 删除所有可见行(区域表中找到区域的行,D列值为“否”

代码:

Dim strArray() as variant
ReDim strArray(1 to 1)
dim deleted as boolean 'keeps track of whether row was delete or not

Sheets("Area Sheet").Activate
Range ("A1").Activate  'where assuming column a has area name
for i = 1 to lastrow
    if ActiveCell.offset(0, 3).formulaR1C1 = "No" then 'column D, I have had bad experience with .value so i always use formulaR1C1
          strArray(i) = ActiveCell.formulaR1C1
    end if
    ActiveCell.offset(1,0).activate
next

Sheets("Summary Sheet").activate
Range("A1") ' again, assuing a has area name
for i = 1 to endrow
    delete = false 'reset delete before inner loop
    for j = 1 to ubound(strArray)
         if ActiveCell.formulaR1C1 = strArray(i) then
              ActiveCell.entireRow.delete xlShiftUp
              deleted = true   
              exit for   'exits inner loop
         else
              deleted = false
         end if
    next
    if  not deleted then ActiveCell.offset(1,0).offset ' move down to next row if curent row was not deleted
next

B代码:

'use same as A code to get all areas with D Column "No" into array
Dim rng as Range

Range("A1").activate ' after activating summary sheet, again, assuming a has area name
ActiveCell.entireColumn.select
selection.AutoFilter Field:=1, Criteria1:=strArray, Operator:=xlFilterValues ' this will filter so only rows with area and column D of "No" will be visible.
set rng = Range("A1", Cells(lastrow, lastcolumn)).SpecialCells(xlCellTypeVisible) ' this will get all visible cells (ones that are visible with current filter condition)
rng.entirerow.delete xlshiftup 'will delete all rows in rng

取决于数据量,A)application.Screenupdating =false可能比过滤器快(使用时看不到幕后发生的事情。)确保再次执行Application.screenupdating = true之后再转回上。

代码可能需要调整拼写错误等。但基础应该在那里 因为每个人都有自己的方式获得最后一排,所以我没有设置endrow。

HTH 祝你好运!