Есть табличка (например, для теста сделал футболистов). Я случайным образом выбираю любого футболиста из таблицы. Но, как сделать, чтобы выбор был осуществлен не из целой, а из этой же, но отфильтрованной по каким-нибудь критериям таблицы? Файл примера прикрепил.
Player = Cells(rnd_row, 4).Value MsgBox Player End Sub
[/vba]
Есть табличка (например, для теста сделал футболистов). Я случайным образом выбираю любого футболиста из таблицы. Но, как сделать, чтобы выбор был осуществлен не из целой, а из этой же, но отфильтрованной по каким-нибудь критериям таблицы? Файл примера прикрепил.
формула массива, вводится одновременным нажатием Контрл Шифт Ентер Вы, вроде, с макросами дружите. Если нужно именно с помощью VBA, самостоятельно из формулы макрос сделаете?
формула массива, вводится одновременным нажатием Контрл Шифт Ентер Вы, вроде, с макросами дружите. Если нужно именно с помощью VBA, самостоятельно из формулы макрос сделаете?_Boroda_
Из этой формулы макрос сделать не так-то просто (ибо ПРОМЕЖУТОЧНЫЕ.ИТОГИ - сама по себе нехилая функция). Но всё возможно: [vba]
Код
Public Sub Rnd_AfterFilter2()
Dim rnd_row, nRows, Player, oFilt, a
Set oFilt = ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, _ ActiveSheet.AutoFilter.Range.Columns.Count).SpecialCells(xlCellTypeVisible)
nRows = 0 For Each a In oFilt.Areas nRows = nRows + a.Rows.Count Next rnd_row = Int(nRows * Rnd + 1)
nRows = 0 For Each a In oFilt.Areas If nRows + a.Rows.Count < rnd_row Then nRows = nRows + a.Rows.Count Else Player = a.Rows(rnd_row - nRows).Cells(1, 4) Exit For End If Next
MsgBox Player
End Sub
[/vba]
Из этой формулы макрос сделать не так-то просто (ибо ПРОМЕЖУТОЧНЫЕ.ИТОГИ - сама по себе нехилая функция). Но всё возможно: [vba]
Код
Public Sub Rnd_AfterFilter2()
Dim rnd_row, nRows, Player, oFilt, a
Set oFilt = ActiveSheet.AutoFilter.Range.Offset(1, 0).Resize(ActiveSheet.AutoFilter.Range.Rows.Count - 1, _ ActiveSheet.AutoFilter.Range.Columns.Count).SpecialCells(xlCellTypeVisible)
nRows = 0 For Each a In oFilt.Areas nRows = nRows + a.Rows.Count Next rnd_row = Int(nRows * Rnd + 1)
nRows = 0 For Each a In oFilt.Areas If nRows + a.Rows.Count < rnd_row Then nRows = nRows + a.Rows.Count Else Player = a.Rows(rnd_row - nRows).Cells(1, 4) Exit For End If Next
_Boroda_, AndreTM, спасибо за помощь! _Boroda_, интересный варинт, но у меня не получилась правильная выборка, если выбирать несколько фильтров! PS. С макросами не особо дружу, чуть-чуть. Возьму вариант AndreTM, т.к. он вполне меня устравает!
_Boroda_, AndreTM, спасибо за помощь! _Boroda_, интересный варинт, но у меня не получилась правильная выборка, если выбирать несколько фильтров! PS. С макросами не особо дружу, чуть-чуть. Возьму вариант AndreTM, т.к. он вполне меня устравает!Zonda