我正在尝试创建一个子,其中宏计算包含数据的所有行(它不是设定的数量,它会变化),然后选择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
答案 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工作表函数实际上不会计算标题。我希望,这有帮助。