将非空白单元格的数量添加到前一个值VBA的计数中

时间:2016-02-11 17:52:59

标签: excel vba excel-vba

我是excel vba的新手,我想帮助解决我面临的问题。

enter image description here

我在上面的链接中提到了一个小例子。 我想要的是计算定义范围内每列中的字符数。 但是,如果有空白单元格,则空白单元格将计入前一个非空白值。 在示例1中:单元格3,4是空的,并且它们之前的非空白值是R.因此R的计数变为4。 单元格6也是空的,因此被添加到Y的计数中,Y是前面的非空白值。所以Y的数量是2。

在示例2中:单元格1,2是空的,但它们没有任何先前的非空白值,因此它们不计算在内。 此外,单元格4,5,6是空的。但是它们具有前面的非空白值Y. 所以Y的数量是4

有人可以帮我在VBA中编写代码吗?

2 个答案:

答案 0 :(得分:1)

假设您在列A上有行索引,在列B中有数据,而工作表中的数据从第3行开始(如图片所示),我建议使用以下代码:

    Sub test()
        Dim rowNum As Integer
        Dim prevRowData As String
        Dim rCount, yCount

        rowNum = 3
        prevRowData = ""
        rCount = 0
        yCount = 0
        Do While Trim(Range("A" & rowNum).Value) <> ""
                Select Case (Trim(Range("B" & rowNum).Value))
                 Case "R"
                    rCount = rCount + 1
                    prevRowData = "R"
                 Case "Y"
                    yCount = yCount + 1
                    prevRowData = "Y"
                 Case ""
                    If prevRowData = "R" Then
                      rCount = rCount + 1
                    ElseIf prevRowData = "Y" Then
                      yCount = yCount + 1
                    End If
                End Select
                rowNum = rowNum + 1
        Loop

        Range("A" & (rowNum + 1)).Value = "Count of R:" & rCount
        Range("A" & (rowNum + 2)).Value = "Count of y:" & yCount
    End Sub

答案 1 :(得分:0)

这样的事情会做到这一点。需要注意的是,这只会转到最后使用的行,因此第6行不会被计算,因为第5行之外没有数据。如果您知道该行,可以将lastRow替换为行号。 #39;我不知道你怎么知道应该计算的最后一个空白行。

在VBA IDE中,转到工具菜单并选择参考。选择&#34; Microstoft ActiveX数据对象2.8库。

我们将使用ADODB Recordset存储我们找到的数据。

这假设您的列表在Sheet1上,数据在A列中。它会在读取的数据下面写出摘要。

Private Sub CommandButton1_Click()
    Dim rs As New ADODB.Recordset
    Dim ws As Excel.Worksheet
    Set ws = ActiveWorkbook.Sheets("Sheet1")
    Dim lastRow As Long
    Dim lRow As Long
    Dim szLastData As String

    'Add fields to your recordset for storing data.
    With rs
        .Fields.Append "Value", adChar, 25
        .Fields.Append "Count", adInteger
        .Open
    End With

    'This is getting the last used row in column A
    lastRow = ws.Cells(ws.Rows.count, "A").End(xlUp).Row

    'Loop through the rows
    lRow = 1
    Do While lRow <= lastRow

        'Update the value we will search for in out rs if there is data in the current row
        If ws.Range("A" & lRow).Value <> "" Then
            szLastData = ws.Range("A" & lRow).Value
        End If

        'Check if this is already data that we are counting
        rs.Filter = ""
        rs.Filter = "Value='" & szLastData & "'"

        If rs.RecordCount = 0 Then
            'If this is new data, add a new row for it
            rs.AddNew
            rs.Fields("Value").Value = ws.Range("A" & lRow).Value
            rs.Fields("Count").Value = 1
            rs.Update
        Else
            'If we get here, we already have this data.
            'Increment the count by 1
            rs.Fields("Count").Value = rs.Fields("Count").Value + 1
            rs.Update
        End If

    lRow = lRow + 1
    Loop

    'Remove the filer and move to the first record in the rs
    rs.Filter = ""
    rs.MoveFirst

    'Move down a row
    lRow = lRow + 1

    'Loop through the data we found and write a summary
    Do While rs.EOF = False
        ws.Range("A" & lRow).Value = rs.Fields("Value").Value
        ws.Range("B" & lRow).Value = rs.Fields("Count").Value
        lRow = lRow + 1
    rs.MoveNext
    Loop

End sub