使用工作表函数的Rand或excel VBA的rnd()

时间:2014-11-03 22:07:44

标签: excel vba excel-vba excel-2007

我在excel文件(版本2007)中进行了一个测验,该文件由userforms vba和工作表函数组合而成。当打开excel文件时,第一张表是"测验"第二张隐藏的纸张是" sheet1"。测验工作正常,但我需要对逻辑进行一些小改动。它有一个问题/答案表(sheet1),其设计方式使问题的第一个字母以答案为前缀。例如,这里是A1:A20范围内的样本数据。对第一个问题的回答是" b"因此问题的前缀为" b"。

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

问题是随机的,并且工作正常但是当显示随机问题时,答案的顺序永远不会改变。因此,我唯一需要做的就是在打开工作簿的时候混淆四个答案(在sheet1中),而不会在问题的第一个字母前面加上前缀并且保持所有其他内容不变的逻辑。请帮助我如何实现这一目标。可以写什么样的代码和vba(表/模块)的哪个部分?

我向你展示问题1的例子,随机化之后应该如何。

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

在这里,选项是混乱的,并且问题中也更新了正确的答案(前面是' c'之前是' b') 谢谢!

1 个答案:

答案 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