Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Случайное значение из отфильтрованной таблицы - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Случайное значение из отфильтрованной таблицы
Zonda Дата: Воскресенье, 17.11.2013, 14:15 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 14
Репутация: 0 ±
Замечаний: 0% ±

Есть табличка (например, для теста сделал футболистов). Я случайным образом выбираю любого футболиста из таблицы. Но, как сделать, чтобы выбор был осуществлен не из целой, а из этой же, но отфильтрованной по каким-нибудь критериям таблицы?
Файл примера прикрепил.

Код выбора из целой таблицы такой:
[vba]
Код

Public Sub Rnd_AfterFilter()

Dim rnd_row, lLastRow, Player

lLastRow = Cells(Rows.Count, 1).End(xlUp).Row 'last row
rnd_row = Round(Rnd * (2 - lLastRow) + lLastRow) 'random row

Player = Cells(rnd_row, 4).Value
MsgBox Player
End Sub
[/vba]
К сообщению приложен файл: test2.xlsm (17.6 Kb)


Сообщение отредактировал Zonda - Воскресенье, 17.11.2013, 14:22
 
Ответить
СообщениеЕсть табличка (например, для теста сделал футболистов). Я случайным образом выбираю любого футболиста из таблицы. Но, как сделать, чтобы выбор был осуществлен не из целой, а из этой же, но отфильтрованной по каким-нибудь критериям таблицы?
Файл примера прикрепил.

Код выбора из целой таблицы такой:
[vba]
Код

Public Sub Rnd_AfterFilter()

Dim rnd_row, lLastRow, Player

lLastRow = Cells(Rows.Count, 1).End(xlUp).Row 'last row
rnd_row = Round(Rnd * (2 - lLastRow) + lLastRow) 'random row

Player = Cells(rnd_row, 4).Value
MsgBox Player
End Sub
[/vba]

Автор - Zonda
Дата добавления - 17.11.2013 в 14:15
_Boroda_ Дата: Воскресенье, 17.11.2013, 15:40 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 16744
Репутация: 6534 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
Держите формулой.
Код
=ИНДЕКС(D2:D11;НАИБОЛЬШИЙ(ПРОМЕЖУТОЧНЫЕ.ИТОГИ(3;СМЕЩ(B1;СТРОКА(B2:B11)-1;))*СТРОКА(B2:B11)-1;СЛУЧМЕЖДУ(1;ПРОМЕЖУТОЧНЫЕ.ИТОГИ(3;B2:B11))))

формула массива, вводится одновременным нажатием Контрл Шифт Ентер
Вы, вроде, с макросами дружите. Если нужно именно с помощью VBA, самостоятельно из формулы макрос сделаете?
К сообщению приложен файл: test2_1.xlsm (17.4 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеДержите формулой.
Код
=ИНДЕКС(D2:D11;НАИБОЛЬШИЙ(ПРОМЕЖУТОЧНЫЕ.ИТОГИ(3;СМЕЩ(B1;СТРОКА(B2:B11)-1;))*СТРОКА(B2:B11)-1;СЛУЧМЕЖДУ(1;ПРОМЕЖУТОЧНЫЕ.ИТОГИ(3;B2:B11))))

формула массива, вводится одновременным нажатием Контрл Шифт Ентер
Вы, вроде, с макросами дружите. Если нужно именно с помощью VBA, самостоятельно из формулы макрос сделаете?

Автор - _Boroda_
Дата добавления - 17.11.2013 в 15:40
AndreTM Дата: Воскресенье, 17.11.2013, 16:49 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
Из этой формулы макрос сделать не так-то просто :) (ибо ПРОМЕЖУТОЧНЫЕ.ИТОГИ - сама по себе нехилая функция).
Но всё возможно:
[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]


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеИз этой формулы макрос сделать не так-то просто :) (ибо ПРОМЕЖУТОЧНЫЕ.ИТОГИ - сама по себе нехилая функция).
Но всё возможно:
[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]

Автор - AndreTM
Дата добавления - 17.11.2013 в 16:49
Zonda Дата: Воскресенье, 17.11.2013, 17:41 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 14
Репутация: 0 ±
Замечаний: 0% ±

_Boroda_, AndreTM, спасибо за помощь!
_Boroda_, интересный варинт, но у меня не получилась правильная выборка, если выбирать несколько фильтров! PS. С макросами не особо дружу, чуть-чуть. Возьму вариант AndreTM, т.к. он вполне меня устравает!
 
Ответить
Сообщение_Boroda_, AndreTM, спасибо за помощь!
_Boroda_, интересный варинт, но у меня не получилась правильная выборка, если выбирать несколько фильтров! PS. С макросами не особо дружу, чуть-чуть. Возьму вариант AndreTM, т.к. он вполне меня устравает!

Автор - Zonda
Дата добавления - 17.11.2013 в 17:41
Zonda Дата: Воскресенье, 17.11.2013, 18:35 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 14
Репутация: 0 ±
Замечаний: 0% ±

А покажите. Не могёт такого быть.


Прошу прощения, насоздавал несколько файлов и запутался в них! Всё работает! :)


Сообщение отредактировал Zonda - Воскресенье, 17.11.2013, 18:36
 
Ответить
Сообщение
А покажите. Не могёт такого быть.


Прошу прощения, насоздавал несколько файлов и запутался в них! Всё работает! :)

Автор - Zonda
Дата добавления - 17.11.2013 в 18:35
ikki Дата: Воскресенье, 17.11.2013, 19:12 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1906
Репутация: 504 ±
Замечаний: 0% ±

Excel 2003, 2010
кросс на другом форуме...

тяжко, наверное, получать решения с двух форумов одновременно?


помощь по Excel и VBA
ikki@fxmail.ru, icq 592842413, skype alex.ikki


Сообщение отредактировал ikki - Воскресенье, 17.11.2013, 19:27
 
Ответить
Сообщениекросс на другом форуме...

тяжко, наверное, получать решения с двух форумов одновременно?

Автор - ikki
Дата добавления - 17.11.2013 в 19:12
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!