当文件打开时如何对数据进行重新排序?

当文件打开时如何对数据进行重新排序?

我有一个工作簿,里面有数据,每次打开工作簿时,我都想重新排序(如果重要的话,随机排序)。(例如,每次打开文件时rand(),都按下图所示的工作簿中由调用生成的 B 列重新排序。)

在此处输入图片描述

我不是剧本高手,但似乎

完全可以做到。(如果我没看错的话,他们说的是当在工作表中进行活动时更新内容:对于我的目的而言,在第一次打开工作表时进行重新排序很重要。)

我认为我可以编写一个四行脚本来实现这一点,但我不知道该怎么做。

如何在打开文件时重新排序工作簿?

[Excel版本14.0.7180.5002,属于office 2010的一部分。]


如果有人好奇的话,用途是:我正在向我的社区发送一份要投票的候选人名单;我希望名单是随机呈现的,以免选票偏向堆栈顶部。(有一百多名候选人,但只有一票可投。)

答案1

在 VBA 中,这可以通过一个子程序中的一行代码完成:

Private Sub Workbook_Open()

    Sheet1.Range("A:B").Sort Key1:=Sheet1.Range("B:B"), Order1:=xlAscending, Header:=xlYes

End Sub

(将每个“sheet1”实例替换为您的工作表(而非工作簿)的名称)

外行解释:打开 Excel 工作簿时,Workbook_Open 事件发生并运行一次。其中的一行代码基本上是说:基于 B 列对此单元格区域使用排序方法。按升序对结果进行排序。忽略顶行,因为它是标题。

请注意,B 列中的值不会显示排序。这是因为 Excel 重新计算了 rand() 函数两次 - 一次是在工作簿打开时,一次是在数据排序时。您可以添加更多代码来控制计算发生的时间,但就您而言,这似乎并不重要;最终结果是名称的顺序是随机的。

如何逐步实现此功能:

  1. 将您的工作簿保存为启用宏的工作簿。文件 > 另存为 > 将“保存类型”下拉菜单更改为“Excel 启用宏的工作簿 (*.xlsm)。

  2. 启用开发人员选项卡。文件 > 选项 > 自定义功能区 > 勾选主选项卡下的“开发人员”。按确定。

  3. 开发人员选项卡 > 单击“Visual Basic”。打开一个新窗口。右键单击“ThisWorkbook”,然后左键单击“查看代码”。

  4. 将子程序粘贴到右侧的代码区域。将工作表对象名称从 sheet1 更改为任何其他名称。保存、关闭、重新打开,然后您应该会看到它对名称进行随机排序。

至于 VBA 的底层原理和内部工作原理,互联网上有很多资源。不幸的是,在我的职业生涯中,我仍然会用到一点,Sybex 的《精通 Microsoft Office 2010 的 VBA》是一本很好的参考书。

答案2

如果您想避免使用 VBa,最简单的解决方案是使用数据透视表。

选择您的列,在新工作表中插入数据透视表,按以下顺序排列列“表格形式”并使用手动过滤器(降序或升序,没关系)然后转到“选项”选项卡(数据透视表),选择“选项”,然后查找“数据”子选项卡,单击“开通时实时数据“。

如果需要,您可以隐藏包含源数据的第一张工作表。

瞧!

每次打开文件时,数据透视表都会重新排序。

答案3

还有一种替代方案需要考虑(无需 VBA)。

假设原始列表为$H$2:$H$7,且范围内的单元格公式$B$2:$B$7RAND(),则输入公式

=INDEX($H$2:$H$7,SUMPRODUCT(--((FLOOR($B$2:$B$7*100000000,1)*0.00000001+(ROW($B$2:$B$7)-ROW($B$2))*0.000000001)<FLOOR(B2*100000000,1)*0.00000001))+1,1)

并将A2单元格复制/粘贴到A3:A7文件中并保存。

每次打开时,中的列表A2:A7都会重新排序。

在此处输入图片描述

$B$2:$B$7但请注意,每次重新计算时也会重新排序。

您可以从视图中移动静态列表(在另一张表上,/隐藏/保护等)。

评论:FLOOR()具有功能的部分

(FLOOR($B$2:$B$7*100000000,1)*0.00000001+(ROW($B$2:$B$7)-ROW($B$2))*0.000000001)

只是为了以防万一,通过在每个随机值上附加一个唯一的“尾巴”来保证随机密钥的唯一性而添加的。

编辑

最好将公式输入A2数组公式Ctrl++ Shift) 。令人惊讶的是,这对于或Enter并没有明显的区别,但只有数组形式才能正常工作。ExcelLibreOffice CalcGnumeric

编辑2

这更简单 数组公式Ctrl++ ShiftEnter放入A2

=INDEX($H$2:$H$7,1+SUM(1*($B$2:$B$7&$H$2:$H$7<B2&H2)))

答案4

因此,随机性让它变得更有趣。本例中的 A 列(1st 列)是 =rand(),并且你在工作表休息10000线

Private Sub Workbook_Open() 

 ActiveWorkbook.Worksheets("Breaks").AutoFilter.Sort.SortFields.Add Key:=Range _
        ("A1:A10000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Breaks").AutoFilter.Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

End Sub

相关内容