2014-11-03 3 views
-2

У меня есть викторина в файле excel (версия 2007), выполненная с использованием комбинации пользовательских форм vba и функций листа. Когда файл excel открывается, первым листом является «викторина», а второй скрытый лист - «sheet1». Тест отлично работает, но мне нужно внести небольшое изменение в логику. В нем есть лист вопросов/ответов (sheet1), который сконструирован таким образом, что первая буква вопроса имеет префикс ответа. Например, вот пример данных в диапазоне A1: A20. Ответ на первый вопрос - «b», поэтому вопрос префикс «b».Использование функции Rand рабочего листа или rnd() excel VBA

bWho is a cricketer? 
Tiger Woods 
Sachin Tendulkar 
Will Smith 
Bill Gates 
aWho is a Golfer 
Tiger Woods 
Sachin Tendulkar 
Will Smith 
Bill Gates 
dWho is an Entrepreneur 
Tiger Woods 
Sachin Tendulkar 
Will Smith 
Bill Gates 
cWho is an actor 
Tiger Woods 
Sachin Tendulkar 
Will Smith 
Bill Gates 

Вопросы рандомизированы и работает правильно, но когда отображается случайный вопрос, последовательность ответа никогда не меняется. Следовательно, единственное, что мне нужно сделать, это разобрать четыре ответа (в листе 1), когда книга открывается, не перебирая логику префикса ответа на первую букву вопроса и сохраняя все остальное. Пожалуйста, помогите мне, как я могу это достичь. Какой код можно записать и какой раздел vba (sheet/module)?

Я показываю вам пример вопроса 1, как это должно быть после рандомизации.

cWho is a cricketer? 
Will Smith 
Bill Gates 
Sachin Tendulkar 
Tiger Woods 

Здесь варианты перемешаны, а также правильный ответ обновляется в вопросе (с префиксом «с», который был ранее «б») Спасибо!

+0

Похоже, вы могли бы использовать модуль * * Class или даже * Словарь *. Вы можете проверить любой из них. – L42

+1

http://www.cpearson.com/excel/ShuffleArray.aspx Обратите внимание на значение ответа перед перетасовкой, затем найдите индекс ответа в перетасованном массиве. –

+0

Это хорошее начало ... скоро вернется. спасибо –

ответ

0

Я получил ответ на Excel Forum от Bernie Deitrick

Sub test() 
    Dim r As Long 
    Dim CA As String 

    For r = 1 To Cells(Rows.Count, "A").End(xlUp).Row Step 5 
     CA = Cells(r, "A").Offset(Asc(LCase(Left(Cells(r, "A").Value, 1))) - 96, 0).Value 
     Cells(r, "A").Offset(1, 1).Resize(4, 1).Formula = "=RAND()" 
     With ActiveSheet.Sort 
      .SortFields.Clear 
      .SortFields.Add Key:=Cells(r, "A").Offset(1, 1).Resize(4, 1), _ 
      SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal 
      .SetRange Cells(r, "A").Offset(1, 0).Resize(4, 2) 
      .Header = xlNo 
      .Orientation = xlTopToBottom 
      .Apply 
     End With 
     Cells(r, "A").Offset(1, 1).Resize(4, 1).Clear 
     CA = Chr(Application.Match(CA, Cells(r, "A").Offset(1, 0).Resize(4, 1), False) + 96) 
     Cells(r, "A").Value = CA & Right(Cells(r, "A").Value, Len(Cells(r, "A").Value) - 1) 
    Next r 
End Sub 
Смежные вопросы