2017-02-20 1 views
0

Я пытаюсь сделать sub, который в основном проходит через диапазон и добавляет значение ячейки в одну из четырех сумм (в зависимости от того, что является наименьшим), я знаю, что могу сделать это через серия IF, но я считаю, что это слишком сложный и простой в использовании.Как сделать минимальный цикл переменной суммы в VBA

я в основном имеют S1, S2, S3 и S4, я петлю через диапазон ячеек и давайте предположим:

S1 = 1 
S2 = 3 
S3 = 2 
S4 = 4 

Мне нужен код, чтобы проверить значение ячейки и добавить его в переменную с низкая сумма, то есть:

min(S1,S2,S3,S4) = min + cell value 

для этого случая: S1 = S1 + CellValue

Спасибо заранее! :)

ответ

0

Это чрезмерно усложняющие вещи для циклического преобразования переменных с помощью функции. В то время как серия IF может использовать еще несколько строк кода, по производительности это ничтожно.

Sub Test() 
Dim S1 as Long, S2 as Long, S3 as Long, S4 as Long 
Dim cell as Range 

S1 = 1 
S2 = 2 
S3 = 3 
S4 = 4 

For Each cell in Range("A:A")  

If S4 < S3 And S4 < S2 And S4 < S1 Then 
    S4 = S4 + cell.Value 
ElseIf S3 < S4 And S3 < S2 And S3 < S1 Then 
    S3 = S3 + cell.Value 
ElseIf S2 < S4 And S2 < S3 And S2 < S1 Then 
    S2 = S2 + cell.Value 
ElseIf S1 < S4 And S1 < S3 And S1 < S2 Then 
    S1 = S1 + cell.Value 
End If 

Next cell  

End Sub 
+0

Это работало нормально, просто нужно и регулировка, когда один или несколько сумм имеют одинаковое значение и все минимумы. Благодаря! – Eugene

0

Вот быстрый способ найти наименьшее значение, при условии, что ваши данные находятся в ячейках A1: A5

Sub MinMacro() 


Dim rng As Range 
Set rng = Range("A1:A5") 

Dim value As Integer 
value = Application.Min(rng) 

msgbox value 

End Sub 
1

Как вы получаете ответы, это один не использует сослагательного наклонения:

Sub foo() 
Dim rng As Range, cel As Range 
Dim inptRng As Range 
Dim t As Long 
Set rng = ActiveSheet.Range("S1:S4") 
Set inptRng = ActiveSheet.Range("A1:A10") 
For Each cel In inptRng 
    With Application.WorksheetFunction 
     t = .Match(.Min(rng), rng, 0) 
     rng(t) = rng(t) + cel 
    End With 
Next cel 

End Sub 
0

не можете проверить это, но я думаю, что-то, как это должно работать:

[s1:s4] = [s1:s4+(s1:s4=min(s1:s4))*cellvalue] 

Или в отдельных шагах с временным диапазоном для результатов по формуле:

Range("z1:z4").Formula = "s1+(s1=min(s$1:s$4))*cellvalue" 
Range("s1:s4").Value2 = Range("z1:z4").Value2 
Range("z1:z4").ClearContents