Ich brauche Hilfe zufällige Zeilen mit bestimmten Bedingungen von einer anderen Arbeitsmappe erhalten zu können:VBA/Makro zufällige Zeilen zu kopieren, basierend auf mehreren Bedingungen
Wenn ich auf eine Schaltfläche klicken/ein Makro ausführen, soll ich so etwas wie erhalten Dieser:
- 4 zufällige Zeilen für alle Zeilen, die „AU“
- 1 zufällige Zeile für alle Zeilen hat, die „FJ“
- 1 zufällige Zeile für alle Zeilen hat, die „NC“
- hat 3 zufällige Zeilen für Alle Zeilen, die für alle Zeilen, die "SG12" hat
FROM ALL Raw Data_Park Sampling.xlsx
"Sheet1
" Blatt und fügen es Park Sampling Tool.xlsm
"Random Sample
" sheet "NZ"
Alles sollte mit einem Klick geschehen.
Unten ist der ganze Code, den ich bekam.
Sub MAINx1()
'Delete current random sample
Sheets("Random Sample").Select
Cells.Select
Range("C14").Activate
Selection.Delete Shift:=xlUp
Dim rawDataWs As Worksheet, randomSampleWs As Worksheet
Dim map, i As Long, n As Long, c As Long, rand, col
Dim keyArr, nRowsArr
Dim rng As Range
Set rawDataWs = Workbooks("Raw Data_Park Sampling.xlsx").Worksheets("Sheet1")
Set randomSampleWs = Workbooks("Park Sampling Tool.xlsm").Worksheets("Random Sample")
randomSampleWs.UsedRange.ClearContents
'Set map = RowMap(rawDataWs.Range("A2:A923"))
Set rng = rawDataWs.Range("A2:A" & _
rawDataWs.Cells(Rows.Count, 1).End(xlUp).Row)
Set map = RowMap(rng)
keyArr = Array("AU", "FJ", "NC", "NZ", "SG12", "ID", "PH26", "PH24", "TH", "ZA", "JP", "MY", "PH", "SG", "VN") '<== keywords
nRowsArr = Array(4, 1, 1, 3, 1, 3, 3, 1, 3, 4, 2, 3, 1, 3, 2) '<== # of random rows
'Debug.Print "Key", "#", "Row#"
For i = LBound(keyArr) To UBound(keyArr)
If map.exists(keyArr(i)) Then
Set col = map(keyArr(i))
n = nRowsArr(i)
For c = 1 To n
'select a random member of the collection
rand = Application.Evaluate("RANDBETWEEN(1," & col.Count & ")")
'Debug.Print keyArr(i), rand, col(rand)
rawDataWs.Rows(col(rand)).Copy _
randomSampleWs.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
col.Remove rand 'remove the "used" row
If col.Count = 0 Then
If c < n Then Debug.Print "Not enough rows for " & keyArr(i)
Exit For
End If
Next c
Else
'Debug.Print "No rows for " & keyArr(i)
End If
Next i
MsgBox "Random Sample: Per Day Successfully Generated!"
End Sub
'get a map of rows as a dictionary where each value is a collection of row numbers
Function RowMap(rng As Range) As Object
Dim dict, c As Range, k
Set dict = CreateObject("scripting.dictionary")
For Each c In rng.Cells
k = Trim(c.value)
If Len(k) > 0 Then
If Not dict.exists(k) Then dict.Add k, New Collection
dict(k).Add c.Row
End If
Next c
Set RowMap = dict
End Function
'Set map = RowMap (rawDataWs.Range ("A2: A23"))' haben passen Sie diese Zeile ? Bitte aktualisieren Sie nicht Ihre ursprüngliche Frage, um Ihren Code durch meine Antwort zu ersetzen: Es ist einfacher für Leute, die später kommen, wenn Sie nur einen Kommentar zu meiner Antwort hinzufügen. –