我有一个用户窗体,用户将数据输入到单元格中,然后将其排序到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
答案 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