使用VBA计算找到的列中的单元格数

时间:2017-02-26 08:51:27

标签: excel vba excel-vba

我对VBA很陌生,我一直在努力创建一个简单的报告很多天,所以我决定寻求一些帮助。我将非常感谢您提供的任何提示或可能指出我在代码中可能出现的任何错误。

我有下面的代码(从我的循环中提取)。我想要做的是创建一个基于大约20个excel文件的列表,这些文件将具有以下统计数据:

  1. 工作簿中当前选项卡的名称
  2. 列中包含单词&#34的非空白计数;差异" (总是在第7行但可以在不同的列中)
  3. 从同一列开始计算,但单元格不是空白且不是0。
  4. 对于上次的统计数据,我甚至没有开始,所以你不会在我的代码中看到它,但如果你有任何关于这个的提示(我最好使用哪种方法),我将不胜感激。

    Windows("PassRate.xlsm").Activate
    b = ActiveSheet.Cells(Rows.count, 2).End(xlUp).Row + 1
    Cells(b, 3) = xlWorkBook.Worksheets(i).Name
    xlWorkBook.Worksheets(i).Activate
    Set Myrng = Range("B7:M9999").Find(What:="Difference", LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:=False)
    If Not Myrng Is Nothing Then
    RowQnt = xlWorkBook.Worksheets(i).Myrng.Offset(9999, 2).Cells.SpecialCells(xlCellTypeConstants).count
    End If
    Windows("PassRate.xlsm").Activate
    Cells(b, 4) = RowQnt
    

    我的问题是宏运行并运行,但我得到的结果是选项卡名称列表,但所有计数都是0,我无法解决这个问题。对于第7行,我还尝试了下面的代码,产生相同的结果。

    RowQnt = xlWorkBook.Cells(Rows.count, Myrng).End(xlUp)
    

    我的问题是否可能是由于源文件中包含单词"差异"有时是两个合并的列?不幸的是,我无法改变它,因为这些是来自另一个程序的一些自动生成的文件。

1 个答案:

答案 0 :(得分:0)

xlWorkBook.Worksheets(i).Myrng不是Range有效MyRng语法,而您只需使用已设置为非空Range引用的worksheet并且已经同时具有父{ {1}}和workbook引用内的

但即使Myrng.Offset(9999, 2).Cells也不会这样做,因为它只引用一个单元格而不是一系列单元格

您需要Range(Range1, Range2)语法,其中Range1Range2对您实际想要计算的范围的第一个和最后一个单元格的有效Range引用不是空白

的细胞

此外,您可以使用WorksheetFunction.CountA()函数而不是SpecialCells(xlCellTypeConstants)范围,因为如果在应用的范围内找不到常量单元格,后者会出错to(所以你需要检查)而前者只是返回零,如果没有找到空单元格

对于上述所有内容,您可以编写以下GetRowQnt()函数:

Function GetRowQnt(sht As Worksheet) As Long
    Dim Myrng As Range

    With sht '<--| reference passed worksheet
        Set Myrng = .Rows(7).Find(What:="Difference", LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:=False) '<--| find "Difference" in its 7th row
        If Not Myrng Is Nothing Then GetRowQnt = WorksheetFunction.CountA(.Range(.Cells(8, Myrng.Column), .Cells(WorksheetFunction.Max(.Cells(.Rows.count, Myrng.Column).End(xlUp).row, 8), Myrng.Column))) '<--| count not blank cells in column where "Difference" was found from row 8 down to its last not empty cell
    End With
End Function

并在主代码中使用它,如下所示:

With Windows("PassRate.xlsm").ActiveSheet '<--| reference "PassRate.xlsm" workbook active sheet (or change 'ActiveSheet' with 'Worksheetes("yourSheetName")')
    For i = 1 To xlWorkbook.Worksheets.count '<--| loop through 'xlWorkbook' workbook worksheets
        b = .Cells(.Rows.count, 3).End(xlUp).row + 1 '<--| get "PassRate.xlsm" workbook active sheet current first empty cell in column "C"
        .Cells(b, 3) = xlWorkbook.Worksheets(i).Name
        .Cells(b, 4) = GetRowQnt(xlWorkbook.Worksheets(i))
    Next
End With

请注意

b = .Cells(.Rows.count, 3).End(xlUp).row + 1 

我参加了专栏&#34; C&#34;作为最后一个不是空行的领先者,因为你的帖子中没有代码在#34; B&#34;列中写过。

但如果您的真实代码有一些

 .Cells(b, 2) = somedata '<--| write something in column "B" current row

然后你可以回到b = .Cells(.Rows.count, 2).End(xlUp).row + 1