Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Office (Word, Excel, Outlook и т.д.) (http://forum.oszone.net/forumdisplay.php?f=115)
-   -   макрос для генерации значений по условиям (http://forum.oszone.net/showthread.php?t=308553)

Elizavetta 29-11-2015 10:28 2579786

макрос для генерации значений по условиям
 
Помогите, пожалуйста на VBA написать один скрипт, который генерирует значения по определенным условиям:
Например
Пусть есть переменные и их значения a,b,c
пол X1,X2,X3
м a a a
ж b b b
ж c c c
Нужно сгенирировать значения, но так, чтобы соблюдались пропорции только в случайном порядке:
например 30% мужчин в переменной X1 поставили ответ а, 40% мужчин поставили ответ b и ещё 30% мужчин поставили ответ с
при этом
20% женщин в переменной X1 поставили ответ а, 65% женщин поставили ответ b и ещё 25% женщин поставили ответ с
Аналогично и с другими переменными, их может быть несколько.

Надо просто чтобы в самом годе было написано
пол=200 человек
переменная x1, пусть имеет пять градаций а,б,в,г,Д
градация а=5%мужчин, 25%женищин.
градация б=10% мужчин и 45% женщин
...

Помогите, плиз такое сделать.

okshef 29-11-2015 18:07 2579870

Может вы лучше сначала конечную цель обозначите, а то процесс как-то не очень понятен...

Elizavetta 30-11-2015 13:48 2580039

Вложений: 1
okshef, конечный итог это эксель со сгенирированными по тем условиям данными, т.е. я могла бы задавать процентную пропорцию в ответах
например так.

okshef 30-11-2015 23:01 2580210

Давайте так, я начну уточнять, а вы поправляете:
1. Все условные мужчины (М) и женщины (Ж) - это столбец А. Общее количество - 200, 100 - М, 100 - Ж
2. Столбцы В и дальше вправо - переменные Х1, Х2 ... ХN
3. "Ответы", которые собираются по столбцам, могут иметь значения от "А" до "Д" (или от "А" до "Е" - в латинских символах)
4. При подсчете одинаковых ответов в некоем столбце XN вы получаете пропорцию. Обозначим ее, например, так:
Рма - пропорция (%) ответов "А" у М
Ржд - % ответов "Д" у Ж

Задача: задавая значения Р (они будут находится в некоторых 10 ячейках) вы хотите, чтобы поле ячеек массив В2:XN201) заполнялось случайными значениями от "А" до "Д" (или от "А" до "Е")?

Так?

Сразу непонятки:
Для задания пропорций для одного столбца нужно 10 ячеек, для другого - еще десять, третьего - еще, и т.д. Вам сразу нужно или только для одного столбца? А для какого?

Elizavetta 01-12-2015 13:15 2580328

Цитата:

Цитата okshef
1. Все условные мужчины (М) и женщины (Ж) - это столбец А. Общее количество - 200, 100 - М, 100 - Ж »

верно, но
1. общее количество может быть любым, например 300, 210 мужчин и 90 женщин. Плюс мужчины и женщины это 2 градации, а может быть несколько градаций. Например слабый, умеренный, сильный. Я думаю вы поняли, что это качественный признак.

Цитата:

Цитата okshef
2. Столбцы В и дальше вправо - переменные Х1, Х2 ... ХN »

да

Цитата:

Цитата okshef
3. "Ответы", которые собираются по столбцам, могут иметь значения от "А" до "Д" (или от "А" до "Е" - в латинских символах) »

варианты ответов могут быть разными и принимать значения от А-Z от А-Я от 1 до ∞, или вообщем словом: елка, береза, сосна.........
Цитата:

Цитата okshef
4. При подсчете одинаковых ответов в некоем столбце XN вы получаете пропорцию. Обозначим ее, например, так:
Рма - пропорция (%) ответов "А" у М
Ржд - % ответов "Д" у Ж »

Цитата:

Цитата okshef
Задача: задавая значения Р (они будут находится в некоторых 10 ячейках) вы хотите, чтобы поле ячеек массив В2:XN201) заполнялось случайными значениями от "А" до "Д" (или от "А" до "Е")?
Так? »

верно, значения случайные ,но пропорции совпадают. т.е. пусть диапазон ответов А-Д:, 20% ответов А у М и например 40% ответов Д у Ж и так далее.

Цитата:

Цитата okshef
Для задания пропорций для одного столбца нужно 10 ячеек, для другого - еще десять, третьего - еще, и т.д. Вам сразу нужно или только для одного столбца? А для какого? »

нужно сразу для всех
т.е. как-то так. Знала бы VBA не просила бы помочь:))
задать пропорции
Пол&X1 , м=49% (где м это любая категория может быть, а не только мужчину, т.к. это зависит от смысла категориальной переменной) ответ а, 51% = б.
ж=10% ответ А, 90% ответ Б.. Если 4 варианта ответа, то 20% женщин поставили А, 40% поставили Б, 25%=с, и 15% = д, к примеру.
Пол&X2 аналогично
Пол&X3

Вот так:)

okshef 01-12-2015 23:02 2580483

Прежде чем приступать к программированию, нужна математическая модель, которой, увы, пока нет и, похоже, не предвидится... Вы пытаетесь решить уравнение с бесконечным количеством неизвестных:
Цитата:

Цитата Elizavetta
варианты ответов могут быть разными и принимать значения от А-Z от А-Я от 1 до ∞ »

Цитата:

Цитата Elizavetta
нужно сразу для всех »

А еще вы пытаетесь поставить телегу впереди лошади: не обрабатывать ответы, а, исходя из пропорций, задаваемых непонятно каким образом, получить их из бесконечного количества возможных. Я лично не знаю как сгенерить бесконечность в заданных пропорциях.
Может кто-то еще попытается разобраться, мне не под силу. Признаю.

Iska 02-12-2015 00:59 2580504

Цитата:

Цитата okshef
Может кто-то еще попытается разобраться, мне не под силу. Признаю. »

Вы, наверное, шутите. Я, вот, скажем, вообще не смог даже осмыслить ТЗ :(.

Elizavetta 02-12-2015 10:39 2580556

Я не имела ввиду ,что 1 до бесконечности. Простой категорий может быть много. Давайте оставим от 1 до 100

a_axe 02-12-2015 10:53 2580560

Цитата:

Цитата okshef
еще попытается разобраться »

Прошу прощения коллеги, лично у меня ТЗ уложилось в приблизительно следующем виде:

1.Есть категории опрашиваемых людей, количество которых может быть любое, так как они между собой никак не связаны и обладают абсолютной автономностью. Например - "мужчины" и "женщины" (две категории), или там "категория1", "категория2", "категория3" (три категории по неизвестным параметрам). Может быть 10 категорий (мужчины 15-25лет, мужчины 25-35 лет, женатые/неженатые, с бородой/без бороды, по аналогии для женщин)

2. Есть некие вопросы, которые этим людям задают, они обозначаются х1, х2... хn.

3. Каждая категория может дать для каждого вопроса "х1"... "хп" ответ из заранее оговоренных вариантов - варианты "а-г" или "сосна-береза" или просто "понравилось / не понравилось".

По идее нужно ходить ногами и опрашивать этих людей, а потом рассчитать процент для каждого из ответов на каждый из вопросов для каждой категории людей.
Цитата:

Цитата Elizavetta
20% женщин в переменной X1 поставили ответ а, 65% женщин поставили ответ b и ещё 25% женщин поставили ответ с »

Т.е. рассматривается только одна категория - "женщины", вопрос Х1, вариантов ответов три (а,в,с), распределились варианты в процентах 20%-65%-25%. При этом сколько всего вопросов, какое количество мужчин не имеет абсолютно никакого значения, ибо связи между этими категориями нет. Вариантов также может быть любое количество (например а-очень не понравилось, б-не понравилось, в-нейтрально, г - не очень понравилось и т.д.), но в сумме для каждого ответа для одной из категорий это 100% (в примере 100% для мужчин и почти 100% для женщин).

4. Задача сводится к тому, чтобы не тратить время и никого не опрашивать, принять нужное соотношение ответов для каждой категории, а затем программно подтасовать результаты, с помощью скрипта равномерно расставив нужные ответы в ячейках каждого столбца в случайном порядке (чтобы никто подтасовки не заметил) в таком количестве, чтобы заданные проценты соблюдались.

Цитата:

Нужно сгенирировать значения, но так, чтобы соблюдались пропорции только в случайном порядке
Например, если приняли, что среди детей мужского пола (фигурировать они могут как например категория 1) на вопрос Х2 ответили "да" в 40% случаев,при числе детей муж.пола 50 человек - нужно программно расставить в графе вопрос Х2 ответ "да" напротив 20 случайно выбранных строк "мальчик". Процентов типа 41.1% чисто технически получиться не может. Какое количество девочек - не имеет значения, они обсчитываются отдельно. При этом проценты должны быть назначены заранее в этой же таблице (на что указал okshef).
ИМХО как-то так.

Судя по всему - речь о курсовике, дипломе, либо НИР. Судя по предыдущему посту - из сферы медицины или педогогики/психологии детей. Надеюсь, не свидимся в реальной жизни.

Elizavetta 02-12-2015 11:18 2580569

a_axe, это не педагогика и не медицина, это социология и это лично для меня.

a_axe 02-12-2015 11:22 2580570

Цитата:

Цитата Elizavetta
a_axe, это не педагогика и не медицина, это социология и это лично для меня. »

Elizavetta, это не столь важно, важнее следующее: вы бы не могли подтвердить или поправить мои предположения, указанные в предыдущем посте? Без этого вряд ли получится нащупать результат. Если в описании есть ошибки и неточности - укажите их.

Elizavetta 02-12-2015 11:53 2580574

a_axe, вы верно поняли.

a_axe 03-12-2015 12:21 2581008

Elizavetta, могу предложить код с оговорками:
1.Могу ошибаться, генераторы случайных чисел подчиняются-таки определенным законам. Вероятно, с небольшими наборами данных это не будет прослеживаться, но в рамках конкретного алгоритма какое получается распределение - вопрос открытый.
2.Программа дает близкое соотношение по процентам, но не точное. Кроме того, для каждого вопроса после окончания работы скрипта возможно наличие одной незаполненной ячейки. Добивать алгоритм смысла не вижу (откровенно говоря - лень), раз вопрос по статистике - вероятно в любом случае будет нужно что-нибудь подправлять руками. Пустые ячейки легко отследить фильтром по таблице1 и устранить.
3. Таблица1 должна быть пустой - заполнение выполняется только в незаполненные ячейки.
Алгоритм работы следующий:
1. Вашу таблицу с ответами необходимо отформатировать как таблицу (сочетание клавиш ctrl+L). Называться она должна "Таблица1" (Название можно привести в соответствие с помощью диспетчера имен вкладки "Формулы").
Скрин Таблицы1 и диспетчера имен

2. Необходимо создать в произвольном месте того же листа еще одну таблицу с картой ответов. Называться она должна "Таблица2". Названия заголовков непринципиальны, но содержание должно четко соответствовать Таблице1 по названию категорий и вопросов, т.е. если в Таблице2 фигурирует "Категория 3", значит она должна быть и в Таблице1, или если названия вопросов Х1 написаны как английское "икс", то в другой таблице не должно быть русское "хэ". В таблице указываете для каждой категории название вопроса, один из вариантов ответа и процент ответа в десятых долях от единицы. Можно заполнить не все категории - отработают только заполненные категории.
Скрин Таблицы 2 (карты ответов)

Собственно код
Код:

Public Sub Sociology()
Dim i As Long, j As Long, n As Long, Nkat As Long, m As Long
Dim Kat As String, Kat_old As String
Dim quest As String
Dim answ As String
Dim Perc As Double
Dim cell As Range

Randomize
On Error Resume Next
For i = 1 To Range("Таблица2").Rows.Count
 
  Kat = Range("Таблица2").Cells(i, 1).Value
  quest = Range("Таблица2").Cells(i, 2).Value
  answ = Range("Таблица2").Cells(i, 3).Value
  Perc = Range("Таблица2").Cells(i, 4).Value
  ActiveSheet.ListObjects("Таблица1").Range.AutoFilter Field:=1, Criteria1:=Kat
        Range("Таблица1[" & quest & "]").SpecialCells(xlCellTypeBlanks).Select
       
        Selection.SpecialCells(xlCellTypeVisible).Select
        'Debug.Print "выделено " & Selection.Count
        If Kat <> Kat_old Then
            Nkat = Selection.Count
            Kat_old = Kat
        End If
        m = 0
        Do
           
            n = Selection.Count
            n = Round(n * Rnd())
            If n = 0 Then n = 1
            j = 0
            For Each cell In Selection
            j = j + 1
            If j = n Then
                cell.Value = answ
                m = m + 1
                Exit For
            End If
            Next cell
            Range("Таблица1[" & quest & "]").SpecialCells(xlCellTypeBlanks).Select
            Selection.SpecialCells(xlCellTypeVisible).Select
        Loop Until m >= Nkat * Perc Or Err.Number <> 0
        'Debug.Print "err=" & Err.Number & ", m=" & m & ",Nkat*perc=" & Nkat * Perc & ",j=" & j
        Err.Clear
        ActiveSheet.ListObjects("Таблица1").Range.AutoFilter Field:=1
Next i
Range("Таблица2").Select
End Sub



Время: 02:34.

Время: 02:34.
© OSzone.net 2001-