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 - 如果语句计数器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

VBA Excel ADO SQL 更新查询不起作用

Excel VBA UDF 操作字符串不起作用

Excel VBA 代码在 Open Office 中不起作用(列表中的代码复制文件)

简单的 VBA 数组连接不起作用

Word VBA虽然Wend语句不起作用

插入代码时,打开事件中的 Excel 2010 vba EnableEvent 不起作用