我对VBA很陌生,我一直在努力创建一个简单的报告很多天,所以我决定寻求一些帮助。我将非常感谢您提供的任何提示或可能指出我在代码中可能出现的任何错误。
我有下面的代码(从我的循环中提取)。我想要做的是创建一个基于大约20个excel文件的列表,这些文件将具有以下统计数据:
对于上次的统计数据,我甚至没有开始,所以你不会在我的代码中看到它,但如果你有任何关于这个的提示(我最好使用哪种方法),我将不胜感激。
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)
我的问题是否可能是由于源文件中包含单词"差异"有时是两个合并的列?不幸的是,我无法改变它,因为这些是来自另一个程序的一些自动生成的文件。
答案 0 :(得分:0)
xlWorkBook.Worksheets(i).Myrng
不是Range
有效MyRng
语法,而您只需使用已设置为非空Range
引用的worksheet
并且已经同时具有父{ {1}}和workbook
引用内的
但即使Myrng.Offset(9999, 2).Cells
也不会这样做,因为它只引用一个单元格而不是一系列单元格
您需要Range(Range1, Range2)
语法,其中Range1
和Range2
对您实际想要计算的范围的第一个和最后一个单元格的有效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