“ Do While循环”遍历工作表直至完成,但决不匹配条件

时间:2019-01-08 21:00:02

标签: excel vba excel-2010 excel-2016

我有一个用户窗体,用户将数据输入到单元格中,然后将其排序到Excel电子表格“ Main”上。

如果用户需要删除条目,则将其移至用户表单的最左侧,直到有问题的条目,然后单击Delete,出现一个选项框,询问他们是否要删除“是”或“否” 。如果用户点击“是”,则用户表单应该清除有问题的数据的单元格,而在电子表格“主”上,用户表单会逐行显示,并将“ Auth1”中的值与“ A”列中的对应项相匹配,删除它。

都没有发生。稍作休息,逐步执行代码和程序,我有一个Do While循环,直到它用完所有单元格进行检查,然后继续处理其余代码。

它自吹自传,不再经过条件为“ true”的匹配单元格。

相关代码段:

    Do While UMAuthorization!Auth1 <> ActiveCell
        ActiveCell.Offset(1, 0).Activate
    Loop

“是”总计

 Private Sub DeleteYes_Click()
   DeleteForm.Hide
   CloseBook
   OpenMinimized
   Range("A2").Select
   Sheets("Main").Unprotect
       Do While UMAuthorization!Auth1 <> ActiveCell
          ActiveCell.Offset(1, 0).Activate
       Loop
   ActiveCell.EntireRow.Delete Shift:=xlUp
   Sheets("Main").Protect
SaveBook
   Range("A2").Select
    If Auth2 <> "" Then
        Do While UMAuthorization!Auth2 <> ActiveCell
            ActiveCell.Offset(1, 0).Activate
        Loop
    Else
        Do While UMAuthorization!Claim1 > ActiveCell And ActiveCell <> ""
            ActiveCell.Offset(1, 0).Activate
        Loop
    End If
End Sub

我们刚刚更新到2016年Excel。这段代码可以在2010年完美运行。对我来说,这完全有意义。但是,Excel 2016未确认它。我检查了引用并修改了值,但在这里很困惑。有人在想吗?

编辑:这是一些荒谬的示例数据。 Auth是列A。行1是静态标头。

1 Auth    Claim  TaxID    Type   AuthDate   
2 0033087 154255 270275455    PT     08/25/18
3 0094525 155512 545465646    PT     12/12/18
4 0025125 555555 565445546    Acu    11/15/12
5 9994313 354585 564645545    X      01/08/18
6 5464654 111551 688558585    Chiro  09/15/09 
7 9954545 445664 545665456    OT     05/30/15

2 个答案:

答案 0 :(得分:0)

您应该替换之间的代码

Sheets("Main").Unprotect

Sheets("Main").protect

有了这个

With Worksheets("Main").Range("A:A")
    Set c = .Find(UMAuthorization!Auth1, LookIn:=xlValues)
    If Not c Is Nothing Then
        Do
            c.EntireRow.Delete Shift:=xlUp
            Set c = .Find(UMAuthorization!Auth1, LookIn:=xlValues)
        Loop While Not c Is Nothing
    End If
End With

它将从您的表单中找到值,并删除与A列匹配的所有行。

您可以通过将列A更改为A2:A200之类的范围来限制范围。

如果您只想删除第一个匹配项,则删除do循环,但保留删除行。

由于我没有您的表格,因此我使用静态值对其进行了测试。

答案 1 :(得分:0)

这可能与Excel解释数据的方式有关。我可以看到您的数据样本中有一系列“标题”零。

范围对象(例如ActiveCell)的默认对象属性是.value。 我会尝试通过ActiveCell.value2更改ActiveCell。 有关差异的信息,请参见以下相关文章:What is the difference between .text, .value, and .value2?

Do While UMAuthorization!Auth1 <> ActiveCell.value2
    ActiveCell.Offset(1, 0).Activate
Loop

另一种方法是运行cLng()将两个变量转换为一个数字,其中“标题”零将被“修剪”。

Do While cLng(UMAuthorization!Auth1) <> cLng(ActiveCell)
    ActiveCell.Offset(1, 0).Activate
Loop

或者,如果代码少于7位,则可以强制显示零:

Do While format(UMAuthorization!Auth1, "0000000") <> format(ActiveCell, "0000000")
    ActiveCell.Offset(1, 0).Activate
Loop

让我们知道Loop是否仍然永远运行吗?

更一般地说,我建议避免依赖.activate和ActiveCell对象滚动数据,因为如果用户在Loop运行时单击工作表上的某个位置,这既缓慢又冒险。 您可以有效地将数据提取到数组中,在VBA中处理数据数组以标识相关行,然后处理工作表: (请注意,这还将使您能够通过在存储在数组中的数据上投放debug.print来查看Excel如何读取数据)

Dim mySheet as new worksheet
set mySheet = ActiveSheet 'Or something else

Dim arrMyData() as variant 'Must be a variant
arrMyData = range("A2:A999").Value2 'Adjust A999 with your case

dim i as long
for i = lBound(arrMyData,1) to uBound(arrMyData,1)
    debug.print "Comparing " & arrMyData(i,1) & " with " & UMAuthorization!Auth1
    if arrMyData(i,1) = UMAuthorization!Auth1 then
    'if cLng(arrMyData(i,1)) = cLng(UMAuthorization!Auth1) then  <- Use this line if the one aboe does not work
        mySheet.Rows(i+1).delete Shift:=xlUp 'i+1 Because i=1 because your array starts at Row 2 (Cell A2)
        Debug.Print "Deleted row " & i+1
    end if
Next