我是excel vba的新手,我想帮助解决我面临的问题。
我在上面的链接中提到了一个小例子。 我想要的是计算定义范围内每列中的字符数。 但是,如果有空白单元格,则空白单元格将计入前一个非空白值。 在示例1中:单元格3,4是空的,并且它们之前的非空白值是R.因此R的计数变为4。 单元格6也是空的,因此被添加到Y的计数中,Y是前面的非空白值。所以Y的数量是2。
在示例2中:单元格1,2是空的,但它们没有任何先前的非空白值,因此它们不计算在内。 此外,单元格4,5,6是空的。但是它们具有前面的非空白值Y. 所以Y的数量是4
有人可以帮我在VBA中编写代码吗?
答案 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