Excel中的VBA - 如果语句计数器不起作用
Posted
技术标签:
【中文标题】Excel中的VBA - 如果语句计数器不起作用【英文标题】:VBA in Excel - If statement Counter wont work 【发布时间】:2015-01-26 21:53:57 【问题描述】:我一直试图让这个 VBA 脚本自动执行一项任务,但我无法让它工作。
基本上,我在 Excel 中有一个包含多列和超过 1000 行的大型任务列表。它包含任务、分配给谁以及它是打开还是关闭。
H 列是分配给谁,N 列是任务是打开还是关闭。
我正在尝试按姓氏进行搜索,如果可以将其添加到计数器中。最终目标是获得一个人有多少未完成任务的总数。此外,N 列(任务状态)中的某些单元格有额外的文本,如 cmets 等。我确信在单元格中搜索一个单词的 InStr 函数会更好,但我无法弄清楚......
这是我的代码
Sub statuscount()
Dim tasksheet As Worksheet
Dim simons_count As Integer
Set tasksheet = ThisWorkbook.Sheets("tasks")
lr = tasksheet.Cells(Rows.Count, 1).End(xlUp).Row
For x = 5 to lr
If tasksheet.Cells(x, 8) = "Simons" And tasksheet.Cells(x, 14) = "OPEN" Then
simons_count = simons_count + 1
End If
Next x
tasksheet.Range("$O$5").Value = simons_count
End Sub
感谢您的帮助!
【问题讨论】:
将Simons_count As Integer
更改为Simons_count As Double
和$O$5
更改为O5
。
几个想法:A)你真的不需要宏,考虑使用 COUNTIFS 函数。 B)您的单元格中可能有一些尾随或前导空格使布尔语句失败尝试类似 Trim(tasksheet.cells(x, 8)) = "Simons", C) 这是一个旁注,在 VBA 中并不重要,但请始终确保将 coutner 初始化为 0。
完全不需要VBA。 VBA 不是“自动化”过程,因为您每次都必须运行宏。公式是自动化的,解决方案是使用它们。
感谢您的回复。我正在使用 VBA 脚本,因为我需要用它做更多的事情......要提取其他信息以获得一堆不同的计数。我还从数据库中导出了一个 excel 表,因此很难在表中只包含公式。此外,当我保存一个包含宏的工作表时,当我重新打开它时,宏不再起作用......因为我的计算机上没有启用 Marcos。我是 VBA 新手,但我确实有一些其他语言的基本经验。我有很多行数据,我需要为多个实例设置不同的“计数器”。
【参考方案1】:
在 VBA 中使用 If/And 会变得很棘手,最好嵌套两个 if 语句:
For x = 5 to lr
If tasksheet.Cells(x, 8) = "Simons" Then
If InStr(tasksheet.Cells(x, 14).Value, "OPEN") > 0 Then
simons_count = simons_count + 1
End If
End If
Next x
【讨论】:
我也将 InStr 函数添加到了顶部(因为它是全名,但由于名字重复而使用姓氏),这很有效......我使用了一个小样本得到一个简单的解决方案,但如果我需要它来检查其他 4 个人怎么办?我假设这将是一个 ElseIf 语句,但由于它是嵌套的,我将它放在哪里?所以可以说,其他 4 人是:Randle、Jacobs、Carter、Ngyen。我如何让它查看该行并将其添加到各自的柜台? 我可以想到的几种方法可以轻松做到这一点; 1. 对输入框进行编程以询问您要搜索的名称,这样每次运行代码时都输入您要计算的名称。或 2. 将所有名称放在一个数组中,并让它遍历数组中的每个名称。 阵列听起来是个绝妙的主意!我什至没有想过这样做。一旦我让它工作,我一直在想办法压缩一些代码。该表有大约 60 位同事,我需要计数(每人):# 总任务、# 开放任务、# 已关闭任务、# 中等级别任务和 # 低级别任务......所有这些我都需要它来打印每个人的每个总数......我是手工完成的并且发疯了。这是我的噩梦!【参考方案2】:这是一个更通用的功能。插入一个模块并在其中粘贴以下代码。您可以像使用任何其他 Excel 内置函数一样使用该函数
Function LastNamecounter(lastName As String, status As String) As Long
LastNamecounter = 0
Dim tasksheet As Worksheet
Set tasksheet = ThisWorkbook.Sheets("tasks")
lr = tasksheet.Cells(Rows.Count, 1).End(xlUp).Row
For i = 5 To lr
If InStr(tasksheet.Cells(i, 8).Value, lastName) <> 0 And InStr(tasksheet.Cells(i, 14).Value, status) <> 0 Then
LastNamecounter = LastNamecounter + 1
End If
Next i
End Function
【讨论】:
以上是关于Excel中的VBA - 如果语句计数器不起作用的主要内容,如果未能解决你的问题,请参考以下文章