Excel中的计数器循环

时间:2017-10-07 01:43:56

标签: excel vba excel-vba

所以我有一个包含多个工作表的Excel工作簿。每个工作表都是相同的模板。并且细胞B3-B39,C3-C39和D3-D39将包含3个值中的1个。 1,.5,或根本没有值(完全空白)。现在每个工作表都不完全相同(有些将转到B / C / D45,而不仅仅是B / C / D39)。我正在尝试让另一个单元格显示这些单元格中有多少包含1,另一个单元格显示有多少单元格包含.5。是的,我可以手动完成,但我想尽可能自动化。

1 个答案:

答案 0 :(得分:0)

正如@Variatus建议的那样,你可以使用COUNTIF工作表函数,但是如果你想用VBA做这个,你需要做的是:

方法

  1. 确定最后一行
  2. 构建范围
  3. 计算此范围内有多少个单元格包含1
  4. 计算此范围内有多少个单元格包含.5
  5. 做一些有这些重要的事情
  6. 代码

    Sub CountTheSheets()
    
        Const Value10 As Double = 1, Value05 As Double = 0.5 ' these are what we're comparing cell values against
    
        Dim Count10 As Long, Count05 As Long ' these are our 1 and .5 counts respectively
        Dim lastRow As Long, lastRowTemp As Long, maxRow As Long
        Dim ws As Worksheet
        Dim cel As Range
    
        For Each ws In ThisWorkbook.Worksheets ' iterate over all worksheets
    
            lastRow = 0 ' reset the last row for this worksheet
            Count10 = 0 ' reset the 1 count for this worksheet
            Count05 = 0 ' reset the .5 count for this worksheet
    
            With ws
    
                maxRow = .Rows.Count ' this is the absolute bottom row in a worksheet
    
                ' get last row of column B, by going to the bottom of the worksheet in that column, then using End and going up to find the last cell
                lastRowTemp = .Cells(maxRow, "B").End(xlUp).Row
                If lastRowTemp > lastRow Then lastRow = lastRowTemp
    
                ' get last row of column C; if larger than the previous, store in lastRow that row number instead
                lastRowTemp = .Cells(maxRow, "C").End(xlUp).Row
                If lastRowTemp > lastRow Then lastRow = lastRowTemp
    
                ' get last row of column D; if larger than the previous, store in lastRow that row number instead
                lastRowTemp = .Cells(maxRow, "D").End(xlUp).Row
                If lastRowTemp > lastRow Then lastRow = lastRowTemp
    
                ' build the range using lastRow, and iterate through the cells in that range, counting the matching values
                For Each cel In .Range("B3:D" & lastRow)
    
                    If cel.Value = Value10 Then
                        Count10 = Count10 + 1
                    ElseIf cel.Value = Value05 Then
                        Count05 = Count05 + 1
                    End If
    
                Next cel
    
                ' do something with these counts
                Debug.Print .Name, Count10, Count05
    
            End With
        Next ws
    
    End Sub