2017-05-10 3 views
-2

私は最初に最小のものを識別しなければならないコードを書いています。次に小さいものを2番目に小さくして、それらの行番号を取得します(ここでは行番号を別の列に保存します1つの列(ここでは列2)から別の列(ここでは列7)に、行番号の順に内容をコピーします。つまり、最初に小さい順、次に2番目に小さい順にコピーします。私のコードの論理的なエラー

毎に43行

始まる172のそのようなデータセットがへのデータ(これは新しい列(各データセットのカラム7の45行)の数値の和まで続けるありコピーされている)が指定された数(すべてのデータセットの列1の45行、すなわちA45、A88)

EDIT:上記のG45はA45と比較されます。シート自体

Dim m As Range, cl As Range, k As Double, b As Double, lIndex As Double, a As Double, multi As Double, l As Integer, x As Double 

Set m = ActiveSheet.Range("E3:E40") 
multi = 2                'To move to starting position of the data set 

For i = 1 To 172 
    b = 45 + 43 * (i - 1) 

    For k = 1 To 38 
     a = Application.Small(m, k) 'To find the kth smallest number 
     l = 1 
     For j = 1 To 38    'To store the matching row numbers (Multiple instances) in column 50 
       Cells(j, 50).Value = 0          'Initializing to column no. 50 to 0 
       If Cells(j + multi, 5).Value = a Then      'Checking for match 
        Cells(l, 50).Value = j + multi       'Storing Row coordinates in column no. 50 
        l = l + 1 
       End If 
      Next j 

'==============THE FOLLOWING IS THE AREA WHERE THE PROBLEM MIGHT BE====================== 


     For o = 1 To l - 1 'To Copy the values based on the criteria 
      x = Cells(o, 50).Value 
      If Cells(b, 7).Value <= Cells(b, 1).Value Then    '"CRITERIA" Checking whether sum of the column is less than or equal to sum of first column of set 
       Cells(x, 7).Value = Cells(x, 2).Value 
      End If 
     Next o 

    Next k 

    Set m = m.Offset(43) 
    multi = multi + 43 
Next i 

問題は、コピーをコピーする条件(合計値が一定値未満である必要があります)が機能していないことです。このコラムへコラム2からすべてのデータ7.

は、誰かがその理由であるかもしれないものを見つけるのに役立つことができ、実際にコピー...

注:私はチェックして、店舗の行番号をコードすることが確認さ列50で正常に動作しています。だから問題は、変数 "o"のforループであるコードの下半分にある可能性があります。

+0

あなたはDouble'のdeclerationとして 'Oを欠落していませんか? –

+0

コンパイル時にエラーを出さないので、ループ実行中に暗黙のうちに実行されると仮定します... –

+0

私とjのようなものがあります。 –

答えて

0

私は先に進み、これを自分自身に押し付けました。実現

は、複数のミスがあった:

  1. 私は逃し0に新しい列を初期化する必要がありました。何らかの理由により列を7から6に変更しました。

  2. プロセスが完了するはずだったにもかかわらずプロセスが実行されたために基準に達したときに、for-loopのメインを終了しませんでした。このためにブール変数フラグを使用しました。

  3. 小さな関数で与えられた値の繰り返しを含む反復回数を数えると、変数 "l"は+1と数えられます。適切な調整を行いました。 (何らかの理由で列が50から500に変更されました)

  4. Excelが計算された値を更新していないことがわかりました。最初にApplication.Calculate関数が含まれていました。ここで

は、作業コードです:

Application.Calculate 
Dim m As Range, cl As Range, k As Double, b As Double, lIndex As Double, a As Double, multi As Double, l As Double, x As Double, Check As Double, flag As Boolean 
    l = 2 
    Set m = ActiveSheet.Range("E3:E40") 
    multi = 2                'To move to starting position of the data set 
    flag = False 

    For i = 1 To 172 

     b = 45 + 43 * (i - 1) 
     Cells(b, 6).Value = 0 

     For p = 3 To 40 

      Cells(p + ((i - 1) * 43), 6).Value = 0        'Initializing to column no. 6 to 0 

     Next p 

     For k = 1 To 38 

      If flag = True Then 
      flag = 0 
      Exit For 
      End If 

      If k + l - 2 <= 38 Then 
       a = Application.Small(m, (k + l - 2)) 
       k = k + l - 2 
      Else 
       Exit For 
      End If 

      l = 1 

      For j = 1 To 38 

       Cells(j, 500).Value = 0          'Initializing to column no. 500 to 0 

       If Cells(j + multi, 5).Value = a Then      'Checking for match 
        Cells(l, 500).Value = j + multi       'Storing Row coordinates in column no. 500 
        l = l + 1 
       End If 

      Next j 

      For o = 1 To l - 1 

       x = Cells(o, 500).Value 
       Cells(x, 6).Value = 0 
       Cells(b, 6).Value = Cells(b, 6).Value + Cells(x, 2).Value 
       Check = Cells(b, 6).Value 
       If Cells(b, 6).Value <= Cells(b, 1).Value Then    'Checking whether sum of the column is less than or equal to sum of first column of set 
        Cells(x, 6).Value = Cells(x, 2).Value 
       Else: 
        Cells(x, 6).Value = Cells(b, 1).Value - (Cells(b, 6).Value - Cells(x, 2).Value) 
        Cells(b, 6).Value = Cells(b, 6).Value - Cells(x, 2).Value + Cells(x, 6).Value 
        flag = True 
       Exit For 
       End If 

      Next o 

     Next k 

     Set m = m.Offset(43) 
     multi = multi + 43 

    Next i 

End Sub