2016-12-15 3 views
-1

Ich habe ein Problem mit Excel-VBA-Codierung.Do-while-Schleife nicht richtig ausgeführt

Ich möchte, dass eine Kodierung Daten mit bestimmten Bedingungen von einem Blatt auf ein anderes Blatt kopieren kann. Daten in Zellen sind nur 0 oder 1.

Daten in Sheet1 hat fast tausend Zeilen. Ich möchte nur 15 zufällige Zeilen von Daten von Sheet1 zu Sheet 2 nehmen. Die Kriterien, die erfüllt werden müssen, ist, dass jede Spalte mindestens 2 oder 3 (1) enthält. Ich denke, die Codierung ist korrekt, aber wenn es ausgeführt wird, hören die Daten nicht auf zu laufen. Wie kann ich dieses Problem lösen?

this current data generate

Private Sub CommandButton1_Click() 

Randomize 'Initialize Random number seed 'for sheet 1 
Dim MyRows() As Integer ' Declare dynamic array. 
Dim numRows As Integer 
Dim percRows As Integer 
Dim nxtRow As Integer 
Dim nxtRnd As Integer 
Dim chkRnd As Integer 
Dim copyRow As Integer 
Dim i As Integer 
Dim j As Integer 
Dim clmttl1 As Integer 
Dim r As Integer 

Dim k As Integer 
Dim clmttl2 As Integer 
Dim ClmTtl As Integer 

numRows = Sheets(1).Range("A" & Rows.Count).End(xlUp).Row 
'Get 20% of that number 
    percRows = 15 

Dim claimTotalCheck As Boolean 

claimTotalCheck = True 
    Do While claimTotalCheck 
     ReDim MyRows(percRows) 
     For nxtRow = 1 To percRows 
getNew: 
      'Generate Random number 
      nxtRnd = Int((numRows) * Rnd + 1) 

      'Loop through array, checking for Duplicates 
      For chkRnd = 1 To nxtRow 
       'Get new number if Duplicate is found 
       If MyRows(chkRnd) = nxtRnd Then GoTo getNew 
      Next 
      'Add element if Random number is unique 
      MyRows(nxtRow) = nxtRnd 
     Next 

     For copyRow = 1 To percRows 
      Sheets(1).Rows(MyRows(copyRow)).Copy _ 
      Destination:=Sheets(2).Cells(copyRow, 1) 

     Next 

     claimTotalCheck = False 
     i = 1 

     Do While i < 43 
      ClmTtl = 0 

      For copyRow = 1 To percRows 
       ClmTtl = ClmTtl + Sheets(2).Cells(copyRow, i).Value 
      Next 

      If ClmTtl < 2 Then 
       claimTotalCheck = True 
      End If 
      i = i + 3 
     Loop 

     k = 2 
     Do While k < 43 
      clmttl1 = 0 

      For copyRow = 1 To percRows 
       clmttl1 = clmttl1 + Sheets(2).Cells(copyRow, k).Value 
      Next 

      If clmttl1 < 3 Then 
       claimTotalCheck = True 
      End If 
      k = k + 3 
     Loop 

     j = 3 
     Do While j < 43 
      clmttl2 = 0 

      For copyRow = 1 To percRows 
       clmttl2 = clmttl2 + Sheets(2).Cells(copyRow, j).Value 
      Next 

      If clmttl2 < 2 Then 
       claimTotalCheck = True 
      End If 
      j = j + 3 
     Loop 
    Loop 

End Sub 
+0

1) _ "Die Kriterien, die erfüllt werden müssen, ist, dass jede Spalte mindestens 2 oder 3 enthält." _: Wo ist dieses Kriterium in Ihrem angezeigten Code zu finden? 2) Was bedeutet "mindestens 2 oder 3"? Meinst du _ "mindestens 2" _ oder _ "2 oder 3" _? – user3598756

+0

okay. Du kannst auf meine Codierung schauen, wenn ich i, j, k setze, wenn ich mich nicht irre. Spalte i und j Ich setze atleast 2 während K atleast 3. @ user3598756 –

+2

Duplizieren von http://StackOverflow.com/questions/40847869/do-while-loop-in-excel-vba-error? War dein Problem dort gelöst? Wenn ja, warum hast du keine Antwort akzeptiert? –

Antwort

0

Sie haben wahrscheinlich nicht 43 Spalten. Bitte ändern beggings von Do While Schleifen, zum Beispiel:

Do While i < 43 

zu

Do While i < Sheets(2).Cells(1, Columns.Count).End(xlToLeft).Column 

und das gleiche gilt für k und j.

+0

Es kann sein, dass es 43 Spalten mit Daten gibt, aber 1 oder mehr dieser Spalten möglicherweise nicht genug 1 enthalten, um jemals die angegebenen Kriterien zu erfüllen Oder es könnte nur Die einfache Tatsache ist, dass es, da es sich um eine zufällige Auswahl handelt, unglücklich genug ist, nie Reihen auszuwählen, die sicherstellen, dass die Spalten jeweils die angegebenen Kriterien erfüllen – EdHunter