【问题标题】:Make a variable from COUNTA in table column从表列中的 COUNTA 创建一个变量
【发布时间】:2019-11-21 06:33:38
【问题描述】:

我想执行以下操作: '计算活动工作表上表格第 1 列中的所有非空白单元格。 '将此单元格数量保存为变量“TransQty”。 '如果计数为 0,则消息“此选项卡上没有项目被标记为过渡”。 '如果计数大于 0,是/否消息“'TransQty' 项目将从该选项卡转换。您要继续吗?” '如果“否”,结束。 '如果“是”,继续执行其余代码。

我想使用表格列的标题,而不是列位置。这样添加和删除列不会影响代码的功能。

Sub Transition_from_Queue()

Dim TransRange As Range
Dim TransQty As Integer

Set TransRange = Worksheets("Project Queue").DateBodyRange("TableQueue[Transition]")

For Each TransRange In Selection
    If Application.WorksheetFunction.CountA(TransRange) Then
        TransQty = TransQty + 1
    End If
Next TransRange

If TransQty = 0 Then
    MsgBox "No projects on this tab are marked for transition."
        Else
        If TransQty > 0 Then
            MsgBox Range("TransQty") & "projects will be transitioned from this tab." & vbNewLine & "Would you like to continue?"
        End If
End If

在尝试了多种不同方式的代码后,我发现了几个问题。 1)我没有正确识别表格列,无法弄清楚我做错了什么。我想使用列标题,而不是列位置。 2)无论我在目标列的0个单元格还是100个单元格中都有文本,我一直收到TransQty = 0的消息。

【问题讨论】:

  • 什么是DateBodyRange?看起来像是一个错字,但更重要的是DataBodyRangeListObject 的属性,而不是Worksheet

标签: vba counting listobject


【解决方案1】:

您的代码非常接近您的需要。下面我的示例中有两个要点。第一个是将您的表格列直接分配给Range。第二点是如何检查一个单元格是否为空。使用COUNTA 可以计算整个范围内为空的单元格数量,但不起作用(我认为)是循环的原因。

Option Explicit

Sub test()
    Dim thisSheet As Worksheet
    Set thisSheet = ActiveSheet

    '--- this is not really needed, but shows how to get a variable
    '    for the whole table
    Dim thisTable As ListObject
    Set thisTable = thisSheet.ListObjects("TableQueue")

    Dim transitionData As Range
    Set transitionData = thisSheet.Range("TableQueue[Transition]")

    '--- this gets you how many non-blank cells in the range
    Dim transQty As Long
    transQty = WorksheetFunction.CountA(transitionData)

    '--- BONUS CODE!!!!  totals up the non-blank data in the range
    '    (though not asked for by OP)
    Dim data As Range
    Dim transitionQty As Double
    For Each data In transitionData
        If Not IsEmpty(data.Value) Then
            transitionQty = transitionQty + data.Value
        End If
    Next data

End Sub

【讨论】:

  • 我重读了这个问题。我是否理解 OP 正在寻找 count,而不是 sum?循环然后是不必要的,单个WorksheetFunction.CountA 行应该可以解决问题,对吧?
  • 正确@BigBen 我正在寻找计数。单元格中的数据是从数据验证列表中选择的文本。我想计算有多少单元格中有文本。
  • 修复Set TransRange 行后,TransQty = Application.WorksheetFunction.CountA(TransRange)
  • 今天早上我的大脑比手指还慢。谢谢你让我理顺。更正上面的代码
  • 您也可以使用WorksheetFunction.Sum 代替循环并检查非空单元格,但我离题了...
猜你喜欢
  • 2019-09-11
  • 1970-01-01
  • 2015-09-24
  • 2023-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 2019-05-31
相关资源
最近更新 更多