是否可以根据表中的条目数将案例添加到 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 IntegerReDim 的目的是什么?使用数组时是否总是需要这样做? 数组和循环非常浪费,因为它们不需要得到相同的答案。你可以传入一个范围然后执行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 中的单元格表中?

根据第一列中的字母数将行与上一行连接起来

根据 id 列的条目数查询以将表中的数据聚合到另一个表中

哈希表中的条目是否可以使用相同的键和相同的值?

从数据条目(如工作表)复制值并将它们粘贴到单个工作表中,根据一个单元格中的某个值连续粘贴

自动将不同表中的 ID 号添加到新条目中?