PDA

Показать полную графическую версию : макрос для генерации значений по условиям


Elizavetta
29-11-2015, 10:28
Помогите, пожалуйста на 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
Может вы лучше сначала конечную цель обозначите, а то процесс как-то не очень понятен...

Elizavetta
30-11-2015, 13:48
okshef, конечный итог это эксель со сгенирированными по тем условиям данными, т.е. я могла бы задавать процентную пропорцию в ответах
например так.

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

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

Так?

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

Elizavetta
01-12-2015, 13:15
1. Все условные мужчины (М) и женщины (Ж) - это столбец А. Общее количество - 200, 100 - М, 100 - Ж »

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

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

3. "Ответы", которые собираются по столбцам, могут иметь значения от "А" до "Д" (или от "А" до "Е" - в латинских символах) »
варианты ответов могут быть разными и принимать значения от А-Z от А-Я от 1 до ∞, или вообщем словом: елка, береза, сосна.........4. При подсчете одинаковых ответов в некоем столбце XN вы получаете пропорцию. Обозначим ее, например, так:
Рма - пропорция (%) ответов "А" у М
Ржд - % ответов "Д" у Ж »

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

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

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

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

Вот так:)

okshef
01-12-2015, 23:02
Прежде чем приступать к программированию, нужна математическая модель, которой, увы, пока нет и, похоже, не предвидится... Вы пытаетесь решить уравнение с бесконечным количеством неизвестных:
варианты ответов могут быть разными и принимать значения от А-Z от А-Я от 1 до ∞ »
нужно сразу для всех »
А еще вы пытаетесь поставить телегу впереди лошади: не обрабатывать ответы, а, исходя из пропорций, задаваемых непонятно каким образом, получить их из бесконечного количества возможных. Я лично не знаю как сгенерить бесконечность в заданных пропорциях.
Может кто-то еще попытается разобраться, мне не под силу. Признаю.

Iska
02-12-2015, 00:59
Может кто-то еще попытается разобраться, мне не под силу. Признаю. »
Вы, наверное, шутите. Я, вот, скажем, вообще не смог даже осмыслить ТЗ :(.

Elizavetta
02-12-2015, 10:39
Я не имела ввиду ,что 1 до бесконечности. Простой категорий может быть много. Давайте оставим от 1 до 100

a_axe
02-12-2015, 10:53
еще попытается разобраться »
Прошу прощения коллеги, лично у меня ТЗ уложилось в приблизительно следующем виде:

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

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

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

По идее нужно ходить ногами и опрашивать этих людей, а потом рассчитать процент для каждого из ответов на каждый из вопросов для каждой категории людей.
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
a_axe, это не педагогика и не медицина, это социология и это лично для меня.

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

Elizavetta
02-12-2015, 11:53
a_axe, вы верно поняли.

a_axe
03-12-2015, 12:21
Elizavetta, могу предложить код с оговорками:
1.Могу ошибаться, генераторы случайных чисел подчиняются-таки определенным законам. Вероятно, с небольшими наборами данных это не будет прослеживаться, но в рамках конкретного алгоритма какое получается распределение - вопрос открытый.
2.Программа дает близкое соотношение по процентам, но не точное. Кроме того, для каждого вопроса после окончания работы скрипта возможно наличие одной незаполненной ячейки. Добивать алгоритм смысла не вижу (откровенно говоря - лень), раз вопрос по статистике - вероятно в любом случае будет нужно что-нибудь подправлять руками. Пустые ячейки легко отследить фильтром по таблице1 и устранить.
3. Таблица1 должна быть пустой - заполнение выполняется только в незаполненные ячейки.
Алгоритм работы следующий:
1. Вашу таблицу с ответами необходимо отформатировать как таблицу (сочетание клавиш ctrl+L). Называться она должна "Таблица1" (Название можно привести в соответствие с помощью диспетчера имен вкладки "Формулы").
http://s017.radikal.ru/i429/1512/c9/e9bf3f246108.jpg
2. Необходимо создать в произвольном месте того же листа еще одну таблицу с картой ответов. Называться она должна "Таблица2". Названия заголовков непринципиальны, но содержание должно четко соответствовать Таблице1 по названию категорий и вопросов, т.е. если в Таблице2 фигурирует "Категория 3", значит она должна быть и в Таблице1, или если названия вопросов Х1 написаны как английское "икс", то в другой таблице не должно быть русское "хэ". В таблице указываете для каждой категории название вопроса, один из вариантов ответа и процент ответа в десятых долях от единицы. Можно заполнить не все категории - отработают только заполненные категории.
http://s019.radikal.ru/i614/1512/a9/197beb5eb806.jpg
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




© OSzone.net 2001-2012