Vba 如何设置.Count函数以排除标题?

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

我试图制作一个子集,其中宏对包含数据的所有行进行计数(这不是一个设定的数量,它会有所不同),然后在6(排除标题)和已计数行数之间选择一个随机数,并高亮显示相应的行。不幸的是,我一直在编写的代码并不能满足我的需要。它确实会选择并高亮显示一个随机行,但它也会选择空行,而不仅仅是包含数据的行。知道我哪里出错了吗

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可能包含空行。是的,这非常有效,代码似乎比我预期的要难一些。是的,非空白计数本身并没有直接帮助,因为它不会告诉您引用了哪些行,也不会告诉您它们扩展了多远。