作者:hacker发布时间:2022-07-11分类:网站入侵浏览:109评论:1
VBA删行,必须逆向删,从下向上处理。
咱们假设身份证号是从A2到A100。
这段代码的效果,是从最后一行向第2行,逐行进行判断。
先用IF判断A2至A列第i行中,含有多少个Ai的身份证号,
如果第2行至第i行含有Ai这个身份证号的数量大于1个,说明Ai这个身份证号是重复的,
满意这个条件的话,再用另一个IF继续判断,
如果Bi是空值或者等于0,
那么第i行删除。
代码如下,你复制吧:
Sub ShanChong()
Dim i
For i = 100 To 2 Step -1 '逆向遍历第100至第2
If WorksheetFunction.CountIf(Range("A2:A" i), Range("A" i)) 1 Then '如果Ai在A2:Ai中的个数大于1个
If Range("B" i) = "" Or Range("B" i) = 0 Then '如果Bi等于空或者等于0
Rows(i).Delete '那么删除第i行
End If
End If
Next
MsgBox "处理完毕!", , "提示" '完毕时弹窗提醒
End Sub
许多EXCEL问题都涉及数据计数,对于一些简单的计数,通常使用COUNT函数或COUNTA函数就可以解决。然而,在实际的业务处理当中,往往存在诸多条件的限制,仅仅使用简单的统计函数是无法满足人们的实际需求的,例如多条件计数、统计不重复个数等。
例如,在一个EXCEL表格中,D列是考生的数学考试成绩,我们想统计数学成绩及格的人数。可以使用“=COUNTIF(D:D,"=60")”来实现。
本例中,COUNTIF函数可以对区域中满足单个条件的单元格区域进行计数。语法如下:
COUNTIF(参数一,参数二),其中参数一为需要计算其中满足条件的单元格数目的单元格区域,参数二是用于定义将对哪些单元格进行计数的数字、表达式、单元格引用或文本字符串。
COUNTIF函数的常见用法如下:(假如数据所在单元格区域命名为“ Data ”)
公
式
说 明
=COUNTIF(Data,"=") 返回真空单元格个数(真空单元格是指什么都没有的单元格)
=COUNTIF(Data,"") 返回真空+假真空单元格个数(假真空是指0字符的空文本)
=COUNTIF(Data,"")
返回非真空单元格个数
=COUNTIF(Data,"*")
返回文本型单元格个数
=COUNTIF(Data,"9.99E+307")
返回数值型单元格个数
=COUNTIF(Data,"""") 返回区域内所有单元格个数
=COUNTIF(Data,"0") 返回偶包含负值的单元格个数
=COUNTIF(Data,"0") 返回真不等于零的单元格个个数
=COUNTIF(Data,60)
返回值等于60的单元格个数
=COUNTIF(Data,"60") 返回值大于60的单元格个数
=COUNTIF(Data,"60") 返回值小于60的单元格个数
=COUNTIF(Data,"=60")
返回值大于等于60的单元格个数
=COUNTIF(Data,"=60")
返回值小于等于60的单元格个数
=COUNTIF(Data,A1)
返回值与A1单元格内容相同的单元格个数
=COUNTIF(Data,""A1) 返回值大于A1单元格内容的单元格个数
=COUNTIF(Data,""A1) 返回值小于A1单元格内容的单元格个数
=COUNTIF(Data,"???")
返回字符等于3的单元格个数
=COUNTIF(Data,"YDL")
返回值等于YDL的单元格个数
=COUNTIF(Data,"YDL?")
返回以字母YDL开头且字符数等于4的单元格个数
=COUNTIF(Data,"YDL*")
返回以字母YDL开头的文本单元格的个数
=COUNTIF(Data,"?YDL*")
返回第2,3,4字符为YDL的单元格个数
=COUNTIF(Data,"*YDL*")
返回含的YDL字符的单元格个数
=COUNTIF(Data,"*"A1"*")
返回包含A1单元格内容的文本单元格个数
=COUNTIF(Data,TODAY()) 返回值等于当前日期的单元格个数
=COUNTIF(Data,""AVERAGE(Data)) 返回大于均值的单元格个数
=SUM(COUNTIF(Data,""{10,15})*{1,-1})
返回大于10小于等于15的单元格个数
=SUM(COUNTIF(Data,{TRUE,FALSE}))
返回包含逻辑值的单元格个数
特别指出的是,在EXCEL2010中,新增了一个多条件计数函数,那就是“COUNTIFS” ,假如在一个EXCEL表格中,D3:D50单元格的内容是职工的年龄,E3:E50单元格的内容是是否有房,F3:F50单元格的内容是是否有车,那么统计职工中35岁以上有房有车的人数应该用如下公式:
COUNTIFS(D3:D50,"35",E3:E50,"是",F3:F50,"是")
使用方法:
[如果您知道如何使用宏,可以跳过这一节]
1.为了防止宏被禁用,需要修改安全性设置。具体方法为,在 Excel 中打开“工具”菜单,依次指向 宏 - 安全性,打开“安全性”对话框,并在“安全级”选项卡中选择“中”。这样您就可以在打开文档时选择是否禁用宏。如果安全级为“高”,那么没有经过签署的宏会被禁用〔就包括自己使用 VBA 编写的函数(宏)〕。
2.打开“工具”菜单,依次指向 宏 - Visual Basic 编辑器,在出现的 Visual Basic 编辑器中新建一个模块,并在模块中输入代码
全部代码如下:
'注意:由于 VBA 对文档的修改有不可逆转性,因此请注意备份!
Sub AutoFillMarks()
On Error GoTo ErrHandle
Dim shtNames As Worksheet '表 1
Dim shtMarks As Worksheet '表 2
Dim strTemp As String
Dim I As Long
Dim ColMarks As Collection
Dim strSTAT As String
Dim lngRecMiss As Long
Dim strName As String
10
strTemp = InputBox("请输入姓名表(表 1)的名称:")
If strTemp = Empty Then Exit Sub
Set shtNames = ActiveWorkbook.Worksheets.Item(strTemp)
strTemp = InputBox("请输入成绩表(表 2)的名称:")
If strTemp = Empty Then Exit Sub
Set shtMarks = ActiveWorkbook.Worksheets.Item(strTemp)
DoEvents
strSTAT = "姓名表:" shtNames.Name vbCrLf "成绩表:" shtMarks.Name vbCrLf
If MsgBox(strSTAT, vbOKCancel + vbInformation, "确认") = vbCancel Then GoTo 10
Set ColMarks = New Collection
Application.StatusBar = "正在载入成绩表……"
For I = 1 To shtMarks.Rows.Count
strName = Trim(shtMarks.Cells(I, 1)) '从成绩表中提取一个姓名,并删除姓名前后的空格
If strName Empty Then
50 ColMarks.Add shtMarks.Cells(I, 2), strName '将姓名作为关键字,把相应的分数放入集合中
End If
If I Mod 500 = 0 Then Application.StatusBar = "正在载入成绩表…… " I "/" shtMarks.Rows.Count: DoEvents
Next I
strSTAT = strSTAT "已载入的成绩数量(重名的按照一个计算):" ColMarks.Count vbCrLf
Application.StatusBar = "正在填写姓名表……"
For I = 1 To shtNames.Rows.Count
'由于 Excel 2003 中每个工作表有 65536 行,因此 Rows.Count 始终为 65536
strName = Trim(shtNames.Cells(I, 1)) '从姓名表中提取一个姓名,并删除姓名前后的空格
If strName Empty Then '如果这一行的第一列有姓名
If ColExist(ColMarks, strName) Then '检查姓名是否存在
shtNames.Cells(I, 2) = ColMarks.Item(strName) '填写姓名
Else
shtNames.Cells(I, 3) = "未找到"
lngRecMiss = lngRecMiss + 1
End If
End If
If I Mod 250 = 0 Then Application.StatusBar = "正在填写姓名表…… " I "/" shtNames.Rows.Count: DoEvents
Next I
strSTAT = strSTAT "未找到成绩的人数:" lngRecMiss
Application.StatusBar = ""
MsgBox strSTAT, vbInformation, "统计信息"
Exit Sub
ErrHandle:
Select Case Erl
Case 50 '如果出现重名
strSTAT = strSTAT "重名:成绩表,行:" I ",姓名:" strName vbCrLf
ColMarks.Item(strName) = "#重名#"
Resume Next
Case Else
Select Case MsgBox("Error:" Err.Number vbCrLf Err.Description, 16 + vbAbortRetryIgnore)
Case vbAbort
Case vbRetry
Resume
Case vbIgnore
Resume Next
End Select
End Select
End Sub
我刚才也写了一个,你下载解压出来(共2个文件)。
然后打开VBA编辑器,在工程资源管理窗口内点鼠标右键,
再点“导入文件……”,把UserForm1导入你要实现查找功能的那个文档中。
运行就行了。
查找结果列表框中全部列出。
单击列表中的条目,就会跳转到相应工作表,选定对应单元格。
优秀人数:"
a
msgbox
")
if
rng
=
80
then
a
=
a
+
1
if
rng
,
c
as
byte,
i
as
byte;良好人数:"
b
msgbox
"=
60
then
j
=
j
+
1
next
b
=
i
-
a
c
=
j
-
i
msgbox
"表格没截图,不知道从公式如何引用数据
你提到的vba,其实使用公式函数就能轻松解决了
截个图补充一下吧,注意行号列标一起截好
补充回答代码如下,当然也可以引用工作表函数countif:
sub
test()
dim
a
as
byte,
b
as
byte,
j
as
byte
dim
rng
as
range
a
=
0:
i
=
0:
j
=
for
each
rng
in
range("e2;=
70
then
i
=
i
+
1
if
rng
:e100"
标签:vba中查找人数
已有1位网友发表了看法:
访客 评论于 2022-07-11 11:37:33 回复
ksheet '表 2Dim strTemp As StringDim I As LongDim ColMarks As CollectionDim strSTAT As StringDim l