Задали сделать в Excel тест на макросах... да не совсем простой...
Суть вопроса такова: В книге есть 22 листа (1 лист для кнопки "Начать тест", 2-21 листы для вопросов с вариантами ответов, 22-й лист для вывода результата), мне нужно сделать так, чтобы при нажатии кнопки "Начать тест" автоматически из 20-ти вопросов (листов) выбирались 5 произвольных и тест для того, кто его проходит, состоял по сути не из 20 вопросов (листов), а из 5-ти.
Я уже не знаю, как только не крутила... с помощью чего можно вообще так сделать? Буду безумно благодарна, если кто-то хоть чем-то поможет!
Вроде бы всё сделал, открываются листы со 2 по 21 в хаотичном порядке, попробовать можно так, запускаете файл и переключаете клавиатуру на английский язык, и нажимете сочетание клавиш ctrl+w, выподение повторов тоже предусмотрел!
lexey_fan, В первом варианте у меня просто книга с 22-мя листами открывается и когда я нажимаю ctrl+w то появляется окошко с указанием того, с каким листом я в данный момент работаю. Во втором варианте у Вас есть 7 листов с номерами 1,8,13,14,16,18,22. Когда я нажимаю "Начать тест" то открываются только эти листы, а мне нужно, чтобы когда я второй раз нажимаю на первом листе "Начать тест" открывались уже другие листы ( с другими вопросами ).
Например первый раз нажала "Начать тест" и из всех 22 листов задействованы в тесте будут лишь листы 1,5,7,12,13,17,22, Второй раз нажала "Начать тест" - из всех 22 листов будут задействованы в тесте лишь 1,2,7,9,15,20,22, в третий раз - 1,2,7,9,16,18,22 и т.п...
Я не знаю даже с помощью чего это можно сделать... с помощью макросов или функция какая есть?
Public Sub VisSheets(bMetka As Boolean)
Dim sh As Worksheet
For Each sh In ThisWorkbook.Worksheets
If sh.Name <> "Лист1" And sh.Name <> "Лист22" Then
If bMetka Then sh.Visible = True Else sh.Visible = False
End If
Next
End Sub
Sub tt()
Dim iRnd As Integer
Dim i As Byte
Dim nUni As New Collection
VisSheets False
Randomize
On Error Resume Next
Do
iRnd = CInt(Int((21 * Rnd()) + 2))
nUni.Add CStr(iRnd), CStr(iRnd)
Loop Until nUni.Count = 5
On Error GoTo 0
For i = 1 To 5
Sheets(CInt(nUni(i))).Visible = True
Next
End Sub
О Боженьки, благодарствую!!! То, что надо! Простите за наглость, но Вы бы не могли мне расписать немножко как делать так, чтобы я могла сама такой тест сделать? Я так понимаю, что делали в Visual Basic с которым я совсем не знакома еще...
я сделал то же самое что и LightZ, в первом примере по нажатии сочетания клавиш активировались в хаотичном порядке листы, во втором примере стояло условие на единичный запуск, т.е при старте скрывались все листы и при нажатии на кнопку открывались только 5 листов в хаотичном порядке + последний лист, при закрытии документа и новом открытии появляются новые листы
lexey_fan, к сожалению, во втором варианте, как бы я не нажимала "начать тест" или не открывала заново книгу - листы одни и те же... а с первым вариантом всё так же... ничего не "активируется"...
LightZ, Толк в том, чтобы я разобралась с чем именно работать и смысл каждого кода, потому что мне как ни как самой тест все-таки придется делать, чтобы защититься (объяснить преподавателю как я сделала тест)...
billie_jean, вот код без ограничений, но как и у LightZ так и у меня иногда открывается не 5 листов теста а 4, или даже 3, но редко! проследите по шагово что делает макрос клавишей f8, может что то понятней станет, а так я думаю мало кто захочет разъяснять значение каждой строки!
Перед прогоном переменные vop просто надо "обнулять", иначе при последующих прогонах условие ...If vop_1 = ""... уже не работает :-)
Код
Sub test()
Sheets(1).Select
vop_1 = "": vop_2 = "": vop_3 = "": vop_4 = "": vop_5 = ""
For w = 2 To 22
Sheets(w).Visible = 2
Next
For i = 1 To 5
nn:
x = Random
If x = vop_1 Then GoTo nn
If x = vop_2 Then GoTo nn
If x = vop_3 Then GoTo nn
If x = vop_4 Then GoTo nn
If x = vop_5 Then GoTo nn
If vop_1 = "" Then vop_1 = x
If x = vop_1 Then GoTo mm
If vop_2 = "" Then vop_2 = x
If x = vop_2 Then GoTo mm
If vop_3 = "" Then vop_3 = x
If x = vop_3 Then GoTo mm
If vop_4 = "" Then vop_4 = x
If x = vop_4 Then GoTo mm
If vop_5 = "" Then vop_5 = x
If x = vop_5 Then GoTo mm
mm:
Sheets(x).Visible = -1
'MsgBox "Лист открыт под номером" & x
Next
Sheets(22).Visible = -1
End Sub
А где здесь тест? Вам пока показали варианты случайного выбора листов. А что дальше? Как Вы видите решение задач и создание итогового листа? Посмотрите обсуждение по тестам по ссылке здесь
Igor67, вот я и говорю, что тест я знаю как делать, всё сделаю и решение и т.п. там через макросы, функцию "ЕСЛИ" и т.п., а вот как сделать, чтобы страницы выбирались сейчас буду разбираться Вы, быть может, подумали, что мне нужен тест по Excel, но нет, мне любые вопросы, любое оформление, главное чтобы всё считалось и листалось. Для 1 курса и того вполне достаточно
А что Вам мешает открыть все листы, добавить на них вопросы, сделать подсчёт итогов на 22 листе (тем более Вы говорите что знаете и можете сделать)? а в дальнешем воспользоваться примерами выше...Просто достаточно не просто придумывать за Вас что то, вы попробуйте сделать и если что то получаться не будет выкладывайте файл, я уверен что вам тут обязатльно помогут уже "допилить" то что у Вас не получится!
billie_jean, Вы пишите про тест, но это просто определенное количество вопросов. Зачем вопросы прятать на разные листы? Тем более (ИМХО) обработать в последующем кучу листов совсем не просто. Если бы делал тест - в книге 3 листа первый для запуска и прохождения теста, 2-й скрытый с контрольными вопросами, которые выбираются в случайном порядке на первый лист, и на 3-й записываем результат теста.
Ребят, как я понял - просто девочке-первокурснице в университете задали такое задание (скорей всего какая-то лабораторная работа), которое ей нужно будет потом защитить перед преподавателем. billie_jean, я сегодня после работы подкорректирую код и добавлю комментарии, думаю дальше Вы уже разберетесь.
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
LightZ, Сама себя запутала... Вот ссылка на мой тест (т.к. весит он больше 200 кб), там через VB всё видно и понятно как что делалось... http://myfolder.ru/files/36309902 На последнем 22-м листе в O1 функция =СУММ(Лист2!I1;Лист3!I1;...;Лист21!I1); Массив (E4;E10:H4;H10) объеденен и вставлена функция =ЕСЛИ(O1=5;5;ЕСЛИ(O1=4;4;ЕСЛИ(O1=3;3;2))) - беда в том, что считаются баллы за все 20 вопросов, а не за 5, т.к. тест по прежнему из 20, а не 5 вопросов... Запуталась окончательно...
Выручайте!!! Моего мозга не достаточно для того, чтобы правильно отредактировать и подставить ваши варианты кодов в мой тест...
lexey_fan, Вот, самое оно! Большое спасибо! Только там опять первый раз 5 вопросов, а на следующий раз может и 2 всего выпасть... и вопросы бывает повторяются... Теперь осталось хоть в чем-то самой разобраться... А как все листы открыть, чтобы можно было редактировать их? Или это теперь тоже только через коды?