2016-12-15 30 views
-1

Excel VBAコーディングに問題があります。Do-whileループが正しく実行されていません

特定の条件で1つのシートから別のシートにデータをコピーするコードを作成したいと考えています。セル内のデータは0または1です。

Sheet1のデータは、ほぼ1000行あります。私はちょうどSheet1からシート2に15ランダムな行のデータを取るしたいと思います。達成する必要がある基準は、各列に少なくとも2または3のが含まれていることです1)。私はコーディングが正しいと思いますが、実行するとデータは停止しません。どうすればこの問題を解決できますか?

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)_ "満たさなければならない基準は、各列に少なくとも2または3が含まれていることです。" _:表示されたコードにはこの基準がありますか? 2)_少なくとも「2または3」_という意味ですか?あなたは_少なくとも2 "_または_" 2または3 "_を意味しますか? – user3598756

+0

大丈夫です。間違っていなければ、私はi、j、kを設定すると、私のコーディングを見ることができます。列iとjは少なくとも2を設定し、Kは3以上を指定します。@ user3598756 –

+2

重複するhttp://stackoverflow.com/questions/40847869/do-while-loop-in-excel-vba-error?あなたの問題はそこに解決されましたか?もしそうなら、なぜあなたは何の答えも受け入れなかったのですか? –

答えて

0

あなたはおそらく43個の列を持っていません。例えば、Do Whileループのbeggingsを変更してください:

Do While i < 43 

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

と同じにkjのために。

+0

43列のデータがあるかもしれませんが、これらの列のうちの1つ以上が指定された基準を満たすのに十分ではないかもしれません。 無作為な選択であるため、列を決して選ぶことができないほど不運であるという単純な事実であることは、それぞれが列挙された基準を満たすことを確実にする – EdHunter

関連する問題