Добрый день, уважаемые форумчане, Хочу сделать тесты на основе таблицы Excel, есть два столбца один с английскими словами и второй с русскими, задача, чтобы в тесте к одному английскому слову подбирало 4 русских, и одно из русских было правильное. Подскажите, в каком направлении двигаться, будет ли это макрос, или просто формула? Файлик прикрепил.
Добрый день, уважаемые форумчане, Хочу сделать тесты на основе таблицы Excel, есть два столбца один с английскими словами и второй с русскими, задача, чтобы в тесте к одному английскому слову подбирало 4 русских, и одно из русских было правильное. Подскажите, в каком направлении двигаться, будет ли это макрос, или просто формула? Файлик прикрепил.Timberwolf
Поищите по интернету варианты, если нет нужного, действуйте по своим идеям. Определитесь, в каком виде Вы хотите увидеть это "Тест". Где хотите выбрать-написать слово, в каком виде должны всплыть варианты перевода (в форме или в ячейках на листе). Правильный вариант находить проще, чем предлагать три не правильных. Как представляете базу с вариантами ответов? Наверно должна быть база с правильными и не правильными ответами. Какое количество слов будет в базе .... И много других вопросов может возникнуть при решении этой задачи. Покажите что у Вас не получается, постараемся помочь.
Поищите по интернету варианты, если нет нужного, действуйте по своим идеям. Определитесь, в каком виде Вы хотите увидеть это "Тест". Где хотите выбрать-написать слово, в каком виде должны всплыть варианты перевода (в форме или в ячейках на листе). Правильный вариант находить проще, чем предлагать три не правильных. Как представляете базу с вариантами ответов? Наверно должна быть база с правильными и не правильными ответами. Какое количество слов будет в базе .... И много других вопросов может возникнуть при решении этой задачи. Покажите что у Вас не получается, постараемся помочь.gling
ЯД-41001506838083
Сообщение отредактировал gling - Пятница, 06.05.2016, 21:19
Только направление, потому как реализация по времени не умещается в помощь на форуме ) Отдельный лист (хорошо скрытый) с базой "вопрос-ответы". Правильный ответ или несколько правильных отметить.
При формировании теста можно предусмотреть выбор количества вопросов. Можно из базы случайным образом выбирать вопросы, случайным образом перемешивать ответы каждого вопроса. Так можно создавать неповторяемые тесты. Все это - с помощью VBA. Проверка - тоже писать нужно. Или вручную )
Только направление, потому как реализация по времени не умещается в помощь на форуме ) Отдельный лист (хорошо скрытый) с базой "вопрос-ответы". Правильный ответ или несколько правильных отметить.
При формировании теста можно предусмотреть выбор количества вопросов. Можно из базы случайным образом выбирать вопросы, случайным образом перемешивать ответы каждого вопроса. Так можно создавать неповторяемые тесты. Все это - с помощью VBA. Проверка - тоже писать нужно. Или вручную )vikttur
Что-то сочинилось на словарях в качестве первого приближения (перед телевизором, под концерт Алексея Чумакова по НТВ, кстати, весьма недурственный)...
Timberwolf, подумайте, что можно сделать дальше с этим достигнутым.
[vba]
Код
Sub quiz() Dim rng As Range 'диапазон "базы данных" Dim rCnt As Integer Dim n As Integer Dim m As Integer Dim dictN As Object 'Scripting.Dictionary Dim dictM As Object 'Scripting.Dictionary Dim dictM2 As Object 'Scripting.Dictionary Dim curr As Integer Dim arrNM() As Integer 'результирующий массив данных викторины Dim i As Integer Dim j As Integer Dim itemsN As Variant Dim itemsM As Variant Dim itemsM2 As Variant
n = 10 'кол-во вопросов викторины m = 4 'кол-во ответов в одном вопросе
Set rng = Worksheets("Entertainment").Range("A2:B" & Worksheets("Entertainment").Cells(Rows.Count, 1).End(xlUp).Row)
rCnt = rng.Rows.Count 'кол-во строк в "базе данных"
If n > rCnt Then n = rCnt If m > rCnt Then m = rCnt
'случайный выбор "вопросов" - номеров строк в БД Set dictN = CreateObject("Scripting.Dictionary") Do curr = WorksheetFunction.RandBetween(1, rCnt) On Error Resume Next dictN.Add curr, curr On Error GoTo 0 Loop Until dictN.Count = n
ReDim arrNM(1 To n, 1 To m + 2)
Set dictM = CreateObject("Scripting.Dictionary") Set dictM2 = CreateObject("Scripting.Dictionary") 'генерирование "ответов" на ранее выбранные "вопросы": один правильный, остальные неправильные itemsN = dictN.items For i = 1 To n arrNM(i, 1) = itemsN(i - 1) dictM.RemoveAll
'случайный выбор неправильных "ответов" Do curr = WorksheetFunction.RandBetween(1, rCnt) On Error Resume Next dictM.Add curr, curr On Error GoTo 0 Loop Until dictM.Count = m
'перемешивание "ответов" для текущего "вопроса" itemsM = dictM.items dictM2.RemoveAll Do j = WorksheetFunction.RandBetween(1, m) On Error Resume Next dictM2.Add j, itemsM(j - 1) On Error GoTo 0 Loop Until dictM2.Count = m
'определение номера правильного "ответа" и прописывание в массив itemsM2 = dictM2.items For j = 1 To m curr = itemsM2(j - 1) arrNM(i, j + 1) = curr If curr = itemsM(0) Then arrNM(i, m + 2) = j 'номер правильного "ответа" End If Next j
Next i Set dictM2 = Nothing Set dictM = Nothing Set dictN = Nothing
'как-то визуализируем рассчитанное With Worksheets("ДанныеВикторины").Range("A2:F1000") .ClearContents .Resize(n, m + 2) = arrNM End With
End Sub
[/vba]
Что-то сочинилось на словарях в качестве первого приближения (перед телевизором, под концерт Алексея Чумакова по НТВ, кстати, весьма недурственный)...
Timberwolf, подумайте, что можно сделать дальше с этим достигнутым.
[vba]
Код
Sub quiz() Dim rng As Range 'диапазон "базы данных" Dim rCnt As Integer Dim n As Integer Dim m As Integer Dim dictN As Object 'Scripting.Dictionary Dim dictM As Object 'Scripting.Dictionary Dim dictM2 As Object 'Scripting.Dictionary Dim curr As Integer Dim arrNM() As Integer 'результирующий массив данных викторины Dim i As Integer Dim j As Integer Dim itemsN As Variant Dim itemsM As Variant Dim itemsM2 As Variant
n = 10 'кол-во вопросов викторины m = 4 'кол-во ответов в одном вопросе
Set rng = Worksheets("Entertainment").Range("A2:B" & Worksheets("Entertainment").Cells(Rows.Count, 1).End(xlUp).Row)
rCnt = rng.Rows.Count 'кол-во строк в "базе данных"
If n > rCnt Then n = rCnt If m > rCnt Then m = rCnt
'случайный выбор "вопросов" - номеров строк в БД Set dictN = CreateObject("Scripting.Dictionary") Do curr = WorksheetFunction.RandBetween(1, rCnt) On Error Resume Next dictN.Add curr, curr On Error GoTo 0 Loop Until dictN.Count = n
ReDim arrNM(1 To n, 1 To m + 2)
Set dictM = CreateObject("Scripting.Dictionary") Set dictM2 = CreateObject("Scripting.Dictionary") 'генерирование "ответов" на ранее выбранные "вопросы": один правильный, остальные неправильные itemsN = dictN.items For i = 1 To n arrNM(i, 1) = itemsN(i - 1) dictM.RemoveAll
'случайный выбор неправильных "ответов" Do curr = WorksheetFunction.RandBetween(1, rCnt) On Error Resume Next dictM.Add curr, curr On Error GoTo 0 Loop Until dictM.Count = m
'перемешивание "ответов" для текущего "вопроса" itemsM = dictM.items dictM2.RemoveAll Do j = WorksheetFunction.RandBetween(1, m) On Error Resume Next dictM2.Add j, itemsM(j - 1) On Error GoTo 0 Loop Until dictM2.Count = m
'определение номера правильного "ответа" и прописывание в массив itemsM2 = dictM2.items For j = 1 To m curr = itemsM2(j - 1) arrNM(i, j + 1) = curr If curr = itemsM(0) Then arrNM(i, m + 2) = j 'номер правильного "ответа" End If Next j
Next i Set dictM2 = Nothing Set dictM = Nothing Set dictN = Nothing
'как-то визуализируем рассчитанное With Worksheets("ДанныеВикторины").Range("A2:F1000") .ClearContents .Resize(n, m + 2) = arrNM End With