Microsoft Excel

Herbers Excel/VBA-Archiv

Zeilen nach Zufallsprinzip löschen

Betrifft: Zeilen nach Zufallsprinzip löschen von: Jan-Gerrit
Geschrieben am: 29.04.2008 21:11:22

Hallo,

ich habe eine Tabelle mit 5444 Zeilen und möchte 444 Zeilen nach dem Zufallsprinzip löschen.
Gibt es da eine Möglichkeit?

Viele Dank!
Jan-Gerrit

  

Betrifft: AW: Zeilen nach Zufallsprinzip löschen von: Uwe (:o)
Geschrieben am: 29.04.2008 21:51:10

Hi Jan-Gerrit,
ich würde das mit diesem Code machen:

Sub loeschen()
Dim I As Integer
   Do Until I = 444
      Cells(Rnd() * (5445 - I), 1).EntireRow.Delete
      I = I + 1
   Loop
End Sub


Bin aber nicht sicher, ob das 100% sauber ist?!

Gruß
Uwe
(:o)


  

Betrifft: AW: Zeilen nach Zufallsprinzip löschen von: Daniel
Geschrieben am: 29.04.2008 21:54:50

HI
Per Makro vielleicht so:

Sub ZufallsZeilenLöschen()
Dim i As Long
Dim ze As Long
For i = 5444 To 5001 Step -1
    ze = CLng(Rnd(i) * i) + 1
    Rows(ze).Delete
Next
End Sub




Gruß, Daniel


  

Betrifft: AW: Zeilen nach Zufallsprinzip löschen von: Peter Feustel
Geschrieben am: 29.04.2008 22:04:37

Hallo Jan-Gerrit,

nach einem Code von Sepp Ehrensberger etwas modifiziert - es gibt keine doppelten Zahel, also echte 444

Option Explicit

Sub ZufallsZahlen()
Dim dblZahlen() As Long, dblGezogen() As Variant
Dim intCount As Integer, intIndex As Integer, intZufall As Integer
Dim intStart As Integer, intEnde As Integer, intAnzahl As Integer

intStart = 1 'Erste Zahl
intEnde = 5444 'Letzte Zahl
intAnzahl = 444 'Anzahl Zufallszahlen

ReDim dblZahlen(intEnde - intStart)
ReDim dblGezogen(intAnzahl - 1)

'Array füllen
For intCount = intStart To intEnde
  dblZahlen(intIndex) = intCount
  intIndex = intIndex + 1
Next

intIndex = 0
Randomize Timer

'Zufallszahlen ziehen
For intCount = 0 To intAnzahl - 1
  intZufall = Int(Rnd() * UBound(dblZahlen))
  dblGezogen(intIndex) = dblZahlen(intZufall)
  dblZahlen(intZufall) = dblZahlen(UBound(dblZahlen))
  If UBound(dblZahlen) = 0 Then Exit For
  ReDim Preserve dblZahlen(UBound(dblZahlen) - 1)
  intIndex = intIndex + 1
Next

'Zufallszahlen sortieren
QuickSort dblGezogen

'In Bereich ausgeben (ab "A1")
'Range(Cells(1, 2), Cells(intAnzahl, 2)) = Application.Transpose(dblGezogen)


'die Zufallszeilen löschen
For intIndex = 443 To 0 Step -1
   Rows(dblGezogen(intIndex)).Delete Shift:=xlUp
Next intIndex

End Sub




' Quicksort
'

Sub QuickSort(data() As Variant, Optional UG, Optional OG)
Dim P1&, P2&, T1 As Variant, T2 As Variant

UG = IIf(IsMissing(UG), LBound(data), UG)
OG = IIf(IsMissing(OG), UBound(data), OG)

P1 = UG
P2 = OG
T1 = data((P1 + P2) / 2)

Do
  
  Do While (data(P1) < T1)
    P1 = P1 + 1
  Loop
  
  Do While (data(P2) > T1)
    P2 = P2 - 1
  Loop
  
  If P1 <= P2 Then
    T2 = data(P1)
    data(P1) = data(P2)
    data(P2) = T2
    P1 = P1 + 1
    P2 = P2 - 1
  End If
  
Loop Until (P1 > P2)

If UG < P2 Then QuickSort data, UG, P2
If P1 < OG Then QuickSort data, P1, OG

End Sub




Gruß Peter


  

Betrifft: AW: Zeilen nach Zufallsprinzip löschen von: Jan-Gerrit
Geschrieben am: 29.04.2008 22:21:16

Super, hab das Makro von Daniel ausprobiert. Hat geklappt! Danke!


  

Betrifft: AW: Zeilen nach Zufallsprinzip löschen von: Daniel
Geschrieben am: 29.04.2008 22:26:01

Hi
noch ne Lösung ohne VBA:

- zwei Hilfsspalten einfügen (A und B )
- Formel in Spalte A:

 = Zufallszahl()


- Formel in Spalte B:

 =WENN(RANG(A1;A:A)<=444;WAHR;"")


- jetzt kannst du die zufällig gewählten Zeilen löschen:
entweder über den Autofilter nach WAHR
oder über: Spalte B markieren, BEARBEITEN - GEHE ZU - INHALTE - FORMELN - WAHRHEITSWERTE klicken, und dann BEARBEITEN - ZELLEN LÖSCHEN - GANZE ZEILE

Gruß, Daniel


  

Betrifft: kürzer von: Klaus M.vdT.
Geschrieben am: 30.04.2008 11:33:58

Moin Daniel,

Das

 =WENN(RANG(A1;A:A)<=444;WAHR;"")


geht auch kürzer!

=RANG(A1;A:A)<=444


ergibt WAHR oder FALSCH

Grüße,
Klaus M.vdT.


  

Betrifft: AW: kürzer von: Daniel
Geschrieben am: 30.04.2008 23:22:38

Hi
das ist richtig, aber dann kann ich die zu löschenden Daten nur noch über den Autofilter selektieren und nicht über BEARBEITEN - GEHE ZU - INHALTE - FORMELN - WAHRHEITSWERTE, weil sowohl WAHR als auch FALSCH ein Wahrheitswert sind und somit die Daten über diese Funktkion nicht differenzierbar sind.

Gruß, Daniel


 

Beiträge aus den Excel-Beispielen zum Thema "Zeilen nach Zufallsprinzip löschen"