使用VBA计算find的列中的单元格数量

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

我有下面的一段代码(从我的循环中提取)。 我想要做的是创build一个基于大约20个Excel文件,将有以下统计信息的列表:

  1. 工作簿中当前选项卡的名称
  2. 在名称中包含单词“差异”的列中的非空行数(总是在第7行,但可以在不同的列中)
  3. 从同一列计数,但单元格不是空白且不为0。

对于最后一个统计,我甚至没有开始,所以你不会看到它在我的代码,但我会很感激,如果你有任何提示也这一个(最好使用哪种方法)。

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 

我的问题是macros运行和工作,但我得到的结果是标签名称的列表,但所有计数都是0,我无法克服这个问题。 对于第7行,我也尝试了下面的代码片段,产生相同的结果。

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

是否有可能是因为在源文件中包含单词“差异”的列有时是两个合并列? 不幸的是,我不能改变,因为这些是从另一个程序自动生成的文件。

xlWorkBook.Worksheets(i).Myrng不是有效的Range语法,而您可以简单地使用已经设置为非空Range引用的MyRng ,并且已经在其中包含父worksheetworkbook引用

但即使Myrng.Offset(9999, 2).Cells将不会做,因为它只引用一个单元格而不是单元格的范围

您需要Range(Range1, Range2)语法,其中Range1Range2都是有效的Range引用的Range的第一个和最后一个单元格,你实际上要计数不是空白单元格

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

对于所有上面你可以写下面的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 

我把“C”列作为最后一个非空行,因为在你的文章中没有代码写在“B”列中。

但是,如果你的真实代码有一些

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

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