Vba 如何设置.Count函数以排除标题?
我试图制作一个子集,其中宏对包含数据的所有行进行计数(这不是一个设定的数量,它会有所不同),然后在6(排除标题)和已计数行数之间选择一个随机数,并高亮显示相应的行。不幸的是,我一直在编写的代码并不能满足我的需要。它确实会选择并高亮显示一个随机行,但它也会选择空行,而不仅仅是包含数据的行。知道我哪里出错了吗Vba 如何设置.Count函数以排除标题?,vba,excel,random,Vba,Excel,Random,我试图制作一个子集,其中宏对包含数据的所有行进行计数(这不是一个设定的数量,它会有所不同),然后在6(排除标题)和已计数行数之间选择一个随机数,并高亮显示相应的行。不幸的是,我一直在编写的代码并不能满足我的需要。它确实会选择并高亮显示一个随机行,但它也会选择空行,而不仅仅是包含数据的行。知道我哪里出错了吗 Sub RandomRow() Dim mrg As Worksheet Dim Count As Integer, myRange As Range Set mrg = ActiveWork
Sub RandomRow()
Dim mrg As Worksheet
Dim Count As Integer, myRange As Range
Set mrg = ActiveWorkbook.Sheets("Merged")
mrg.Range("A6:K200000").Interior.Color = RGB(255, 255, 255) 'reset cell colours
Set myRange = mrg.Columns("A:A")
Count = Application.WorksheetFunction.CountA(myRange)
myValue = Int((Count * Rnd) + 6) ' Generate random value between 6 and the number of filled rows'.
mrg.Range("A" & myValue).EntireRow.Interior.Color = RGB(255, 255, 153) 'highlight a random row
End Sub
首先,未声明MyValue
Dim MyValue as Long
现在,它更好了。其次,宏高亮显示所有行,但仅从A到K列清除颜色。你宁愿突出显示前11列,不是吗
mrg.Range("A" & myValue).Resize(1, 11).Interior.Color = RGB(255, 255, 153)
要回答您的问题,请将myRange设置为:
Set myRange = mrg.Range("A6:A200000")
那么,计数工作表函数实际上不会计算标题。我希望这有帮助 计数的当前值具有误导性。假设它是20,行数扩展到200;您不能使用值20来标识200行中被占用的行(除非您创建了一个映射/数组来存储所有被占用的行号,然后从中随机选择) 如果此信息对您有用,您仍然可以确定
计数a
,但不能作为随机选择过程的一部分。最好使用End(xlUp)
查找最后一个被占用的单元格所在的位置
现在您知道了包含已占用单元格的区域,可以在这些行中随机选择。重复生成随机数,直到发现非空的单元格/行
Sub RandomRow()
Dim wsMerged As Worksheet
Dim myRange As Range
Dim count As Long
Dim randRow As Long
Dim occupied As Boolean
Set wsMerged = Worksheets("Merged")
wsMerged.Range("A6:K200000").Interior.Color = RGB(255, 255, 255) 'reset cell colours
Set myRange = wsMerged.Columns("A:A")
'count = Application.WorksheetFunction.CountA(myRange)
count = Range("A200000").End(xlUp).Row - 6
Randomize 'necessary when using Rnd()
Do
randRow = CLng((count * Rnd()) + 6)
'if the cell isn't empty
If wsMerged.Range("A" & randRow).Value <> "" Then
'flag that we are done
occupied = True
wsMerged.Range("A" & randRow).Resize(1, 11).Interior.Color = RGB(255, 255, 153)
End If
Loop While Not occupied
End Sub
子行()
合并为工作表
将myRange变暗为Range
不算长
我和你一样长
作为布尔值
设置wsMerged=工作表(“合并”)
wsMerged.Range(“A6:K200000”).Interior.Color=RGB(255、255、255)“重置单元格颜色
设置myRange=wsMerged.Columns(“A:A”)
'count=Application.WorksheetFunction.CountA(myRange)
计数=范围(“A200000”)。结束(xlUp)。第6行
使用Rnd()时需要“随机化”
做
randRow=CLng((计数*Rnd())+6)
'如果单元格不是空的
如果wsMerged.Range(“A”&randRow.Value”),则
“我们已经完成了
已占用=真
wsMerged.Range(“A”和randRow).Resize(1,11).Interior.Color=RGB(255,255,153)
如果结束
未占用时循环
端接头
要清除单元格颜色,我将设置
.Interior.ColorIndex=xlColorIndexNone
,这仍然会突出显示6到200000之间的空行。不是真的。如果范围是连续的,WorksheetFunction.CountIf将只返回最后一行的地址号减去6。是的,如果范围是连续的,则不会有任何空行。在我看来,@Rhyfelwr's可能包含空行。是的,这非常有效,代码似乎比我预期的要难一些。是的,非空白计数本身并没有直接帮助,因为它不会告诉您引用了哪些行,也不会告诉您它们扩展了多远。