【发布时间】:2020-08-25 06:04:44
【问题描述】:
如图所示,我有两个范围。
我正在尝试编写一个 VBA 宏,它依次选择第一个范围 (“B23, F27”) 中的单个单元格,复制所选单元格的值,然后在第二个范围(“G23,K27”),并将第一个单元格的值粘贴到第二个范围内随机选择的单元格中。
这应该重复,直到第一个范围内的每个单元格都被复制,或者第二个范围内的每个单元格都填充了一个新值。在此示例中,两个结果是等效的,因为两个范围具有相同数量的单元格 (25)。
结果应该像第二张图片。
我尝试将第一个范围分配给一个数组,然后从该数组中选择一个随机值并将其粘贴到第二个范围。 我还尝试从第一个范围中提取唯一值,用它构建一个字典,然后从第二个范围中选择一个随机单元格,从字典中选择一个随机值并粘贴它。 后来我再次尝试使用 VBA 语法“with range”和 for“or each cell in range”,但我不能只是想出真正有效的东西。有时,第二个范围由各种值填充,但与预期不同。
第一个例子:这个是行不通的
Sub fillrange()
Dim empty As Boolean
'This part checks if every cell in the first range as a value in it
For Each Cell In Range("B23", "F27")
If Cell.Value = "" Then
empty = True
End If
Next
'If every cell is filled then
If empty Then
Exit Sub
Else:
With ThisWorkbook.Worksheets("Sheet1)").Range("B23", "F27")
.Cells(Application.WorksheetFunction.RandBetween(1, 25)).Select
.Copy 'the cell select works, but it will copy all range
'This does not work
'For Each Cell In Range("G23", "K27")
'Cells(Application.WorksheetFunction.RandBetween(1, 25)).Select
'.PasteSpecial Paste:=xlPasteValues
'Next
End With
End If
End Sub
第二个例子:它填充了范围但值错误
Sub fillrange2()
Dim empty As Boolean
For Each cell In Range("B23", "F27")
If cell.Value = "" Then
empty = True
'This part checks if every cell in the first range as a value in it
Exit For
End If
Next cell
If empty Then
Exit Sub
Else:
Dim ws As Worksheet
Dim lRow As Long, i As Long
Dim col As New Collection, itm As Variant
Set ws = ThisWorkbook.Sheets("Sheet1")
With ws
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
For i = 1 To lRow
On Error Resume Next
col.Add .Range("B23", "F27").Value, CStr(.Range("A" & i).Value)
On Error GoTo 0
Next i
End With
Dim MyAr() As Variant
ReDim MyAr(0 To (col.Count - 1))
For i = 1 To col.Count
MyAr(i - 1) = col.Item(i)
Next
For Each cell In Range("G23", "K27")
cell.Value = Application.WorksheetFunction.RandBetween(LBound(MyAr), UBound(MyAr))
Next
End If
End Sub
第三个例子:作为第二个例子,它填充了范围但值错误
Sub fillrange3()
Dim MyAr() As Variant
MyAr = Range("B23", "F27")
For Each cell In Range("G23", "K27")
cell.Value = Application.WorksheetFunction.RandBetween(LBound(MyAr), UBound(MyAr))
Next
End Sub
【问题讨论】:
-
你能贴出你试过的代码吗?它的核心似乎是在选择一个随机单元格,关于该主题的内容很多。
-
当然,我已经用代码示例更新了我的问题,谢谢