繁体   English   中英

仅引用过滤表中的可见行 - Excel VBA

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM