[英]Referencing only visible rows in a filtered table - Excel VBA
我正在做一个选择电影的项目。 它包含一个电影表,其中包含电影名称和其他数据的列,例如 IMDB 评级等。我编写了一个宏,它根据用户输入(例如,最低 IMDB 评级)过滤表,现在我会喜欢 select 从过滤表中随机出片。
我可以计算出可见电影的数量:
FilmCount = FilmsSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
并由此生成一个随机数:
Randomize
FilmNumber = Int(FilmCount * Rnd) + 1
但是,从过滤表中选择随机电影比较困难; 在未过滤的表中,我可以简单地将随机数用于 select 电影:
Film = FilmsSheet.Cells(FilmNumber + 1, 1)
但在过滤表中,由于缺少过滤行,行不会按数字上升,例如 1,3,4,7...
怎么用随机数到select过滤表中对应的片子? 谢谢。
也许是这样的?
假设 Film Title(标题列)为单元格 C1,并且数据已被过滤
Sub test()
Set rngFilmTitle = Range("C2", Range("C" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)
X = Application.Transpose(rngFilmTitle)
Do
rndNum = Int(Rnd() * UBound(X))
Loop
End Sub
例如,如果总电影片名(在过滤数据中)是 4 部电影片名,
如果您在循环中一次又一次地 F8,则 rndNum 结果将给出 0 到 3 之间的随机数(参见 VBA 编辑器中的 Locals Window)。
如果你已经确定了,那么你可以删除循环,
然后有
rndNum = Int(Rnd() * UBound(X))
FilmTitle = X(rndNum) '---> this will give a random film title.
那就是如果我没有弄错你的意思,因为你的标题问题似乎你想从隐藏的行(未过滤的行)中随机获取,但在你的问题正文中,你似乎想要随机获取从可见行(过滤行)?
使用@BigBen 的评论建议,我遍历了表中的所有行,如果它们可见,则将电影名称添加到数组中,从中可以选择随机电影:
'=====Select random film from visible=====
Dim FilmCount As Integer: FilmCount = FilmsSheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
Dim Films() As Variant
ReDim Films(1 To FilmCount)
x = 1
Dim r As Integer: r = 2
Do Until FilmsSheet.Cells(r, 1) = 0
If Not FilmsSheet.rows(r).EntireRow.Hidden Then
Films(x) = FilmsSheet.Cells(r, 1)
x = x + 1
End If
r = r + 1
Loop
Randomize
Dim FilmNumber As Integer: FilmNumber = Int(FilmCount * Rnd) + 1
MsgBox (Films(FilmNumber))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.