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

时间:2018-01-23 08:49:37

标签: excel vba excel-vba random

我正在尝试创建一个子,其中宏计算包含数据的所有行(它不是设定的数量,它会变化),然后选择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

2 个答案:

答案 0 :(得分:2)

您计算的当前值具有误导性。说它是20,行延伸到200;你不能使用值20来识别200中的占用行(除非你创建了一个地图/数组来存储所有被占用的行数,然后从中随机选择)。

如果此信息对您有用,您仍然可以确定CountA,但不能作为随机选择过程的一部分。最好使用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

要清除单元格颜色,我会设置.Interior.ColorIndex = xlColorIndexNone

答案 1 :(得分:0)

首先没有声明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")

然后你的Count工作表函数实际上不会计算标题。我希望,这有帮助。