【问题标题】:VBA code to dynamically search worksheet and add up cells动态搜索工作表并添加单元格的 VBA 代码
【发布时间】:2018-10-19 00:33:52
【问题描述】:
Sub CountLarge()
    Sheets("Data").Select
    Dim myNum As Integer
    Dim cell As Range
    Dim rngFullRange As Range
    Dim nLarge As Integer

    Do
        myNum = Application.InputBox("Enter a number")
        If myNum = "" Then Exit Sub
    Loop Until myNum > 0 And myNum < 210

    With Range(“A1”)
        Range(.Offset(1, 0), .End(xlDown).End(xlToRight)).Name = 
“dynamicRange”
    End With

    Set rngFullRange = wsData.Range(“dynamicRange”)

    For Each cell In rngFullRange
        If cell.Value > myNum Then
            nLarge = nLarge + cell.Value
        End If
    Next

    MsgBox (nLarge)
End Sub

这是我的代码,我需要它来遍历工作表中的每个值(数据从 A2 开始并跨越整个工作表,因此我设置了一个动态范围)并将所有大于用户输入的值相加并显示在一个消息框。当我运行程序时,我可以输入一个数字,但最后我没有收到消息框。

**注意:我已经根据您的反馈编辑了代码,目前错误在 With Range("A1") 行中。该范围适合工作表,所以我很困惑为什么数据从 A2 开始并填充工作表的其余部分,这就是我使用这个范围的原因。

【问题讨论】:

  • 如果你在For Loop前面加上debug.print rngFullRange.Address这行,它在即时窗口(Ctrl+G)中的意思是什么?
  • 。 . . MsgBox WorksheetFunction.SumIf(wsData.Cells, "&gt;" &amp; InputBox("Enter A Number"))?
  • myValue 是在哪里定义的?我认为应该是myNum。使用Option Explicit 会提醒您此类错误,因为它会强制您定义变量。
  • @Profex 它说运行时错误 13 类型不匹配
  • 使用F8 逐步完成。它会陷入循环吗?它绕过任何东西吗?此外,从技术上讲,您似乎在混合"。确保确保所有引号都是" 而不是其他引号(例如您在dynamicRange 周围的引号)。我打赌这就是你在With Range("A1") 上出错的原因...因为使用的双引号字符不是 VBA 的正确字符。

标签: excel vba


【解决方案1】:

正如@Chronocidal 所说:

=SUMIF(Sheet1!$A$1:$HA$609,">50",Sheet1!$A$1:$HA$609)

或者很长的路要走:

使用FIND 查找工作表上的所有值并将小于所需数量的数字相加。

函数如下,尽管您可能希望将With wrkSht.Cells 更改为仅查看填充的单元格范围:

Public Function CountLarge(StartNumber As Double, Target As Range) As Double

    Dim wrkSht As Worksheet
    Dim myNum As Double
    Dim sFirstAddress As String
    Dim rFound As Range
    Dim dSum As Double

    Set wrkSht = Target.Parent

    With wrkSht.Cells
        Set rFound = .Find("*", , xlValues, xlWhole, , xlNext)
        If Not rFound Is Nothing Then
            sFirstAddress = rFound.Address
            Do
                If IsNumeric(rFound) Then
                    If rFound >= StartNumber Then
                        dSum = dSum + rFound
                    End If
                End If

                'Set rFound = .FindNext(rFound) 'Doesn't work if in a UDF.
                Set rFound = .Find("*", rFound, xlValues, xlWhole, , xlNext) 'Works in a UDF.

            Loop While rFound.Address <> sFirstAddress
        End If
    End With

    CountLarge = dSum

End Function  

然后您可以直接在单元格中调用它,例如:

=CountLarge(50,Sheet1!$A$1)  

或者你可以在另一个 sub 中调用它:

Public Sub Test()

    Dim myNum As Double

    myNum = Application.InputBox("Enter a number:", Type:=1)

    MsgBox "Final sum: " & CountLarge(myNum, Sheet1.Range("A1"))

End Sub  

您可以将工作表引用更改为仅一个文本字符串:

MsgBox "Final sum: " & CountLarge(myNum, "Sheet1")   

为此,您必须将函数参数更改为:

Public Function CountLarge(StartNumber As Double, SheetName as String) As Double  

并将工作表设置为:

Set wrkSht = ThisWorkbook.Worksheets(SheetName)

【讨论】:

  • 我试过这段代码,但它给了我 0 作为我输入的任何数字的最终总和。
  • 你找到问题还是去SUMIF
  • 我最终选择了 SUMIF 简化了流程
【解决方案2】:

您将“mynum”设置为 msgbox 的值,但随后测试“myvalue”并退出 sub。

将 myvalue 更改为 mynum,您应该已经准备就绪

【讨论】:

  • 我把它改成了(这就是你的意思): Do myNum = Application.InputBox("Enter a number") If myNum = "" Then Exit Sub Loop until myNum > 0 And myNum
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多