在VBA中随机行

所以我有一个多列和行的Excel文件。 目前看起来像这样:

| A | B | C | D --------------------- 1 | 1a | 1b | 1c | 1d --------------------- 2 | 2a | 2b | 2c | 2d --------------------- 3 | 3a | 3b | 3c | 3d ---------------------- 

我如何随机使用VBA,使其成为:

  | A | B | C | D --------------------- 1 | 3a | 3b | 3c | 3d --------------------- 2 | 1a | 1b | 1c | 1d --------------------- 3 | 2a | 2b | 2c | 2d ---------------------- 

这个问题确实有很多可能的答案。 这可能是最蹩脚的一个,但实际上它确实很好:

  1. 添加一个额外的列;
  2. 然后把随机值放在这一列中;
  3. 按这个列sorting – 这正是你想要的!
  4. 删除额外的列,所以技巧是不可见的!
  5. 瞧!

只是给你一些想法如何看起来像这样:

 Option Explicit Public Sub Randomize() Dim lCounter As Long Application.ScreenUpdating = False Columns("A:A").Insert Shift:=xlToRight For lCounter = 1 To 5 Cells(lCounter, 1) = Rnd() Next lCounter With ActiveSheet.Sort .SortFields.Add Key:=Range("A1:A5") .SetRange Range("A1:E5") .Apply End With Columns("A:A").Delete Application.ScreenUpdating = False End Sub 

它会处理像这样的数据:

在这里输入图像说明

您可以进一步更新代码,通过删除幻数和改善范围。

我会去如下:

 Sub ShuffleRows() Dim vals As Variant, val As Variant Dim iRow As Long With Range("A1").CurrentRegion '<--| reference your contiguous range vals = .Value '<--| store its content in an array For Each val In GetRandomNumbers(.Rows.count) '<--| loop through referenced range shuffled rows indexes iRow = iRow + 1 '<--| update current row to write in counter .Rows(iRow).Value = Application.Index(vals, val, 0) '<--| write in current rows to write the random row from corresponding shuffled rows indexes Next End With End Sub Function GetRandomNumbers(ByVal n As Long) As Variant Dim i As Long, rndN As Long, tempN As Long ReDim randomNumbers(1 To n) As Long '<--| resize the array to the number of rows For i = 1 To n '<--| fill it with integer numbers from 1 to nr of rows randomNumbers(i) = i Next 'shuffle array Do While i > 2 i = i - 1 Randomize rndN = Int(i * Rnd + 1) tempN = randomNumbers(i) randomNumbers(i) = randomNumbers(rndN) randomNumbers(rndN) = tempN Loop GetRandomNumbers = randomNumbers End Function 

这是我的解决scheme:

首先,我创build了一个函数来生成a和b之间的随机数字,而没有重复的值:

jlqmoreno@gmail.com

胡里奥耶稣卢娜莫雷诺

 Option Base 1 Public Function u(a As Variant, b As Variant) As Variant Application.Volatile Dim k%, p As Double, flag As Boolean, x() As Variant k = 1 flag = False ReDim x(1) x(1) = Application.RandBetween(a, b) Do Until k = b - a + 1 Do While flag = False Randomize p = Application.RandBetween(a, b) 'Debug.Assert p = 2 resultado = Application.Match(p, x, False) If IsError(resultado) Then k = k + 1 ReDim Preserve x(k) x(k) = p flag = True Else flag = False End If Loop flag = False Loop u = x End Function 

这是netesary,因为我需要一个函数创build随机指数没有重复(这是粗略的部分)然后,我用这个函数使用我在这里应用的逻辑

有了这个function:

 Public Function RNDORDER(rango As Range) As Variant Dim z() As Variant, n%, m%, i%, j%, y() As Variant, k% n = rango.Rows.count m = rango.Columns.count k = 1 ReDim x(n, m) ReDim y(n) y = u(1, n) For i = 1 To n For j = 1 To m x(i, j) = rango(y(i), j) Next j Next i RNDORDER = x 

只要运行这个函数作为数组函数。

谢谢!