是否可以根据表中的条目数将案例添加到 Select Case 中?
Posted
技术标签:
【中文标题】是否可以根据表中的条目数将案例添加到 Select Case 中?【英文标题】:Is it possible to add cases to a Select Case based on the number of entries in a table? 【发布时间】:2014-01-24 14:23:52 【问题描述】:我最近在 Excel 中搞乱了 VBA;作为我自己的一个小项目,我正在尝试创建一个“从帽子上画名字”之类的宏。
我首先生成一个随机数,然后使用 case 语句从表中选择哪个条目(即 ListObject)。这样做的问题是它只适用于表格条目的数量总是相同的。
所以我的问题(可能是一个荒谬的问题)是:是否有可能生成一个动态的“选择案例”块,其中块上的案例数量基于表中的条目数?
谢谢。
-肖恩
编辑:澄清一下:我想要做的,确切地说,是这样的:
我生成一个随机数 i,从 1 到 n=10*(表条目数)。之后,我想在一个单元格中显示一个基于随机数的表格条目。
理想情况下,代码的工作方式与此类似:
if i = 1 to 10 then choose event 1
if i = 11 to 20 then choose event 2
if i = 21 to 30 then choose event 3
...
if i = (n-9) to n then choose event (n/10)
我希望这有助于阐明代码的目标。
【问题讨论】:
您甚至可能不需要选择案例。生成随机数并选择条目后,您要做什么?显示什么?运行附加代码?你应该能够只使用和数组来做到这一点,但我很想知道更多你在做什么。 @AlexD 我已经编辑了问题以提供一些清晰度,希望它可以帮助您理解我正在尝试做的事情。如果您需要进一步解释,请告诉我。 我相信我知道你的意思,但我会在这里发表评论,直到我完全理解为止。我可以告诉你如何,如果你能确认这就是你要找的。但基本上从表条目生成一个数组,生成一个随机数,然后像 Cell(1, 4).Value = Array(random_number) 一样设置。或 MsgBox(Array(random_number))。取决于你希望它如何发挥作用。 @AlexD 这正是我所得到的,而你的方法是完成工作的一种更简单、更干净的方法。另外,我从来没有真正在 VBA 中对数组做过很多事情,所以这应该是一次很好的体验! 我会在 VBA 中写一些更接近的东西并发布以供您参考。 【参考方案1】:在我们的 cmets 中,您可以使用以下内容:
Sub random()
Dim used_rows As Integer
Dim random As Integer
Dim cell_array() As Integer
used_rows = Sheet1.UsedRange.Rows.Count
ReDim cell_array(used_rows)
For i = 1 To used_rows
cell_array(i - 1) = Cells(i, 1)
Next
random = Int(Rnd * (used_rows))
MsgBox cell_array(random)
End Sub
您可以继续将 MsgBox 更改为您喜欢的任何内容,或设置为 Cell(1,4).Value = cell_array(random),或者您想继续。它将基于使用的行数。尽管根据您实现电子表格的方式,代码可能需要稍作更改。
这是来自 cmets 建议的更新代码。还记得在表单初始化或 WorkBook Open 函数中使用 Randomize()。
Sub random()
Dim used_rows As Integer
Dim random As Integer
'Multiple ways to get the row count, this is just a simple one which will work for most implementations
used_rows = Sheet1.UsedRange.Rows.Count
random = Int(Rnd * (used_rows))
'I use the variable only for the reason that you might want to reference it later
MsgBox Cells(random, 1)
End Sub
【讨论】:
太棒了!谢谢您的帮助。关于数组使用的一个快速问题:初始Dim cell_array() As Integer
和ReDim
的目的是什么?使用数组时是否总是需要这样做?
数组和循环非常浪费,因为它们不需要得到相同的答案。你可以传入一个范围然后执行MsgBox Int(Rnd * Range.Rows.Count)
。此外,您应该使用Randomize
函数和Rnd
函数,因为每次打开工作簿Rnd
都会将种子重置为相同的值,它只会重复所有数字,它不会是随机的。将Randomize
函数与Rnd
一起使用会产生更好的结果,因为它使用系统时间值作为种子。
DetroitWilly 对于原始的 Dim 调用,您不能将变量传递给它来设置大小,但 ReDim 我可以将变量传递给适当的大小。这并不总是必要的,如果您知道数组的大小,您可以最初将其设置为 taht。 @user2140261 非常感谢!我将更新我的代码并在新版本中进行编辑。【参考方案2】:
这里假设“table”是指“带有大写 T 的表格”,在 VBA 中称为 ListObject
:
Sub PickRandomTens()
Dim lo As Excel.ListObject
Dim ListRowsCount As Long
Dim RandomNumber As Long
Dim ListEvent As String
Dim Tens As Long
Set lo = ActiveSheet.ListObjects(1)
ListRowsCount = lo.DataBodyRange.Rows.Count
RandomNumber = Application.WorksheetFunction.RandBetween(10, ListRowsCount * 10)
ListEvent = lo.ListColumns("Data Column").DataBodyRange.Cells(Int(RandomNumber / 10))
MsgBox "Random number: " & RandomNumber & vbCrLf & _
"Event: " & ListEvent
End Sub
【讨论】:
我指的是 ListObject。我将提供编辑以供将来参考。出于好奇,您认为使用WorksheetFunction.RandBetween
比使用 VBA Rnd
变量有什么优势吗?另外,vbCrLf
是什么?您没有在代码中的其他任何地方提及它。
我使用了RandBetween
,因为我能记住语法:)。 Rnd
可能会更好,我不确定。 VbCrLf
只是一个换行符,因此消息位于两行。
啊,这是一个很好的理由。并感谢有关 vbCrLf 的信息。我必须牢记这一点!以上是关于是否可以根据表中的条目数将案例添加到 Select Case 中?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以将图像添加到 Ant Design Tables 中的单元格表中?