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

Вход

Регистрация

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

 

= Мир MS Excel/Случайная выборка диапазона значений из массива данных - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Случайная выборка диапазона значений из массива данных (Макросы/Sub)
Случайная выборка диапазона значений из массива данных
djon2012 Дата: Четверг, 01.01.2015, 02:27 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 106
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Здравствуйте! Помогите пожалуйста в решении проблемы. На Листе1 имеются данные 500 строк (в оригинале больше 300000), 10 столбцов $С : $L. Нужно вывести на Лист2 в случайном порядке (без дубликации строк) 300 значений строк в диапазоне C:L пример:
C125:L125
C301:L301
C15:L15
C307:L307
C5:L5
C499:L499 и так 300 значений. Спасибо!!!
К сообщению приложен файл: 6704523.xlsm (33.4 Kb)
 
Ответить
СообщениеЗдравствуйте! Помогите пожалуйста в решении проблемы. На Листе1 имеются данные 500 строк (в оригинале больше 300000), 10 столбцов $С : $L. Нужно вывести на Лист2 в случайном порядке (без дубликации строк) 300 значений строк в диапазоне C:L пример:
C125:L125
C301:L301
C15:L15
C307:L307
C5:L5
C499:L499 и так 300 значений. Спасибо!!!

Автор - djon2012
Дата добавления - 01.01.2015 в 02:27
Michael_S Дата: Четверг, 01.01.2015, 08:48 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
[vba]
Код
Sub djon2012()
Dim i&, R&, a(), Arr(1 To 300, 1 To 10), k&
R = Worksheets("Лист1").Cells(Rows.Count, 3).End(xlUp).Row
With New Collection
      For i = 1 To R
          .Add i
      Next
      For i = 1 To 300
          Randomize
          R = Int((.Count * Rnd) + 1)
          With Worksheets("Лист1")
              a = .Range("C" & R, "L" & R).Value
         End With
         For k = 1 To UBound(a, 2)
              Arr(i, k) = a(1, k)
         Next
         .Remove (R)
      Next
End With
Worksheets("Лист2").Range("A1").Resize(300, 10) = Arr
Worksheets("Лист2").Activate
End Sub
[/vba]
К сообщению приложен файл: 6704523-1-.xlsm (53.9 Kb)
 
Ответить
Сообщение[vba]
Код
Sub djon2012()
Dim i&, R&, a(), Arr(1 To 300, 1 To 10), k&
R = Worksheets("Лист1").Cells(Rows.Count, 3).End(xlUp).Row
With New Collection
      For i = 1 To R
          .Add i
      Next
      For i = 1 To 300
          Randomize
          R = Int((.Count * Rnd) + 1)
          With Worksheets("Лист1")
              a = .Range("C" & R, "L" & R).Value
         End With
         For k = 1 To UBound(a, 2)
              Arr(i, k) = a(1, k)
         Next
         .Remove (R)
      Next
End With
Worksheets("Лист2").Range("A1").Resize(300, 10) = Arr
Worksheets("Лист2").Activate
End Sub
[/vba]

Автор - Michael_S
Дата добавления - 01.01.2015 в 08:48
djon2012 Дата: Четверг, 01.01.2015, 13:20 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 106
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Большое, большущее Вам спасибо!!! Вы мне очень помогли, это то что мне было нужно. Макрос работает идеально. Сам бы я с моими ну очень скромными знаниями по VBA, ни за что не смог бы написать макрос. С Новым Годом Вас!!! Здоровья Вам и счастья, остальное дело наживное. И еще раз ооооогромное Вам спасибо, выручили. hands hands hands hands hands hands hands hands hands
 
Ответить
СообщениеБольшое, большущее Вам спасибо!!! Вы мне очень помогли, это то что мне было нужно. Макрос работает идеально. Сам бы я с моими ну очень скромными знаниями по VBA, ни за что не смог бы написать макрос. С Новым Годом Вас!!! Здоровья Вам и счастья, остальное дело наживное. И еще раз ооооогромное Вам спасибо, выручили. hands hands hands hands hands hands hands hands hands

Автор - djon2012
Дата добавления - 01.01.2015 в 13:20
Leanna Дата: Четверг, 01.01.2015, 19:11 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 78 ±
Замечаний: 0% ±

excel 2010
У меня получаются дублирующиеся строки (т.е. 2 строка, например 2 раза)
удаление R (.Remove ®) только сужает диапазон для random

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

[vba]
Код
Sub djon2012()
Dim i&, R&, a(), Arr(1 To 300, 1 To 11), k&, isExists, j&
R = Worksheets("Лист1").Cells(Rows.Count, 3).End(xlUp).Row
With New Collection
     For i = 1 To R
         .Add i
     Next
         Randomize
     For i = 1 To 300
         R = Int((.Count * Rnd) + 1)
         With Worksheets("Лист1")
             a = .Range("C" & R, "L" & R).Value
        End With
         
        isExists = False
        For j = 1 To i
        If Arr(j, 11) = R Then isExists = True
        Next
        If Not isExists Then
         For k = 1 To UBound(a, 2)
              Arr(i, k) = a(1, k)
         Next
         Arr(i, 11) = R
        Else
         i = i - 1
        End If
      Next
End With
Worksheets("Лист2").Range("A1").Resize(300, 10) = Arr
Worksheets("Лист2").Activate
End Sub
[/vba]
К сообщению приложен файл: randomize2.xlsm (45.5 Kb)


Лучше день потерять, потом за пять минут долететь!
 
Ответить
СообщениеУ меня получаются дублирующиеся строки (т.е. 2 строка, например 2 раза)
удаление R (.Remove ®) только сужает диапазон для random

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

[vba]
Код
Sub djon2012()
Dim i&, R&, a(), Arr(1 To 300, 1 To 11), k&, isExists, j&
R = Worksheets("Лист1").Cells(Rows.Count, 3).End(xlUp).Row
With New Collection
     For i = 1 To R
         .Add i
     Next
         Randomize
     For i = 1 To 300
         R = Int((.Count * Rnd) + 1)
         With Worksheets("Лист1")
             a = .Range("C" & R, "L" & R).Value
        End With
         
        isExists = False
        For j = 1 To i
        If Arr(j, 11) = R Then isExists = True
        Next
        If Not isExists Then
         For k = 1 To UBound(a, 2)
              Arr(i, k) = a(1, k)
         Next
         Arr(i, 11) = R
        Else
         i = i - 1
        End If
      Next
End With
Worksheets("Лист2").Range("A1").Resize(300, 10) = Arr
Worksheets("Лист2").Activate
End Sub
[/vba]

Автор - Leanna
Дата добавления - 01.01.2015 в 19:11
RAN Дата: Четверг, 01.01.2015, 21:04 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
:)
[vba]
Код
Sub qq()
      lr = Worksheets(1).Cells(Rows.Count, 3).End(xlUp).Row
      With CreateObject("Scripting.Dictionary")
          Do While .Count <= 300
              k = Int((lr * Rnd + 1))
              .Item(k) = Worksheets(1).Range("C" & k, "L" & k).Value         
          Loop
          Worksheets("Лист2").Range("A1").Resize(300, 10) = _
          Application.Transpose(Application.Transpose(.items))
          Worksheets("Лист2").Activate
      End With
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Четверг, 01.01.2015, 21:05
 
Ответить
Сообщение:)
[vba]
Код
Sub qq()
      lr = Worksheets(1).Cells(Rows.Count, 3).End(xlUp).Row
      With CreateObject("Scripting.Dictionary")
          Do While .Count <= 300
              k = Int((lr * Rnd + 1))
              .Item(k) = Worksheets(1).Range("C" & k, "L" & k).Value         
          Loop
          Worksheets("Лист2").Range("A1").Resize(300, 10) = _
          Application.Transpose(Application.Transpose(.items))
          Worksheets("Лист2").Activate
      End With
End Sub
[/vba]

Автор - RAN
Дата добавления - 01.01.2015 в 21:04
Michael_S Дата: Четверг, 01.01.2015, 22:15 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
У меня получаются дублирующиеся строки (т.е. 2 строка, например 2 раза)

Да, когда писал макрос - отвлекли, и забыл про одну строчку.
[vba]
Код
Sub djon2012()
Dim i&, R&, a(), Arr(1 To 300, 1 To 11), k&, n&
R = Worksheets("Лист1").Cells(Rows.Count, 3).End(xlUp).Row
With New Collection
      For i = 1 To R
          .Add i
      Next
      For i = 1 To 300
          Randomize
          R = Int((.Count * Rnd) + 1)
          n = .Item(R) ' вот эту строчку пропустил
          With Worksheets("Лист1")
              a = .Range("C" & n, "L" & n).Value
         End With
         For k = 1 To UBound(a, 2)
              Arr(i, k) = a(1, k)
         Next
         Arr(i, 11) = n
         .Remove (R)
      Next
End With
Worksheets("Лист2").Range("A1").Resize(300, 11) = Arr
Worksheets("Лист2").Activate
End Sub
[/vba]
 
Ответить
Сообщение
У меня получаются дублирующиеся строки (т.е. 2 строка, например 2 раза)

Да, когда писал макрос - отвлекли, и забыл про одну строчку.
[vba]
Код
Sub djon2012()
Dim i&, R&, a(), Arr(1 To 300, 1 To 11), k&, n&
R = Worksheets("Лист1").Cells(Rows.Count, 3).End(xlUp).Row
With New Collection
      For i = 1 To R
          .Add i
      Next
      For i = 1 To 300
          Randomize
          R = Int((.Count * Rnd) + 1)
          n = .Item(R) ' вот эту строчку пропустил
          With Worksheets("Лист1")
              a = .Range("C" & n, "L" & n).Value
         End With
         For k = 1 To UBound(a, 2)
              Arr(i, k) = a(1, k)
         Next
         Arr(i, 11) = n
         .Remove (R)
      Next
End With
Worksheets("Лист2").Range("A1").Resize(300, 11) = Arr
Worksheets("Лист2").Activate
End Sub
[/vba]

Автор - Michael_S
Дата добавления - 01.01.2015 в 22:15
Leanna Дата: Пятница, 02.01.2015, 02:12 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 78 ±
Замечаний: 0% ±

excel 2010
Michael, мне понравился ваш поход и как раз без лишних циклов, как лотырейные шарики вынимают из барабана, так и у вас потихоньку изымаются из рассмотрения и получается что каждый раз уникальный номер.

RAN приз за самый короткий код)) Не знала что в значения Dictionary можно записывать массивы значений. Я смотрю, что эти массивы просто так не выводятся почему то надо делать транспонирование транспонирования значений словаря. (Пробовала без транспонирований, ничего почему то не выводится, а с двумя транспортированиями выводится, почему так, для меня загадка)


Лучше день потерять, потом за пять минут долететь!
 
Ответить
СообщениеMichael, мне понравился ваш поход и как раз без лишних циклов, как лотырейные шарики вынимают из барабана, так и у вас потихоньку изымаются из рассмотрения и получается что каждый раз уникальный номер.

RAN приз за самый короткий код)) Не знала что в значения Dictionary можно записывать массивы значений. Я смотрю, что эти массивы просто так не выводятся почему то надо делать транспонирование транспонирования значений словаря. (Пробовала без транспонирований, ничего почему то не выводится, а с двумя транспортированиями выводится, почему так, для меня загадка)

Автор - Leanna
Дата добавления - 02.01.2015 в 02:12
RAN Дата: Суббота, 03.01.2015, 00:17 | Сообщение № 8
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Leanna,
К сообщению приложен файл: 7401117.jpg (40.8 Kb)


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеLeanna,

Автор - RAN
Дата добавления - 03.01.2015 в 00:17
Leanna Дата: Суббота, 03.01.2015, 00:59 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 78 ±
Замечаний: 0% ±

excel 2010
RAN спасибо! Теперь вижу!
Правда это все равно чудо, как из одной колонки появляется 10 ))


Лучше день потерять, потом за пять минут долететь!
 
Ответить
СообщениеRAN спасибо! Теперь вижу!
Правда это все равно чудо, как из одной колонки появляется 10 ))

Автор - Leanna
Дата добавления - 03.01.2015 в 00:59
RAN Дата: Суббота, 03.01.2015, 01:12 | Сообщение № 10
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
A развернуть и посмотреть Arr слабо?
Там одномерный массив массивов (кстати, оказывается ОО работает только с таким)
Application.Transpose превращает его в двухмерный.
Следующий Application.Transpose разворачивает полученный двухмерный массив.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеA развернуть и посмотреть Arr слабо?
Там одномерный массив массивов (кстати, оказывается ОО работает только с таким)
Application.Transpose превращает его в двухмерный.
Следующий Application.Transpose разворачивает полученный двухмерный массив.

Автор - RAN
Дата добавления - 03.01.2015 в 01:12
Leanna Дата: Суббота, 03.01.2015, 01:24 | Сообщение № 11
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 189
Репутация: 78 ±
Замечаний: 0% ±

excel 2010
Конечно слабо ;)
Теперь всё ясно, спасибо RAN за ответы,
ps (благодаря вашему сообщению я сегодня узнала про существование такого полезного окна как Locals)


Лучше день потерять, потом за пять минут долететь!
 
Ответить
СообщениеКонечно слабо ;)
Теперь всё ясно, спасибо RAN за ответы,
ps (благодаря вашему сообщению я сегодня узнала про существование такого полезного окна как Locals)

Автор - Leanna
Дата добавления - 03.01.2015 в 01:24
djon2012 Дата: Понедельник, 26.01.2015, 08:42 | Сообщение № 12
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 106
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
День добрый!
RAN спасибо за ваш вариант макроса. у меня к вам небольшой вопрос. Скажите пожалуйста в вашем варианте макроса идет проверка на дублирующиеся строки?
Спасибо!


Сообщение отредактировал djon2012 - Понедельник, 26.01.2015, 08:46
 
Ответить
СообщениеДень добрый!
RAN спасибо за ваш вариант макроса. у меня к вам небольшой вопрос. Скажите пожалуйста в вашем варианте макроса идет проверка на дублирующиеся строки?
Спасибо!

Автор - djon2012
Дата добавления - 26.01.2015 в 08:42
RAN Дата: Понедельник, 26.01.2015, 22:40 | Сообщение № 13
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Смотря что называть "дублирующиеся строки".
Если номер строки - да, если содержимое - нет.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеСмотря что называть "дублирующиеся строки".
Если номер строки - да, если содержимое - нет.

Автор - RAN
Дата добавления - 26.01.2015 в 22:40
djon2012 Дата: Вторник, 27.01.2015, 00:06 | Сообщение № 14
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 106
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Данные из которых случайным образом извлекаются строки с значениями являются постоянными, их содержимое не изменяется. Макрос работает в цикле, генерируя новый набор строк с значениями. Меня интересует в вашем макросе (на примере ниже) если отобрана строка 2 с числом 87 есть ли возможность повторного отбора этой строки или макрос анализирует уже отобранные строки что бы исключить дубликаты. Меня интересует вывод строк с значениями без повторной дубликации за один цикл запуска макроса.
Спасибо!!!
1) 5
2) 87
3) 96
 
Ответить
СообщениеДанные из которых случайным образом извлекаются строки с значениями являются постоянными, их содержимое не изменяется. Макрос работает в цикле, генерируя новый набор строк с значениями. Меня интересует в вашем макросе (на примере ниже) если отобрана строка 2 с числом 87 есть ли возможность повторного отбора этой строки или макрос анализирует уже отобранные строки что бы исключить дубликаты. Меня интересует вывод строк с значениями без повторной дубликации за один цикл запуска макроса.
Спасибо!!!
1) 5
2) 87
3) 96

Автор - djon2012
Дата добавления - 27.01.2015 в 00:06
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Случайная выборка диапазона значений из массива данных (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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