2011-02-15 48 views
0

這裏的樣品片材:Excel 2007中的Visual Basic:最小值

可樂,COLB,COLC
A,0.2,10%
A,0.3,1%
A,0.5,6%
B,0.4,9%
B,0.3,8%
B,1.2,40%

我在找到最小值COLB對於SP在ColA中保留的值,然後檢查該行中的ColC是否大於15%。如果是這樣 - 返回值爲ColB。如果不是,找到下一個最小值並與先前找到的值相加,然後再次檢查和是否大於15%,依此類推。返回上一個求和值,從ColB

實施例(爲COLA = 「」):
1. COLB找到最小值(細胞:B2,值0.2)
2.檢查值在COLC在此行(單元格:C2,值10%)大於15%(不符合!)之前的值val = 0 + 10%= 10%
3.在ColB(cell:B3,value 0.3)
4.檢查> 15%條件 - >(單元格:C3,值1%)與先前val = 10%+ 1%= 11%(仍未滿足)
5.取下一個最小值ColB(cell:B4,value 0.5)
6.檢查> 15%條件 - >(cell:C4 ,值6%)與先前VAL = 11%+ 6%)=(17%之和(條件滿足)
7.我們總結的最後一個單元是C4,所以我們從此行中返回值COLB - 0.5

(關於「B」的答案是0.4)

我想問任何提示來解決這個問題。希望這是明確的;)

這是我的函數的原型
Function foo(ColA As String) As Integer

+1

分裂通過'ColA'的值,按ColB排序,創建'ColC'的累積和,找到這個總和的第一個值> 15%,並取該元素的ColB值。 – James

回答

0
Function Foo(rng As Range, ColA As String, Target As Variant) As Variant 
    Dim Dat() As Variant 
    Dim r As Long, c As Long 
    Dim sm As Variant 

    ' Get Data from sheet 
    Dat = rng.Value2 
    ' Sort DAT on column B 
    ' <sort code here> 

    sm = 0# 

    ' Loop through rows 
    For r = LBound(Dat, 1) To UBound(Dat, 1) 
     ' If Column 1 matches 
     If Dat(r, 1) = ColA Then 
      ' sum of column 3 
      sm = sm + Dat(r, 3) 

      ' If target reached 
      If sm >= Target Then 
       ' Return result 
       Foo = Dat(r, 2) 
       Exit Function 
      End If 
     End If 
    Next 

    ' Target not reached 
    Foo = "No Answer" 

End Function 

調用函數像這樣(替換$ A $ 1:$ C $ 6適合您的工作表)

=Foo($A$1:$C$6,"A",15%) 
+0

感謝您的快速重播,但不幸的是您的功能無法按預期工作。因此,它不檢查ColB中的最小值。據我所知,它返回ColB的第一個總和值,該值滿足> 15%的條件。無論如何,感謝您的幫助! – monczek

+0

對不起,忽略了最小值位。做這種排序列B上的數據。如果你需要幫助排序嘗試搜索QuickSort - 有很多例子在那裏... –