2016-04-12 19 views
0

[make quantity] alanındaki değere en yakın olan 8 [qty] alanlarına değer bulmak için aşağıdaki kodu kullanıyorum. Kod, [qty] alanlarındaki değerin artan değerler olması şartıyla istediğim gibi çalışır. Örneğin. 10,20,30,40,50,60,70,80Aşağıdaki kod çalışmasını hem artan hem de azalan sayılarla nasıl yapabilirim?

Değerler iniyorsa veya örn. 80,70,60,50,40,30,20,10 veya 10,30,50,40,70,20,80 vb

kimse daha iyi bir şekilde

If Me![Make Quantity] <= Me![qty1] Then 
    materialprice = Me![raw1] 

ElseIf Me![Make Quantity] <= Me![qty2] And Me![Make Quantity] > Me![qty1] Then 
    materialprice = Me![raw1] 

ElseIf Me![Make Quantity] <= Me![qty3] And Me![Make Quantity] > Me![qty2] Then 
    materialprice = Me![raw2] 

ElseIf Me![Make Quantity] <= Me![qty4] And Me![Make Quantity] > Me![qty3] Then 
    materialprice = Me![raw3] 

ElseIf Me![Make Quantity] <= Me![qty5] And Me![Make Quantity] > Me![qty4] Then 
    materialprice = Me![raw4] 

ElseIf Me![Make Quantity] <= Me![qty6] And Me![Make Quantity] > Me![qty5] Then 
    materialprice = Me![raw5] 

ElseIf Me![Make Quantity] <= Me![qty7] And Me![Make Quantity] > Me![qty6] Then 
    materialprice = Me![raw6] 

ElseIf Me![Make Quantity] <= Me![qty8] And Me![Make Quantity] > Me![qty7] Then 
    materialprice = Me![raw7] 

Else 
    materialprice = Me![raw8] 

End If 
bu nasıl işleneceğini önerebilirsiniz
+0

Öğelerin sırasını tutmak zorunda mısın? – Sorceri

+0

ne demek istiyorsun? [qty1] ve [raw1] 'in birlikte kalması gerekiyorsa, evet ama eğer [qty2]' nin [qty1] 'i takip etmesi gerekiyorsa ve o zaman – superllanboy

+0

' u takip etmemiz isteniyorsa Sekiz nicelikten 'en uygun' bulmaya çalışıyor musunuz? yani, tam eşleşmeyi bulun ya da 'Miktarı' aşan en az miktarda eşleşme bulun. Ayrıca, bu alanların tümü bazı kayıt kümeleriyle doldurulmuş bir formda görünüyor? –

cevap

2

GÜNCELLEME !! Kod değiştirildi, böylece QTY < en düşük, varsayılan en düşük; en yüksekse, en yüksek değeri kullanın.

Birlikte attığım bazı kodlar ... verilere sahip olmadığımdan, test verilerini 8 çift metin kutusuna yükledim (alan adlarınızı kullanarak). Kodu çağırmak için 'Make Quantity' metin kutusu için 'CHANGE' olayını kullandığımı unutmayın. Bununla birlikte yürütmeyi zorlayabilirsiniz ...

Memnun kaldığınızda, Debug ifadelerini ve MsgBox'ı açıklayın.

Option Compare Database 
Option Explicit 

Private Sub Form_Load() 
Dim i As Integer 
Dim MakeQuantity As Integer 
Dim materialprice As Double 

Me.qty1 = 30: Me.qty2 = 20: Me.qty3 = 70: Me.qty4 = 50: Me.qty5 = 10: Me.qty6 = 60: Me.qty7 = 80: Me.qty8 = 70 
Me.raw1 = 3.3: Me.raw2 = 2.2: Me.raw3 = 7.7: Me.raw4 = 5.5: Me.raw5 = 1.1: Me.raw6 = 6.6: Me.raw7 = 8.8: Me.raw8 = 7.7 

End Sub 


    Private Sub Make_Quantity_AfterUpdate() 
Dim i  As Integer 
Dim iDiff As Integer 
Dim iLow As Integer 
Dim iMatch As Integer 
Dim iHigh As Integer 
Dim dPriceL As Double 
Dim dPriceH As Double 
Dim dPriceM As Double 
Dim iQtyL As Integer 
Dim iQtyH As Integer 

    iLow = 30000 
    iHigh = 0 
    iMatch = 10 
    Debug.Print "Find Qty of: " & Me.[Make Quantity] 
For i = 1 To 8 
    If Int(Me("qty" & i)) <= iLow Then 
     iLow = Int(Me("qty" & i)) 
     dPriceL = Me("raw" & i) 
     iQtyL = Int(Me("qty" & i)) 
    End If 
    If Int(Me("qty" & i)) >= iHigh Then 
     iHigh = Int(Me("qty" & i)) 
     dPriceH = Me("raw" & i) 
     iQtyH = Int(Me("qty" & i)) 
    End If 

    iDiff = Abs(Me.[Make Quantity] - Me("qty" & i)) 
    If Int(Me("qty" & i)) <= Int(Me.[Make Quantity]) Then 
     If iDiff <= iMatch Then 
      iMatch = iDiff 
      dPriceM = Me("raw" & i) 
     End If 
    End If 
    Debug.Print "i: " & i & vbTab & "Qty: " & Me("qty" & i) & vbTab & "Diff: " & iDiff & vbTab & "Raw: " & Me("raw" & i) 
Next i 

    If dPriceM <> 0 Then ' Did we find a suitable match? 
     MsgBox "Make Quantity: " & Me.[Make Quantity] & vbCrLf & "Price: " & dPriceM 
    Else  ' Didn't find a good match; must be < lowest or > highest 
     If iQtyL > Int(Me.[Make Quantity]) Then  ' Greater than lowest QTY, use Lowest QTY price... 
      MsgBox "Make Quantity: " & Me.[Make Quantity] & vbCrLf & "Price: " & dPriceL 
     ElseIf iQtyH < Int(Me.[Make Quantity]) Then  ' Greater than highest QTY, use highest QTY price... 
      MsgBox "Make Quantity: " & Me.[Make Quantity] & vbCrLf & "Price: " & dPriceH 
     Else 
      MsgBox "Impossible? Asked for Qty of: " & Me.[Make Quantity] & vbCrLf & _ 
       "Lowest Qty: " & iQtyL & vbTab & _ 
       "Highest Qty: " & iQtyH 

     End If 
    End If 
End Sub 
+0

Merhaba wayne - bunun için teşekkürler - yarın denemek ve size geri dönmeniz gerekecek – superllanboy

+0

Yukarıdaki kodu biraz değiştirdim ve iyi çalışıyor, ancak tavsiye ederseniz küçük bir ince ayar gerekiyor. Eğer 20 ve 30'luk miktarlarım varsa ve kullanıcı 27'lik bir miktar girerse, 20'ye 30'luk bir değerle ilişkilendirilecek ham adete ihtiyacım var. Yukarıdaki kod 20'den 25'e kadar değerler için 20'yi seçecek ve 26 ve 30 arasındaki değerler için 30. Bunu nasıl yapacağınızı önerebilirsiniz. - Teşekkürler – superllanboy

+0

Eh, şimdi daha fazla bilgiye ihtiyacım var. QTY değerleri her zaman MOD 10 olur mu yoksa herhangi bir değer olabilir mi? Eğer MOD 10 ise, o zaman kolay değilse, MOD 10 değilse, o zaman '21' yerine '20' aldığınızda tanımlayın. –