excel - كيفية جولة في مس أسيس، فبا





ms-access access-vba rounding worksheet-function (11)


لقد استخدمت وظيفة بسيطة التالية لجولة العملات الخاصة بي كما هو الحال في شركتنا ونحن دائما مستديرة.

Function RoundUp(Number As Variant)
   RoundUp = Int(-100 * Number) / -100
   If Round(Number, 2) = Number Then RoundUp = Number
End Function

ولكن هذا سوف الجولة دائما تصل إلى 2 الكسور العشرية، وربما أيضا خطأ.

حتى لو كان سلبيا سوف تقترب (-1.011 سيكون -1.01 و 1.011 سيكون 1.02)

وذلك لتوفير المزيد من الخيارات لتقريب (أو لأسفل للسلبية) هل يمكن استخدام هذه الوظيفة:

Function RoundUp(Number As Variant, Optional RoundDownIfNegative As Boolean = False)
On Error GoTo err
If Number = 0 Then
err:
    RoundUp = 0
ElseIf RoundDownIfNegative And Number < 0 Then
    RoundUp = -1 * Int(-100 * (-1 * Number)) / -100
Else
    RoundUp = Int(-100 * Number) / -100
End If
If Round(Number, 2) = Number Then RoundUp = Number
End Function

(المستخدمة في وحدة نمطية، إذا لم يكن واضحا)

ما هي أفضل طريقة لجولة في الوصول فبا؟

يستخدم الأسلوب الحالي طريقة إكسيل

Excel.WorksheetFunction.Round(...

ولكن أبحث عن وسيلة لا تعتمد على إكسيل.




كن حذرا، وظيفة فبا جولة يستخدم تقريب بانكر، حيث جولات 0.5 إلى عدد زوجي، مثل ذلك:

Round (12.55, 1) would return 12.6 (rounds up) 
Round (12.65, 1) would return 12.6 (rounds down) 
Round (12.75, 1) would return 12.8 (rounds up)   

في حين أن ورقة عمل إكسيل جولة، دائما جولات 0.5.

لقد فعلت بعض الاختبارات، ويبدو .5 حتى تقريب (متماثل التقريب) يستخدم أيضا من قبل تنسيق الخلية، وأيضا لتقريب عرض العمود (عند استخدام تنسيق الرقم العام). لا يظهر العلم "الدقة كما عرض" للقيام بأي التقريب نفسه، فإنه يستخدم فقط نتيجة مدورة لتنسيق الخلية.

حاولت تنفيذ الدالة سيماريث من ميكروسوفت في فبا لتقريب بلدي، ولكن وجدت أن فيكس يحتوي على خطأ عند محاولة اعطائها عددا مثل 58.55؛ وظيفة تعطي نتيجة 58.5 بدلا من 58.6. ثم اكتشفت أخيرا أنه يمكنك استخدام وظيفة ورقة عمل إكسيل جولة، مثل ذلك:

Application.Round (58.55، 1)

هذا سوف يسمح لك للقيام التقريب العادي في فبا، على الرغم من أنها قد لا تكون سريعة مثل بعض وظيفة مخصصة. وأنا أدرك أن هذا قد حان دائرة كاملة من السؤال، لكنه أراد إدراجه من أجل اكتماله.




هنا طريقة سهلة للدوران دائما إلى العدد الكامل التالي في أسيس 2003:

BillWt = IIf([Weight]-Int([Weight])=0,[Weight],Int([Weight])+1)

فمثلا:

  • [ويت] = 5.33؛ إنت ([ويت]) = 5؛ لذلك 5.33-5 = 0.33 (<> 0)، لذلك الإجابة هي بيلوت = 5 + 1 = 6.
  • [الوزن] = 6.000، إنت ([الوزن]) = 6، لذلك 6.000-6 = 0، لذلك الجواب هو بيلوت = 6.



إنت وإصلاح في كل من وظائف التقريب مفيدة، والتي تعطيك جزء صحيح من عدد.

إنت دائما جولات أسفل - إنت (3.5) = 3، إنت (-3.5) = -4

إصلاح دائما جولات نحو الصفر - إصلاح (3.5) = 3، إصلاح (-3.5) = -3

وهناك أيضا وظائف الإكراه، ولا سيما سنت و كلنغ، التي تحاول إجبار عدد على عدد صحيح أو نوع طويل (عدد صحيح بين -32،768 و 32،767، تتراوح بين 2،147،483،648 و 2،147،483،647). وسوف تقترب كلاهما من أقرب عدد صحيح، تقريب بعيدا عن الصفر من .5 - سنت (3.5) = 4، سنت (3.49) = 3، سنت (-3.5) = -4، الخ.




وقد ذكر لانس بالفعل bug تقريب وراثة في تنفيذ فبا. لذلك أنا بحاجة إلى وظيفة التقريب الحقيقي في التطبيق VB6. هنا هو واحد أن أستخدمه. لأنه يقوم على واحد وجدت على شبكة الإنترنت كما هو مبين في التعليقات.

' -----------------------------------------------------------------------------
' RoundPenny
'
' Description:
'    rounds currency amount to nearest penny
'
' Arguments:
'    strCurrency        - string representation of currency value
'
' Dependencies:
'
' Notes:
' based on RoundNear found here:
' http://advisor.com/doc/08884
'
' History:
' 04/14/2005 - WSR : created
'
Function RoundPenny(ByVal strCurrency As String) As Currency

         Dim mnyDollars    As Variant
         Dim decCents      As Variant
         Dim decRight      As Variant
         Dim lngDecPos     As Long

1        On Error GoTo RoundPenny_Error

         ' find decimal point
2        lngDecPos = InStr(1, strCurrency, ".")

         ' if there is a decimal point
3        If lngDecPos > 0 Then

            ' take everything before decimal as dollars
4           mnyDollars = CCur(Mid(strCurrency, 1, lngDecPos - 1))

            ' get amount after decimal point and multiply by 100 so cents is before decimal point
5           decRight = CDec(CDec(Mid(strCurrency, lngDecPos)) / 0.01)

            ' get cents by getting integer portion
6           decCents = Int(decRight)

            ' get leftover
7           decRight = CDec(decRight - decCents)

            ' if leftover is equal to or above round threshold
8           If decRight >= 0.5 Then

9              RoundPenny = mnyDollars + ((decCents + 1) * 0.01)

            ' if leftover is less than round threshold
10          Else

11             RoundPenny = mnyDollars + (decCents * 0.01)

12          End If

         ' if there is no decimal point
13       Else

            ' return it
14          RoundPenny = CCur(strCurrency)

15       End If

16       Exit Function

RoundPenny_Error:

17       Select Case Err.Number

            Case 6

18             Err.Raise vbObjectError + 334, c_strComponent & ".RoundPenny", "Number '" & strCurrency & "' is too big to represent as a currency value."

19          Case Else

20             DisplayError c_strComponent, "RoundPenny"

21       End Select

End Function
' ----------------------------------------------------------------------------- 



لسوء الحظ، فإن وظائف فبا الأصلية التي يمكن أن تؤدي تقريب إما مفقودة، محدودة، غير دقيقة، أو عربات التي تجرها الدواب، ولكل عناوين فقط طريقة التقريب واحدة. الاتجاه الصعودي هو أنها سريعة، والتي قد تكون في بعض الحالات مهمة.

ومع ذلك، غالبا ما تكون الدقة إلزامية، ومع سرعة أجهزة الكمبيوتر اليوم، قليلا من الصعب معالجة بطيئة لاحظت، في الواقع ليس لمعالجة القيم الفردية. وتبدأ جميع الوظائف في الوصلات أدناه عند حوالي 1 μs.

يمكن العثور على مجموعة كاملة من الوظائف - لجميع أساليب التقريب الشائعة، وجميع أنواع البيانات من فبا، عن أي قيمة، وعدم إرجاع قيم غير متوقعة هنا:

تقريب القيم صعودا وهبوطا، 4/5، أو إلى أرقام كبيرة (إي)

أو هنا:

تقريب القيم صعودا وهبوطا، 4/5، أو إلى أرقام كبيرة (كوديبلكس)

رمز فقط في جيثب:

VBA.Round

وهي تغطي طرق التقريب العادية:

  • جولة لأسفل، مع خيار لجولة القيم السلبية نحو الصفر

  • تقريب، مع خيار لجولة القيم السلبية بعيدا عن الصفر

  • الجولة 4/5، إما بعيدا عن الصفر أو حتى (بانكر تقريب)

  • جولة إلى عدد من الشخصيات الهامة

تقبل الدالات الثلاث الأولى جميع أنواع البيانات الرقمية بينما آخرها موجود في ثلاثة أصناف - للعملة والعشرية والمزدوجة على التوالي.

انهم جميعا قبول عدد محدد من الكسور العشرية - بما في ذلك العد السلبي الذي سوف جولة إلى عشرات، مئات، الخ تلك مع المتغير كنوع العودة سيعود نول لإدخال غير مفهومة

يتم تضمين وحدة اختبار للاختبار والتحقق من صحة كذلك.

مثال هنا - للتقريب المشترك 4/5. يرجى دراسة التعليقات في خط التفاصيل الدقيقة والطريقة التي يستخدمها كديك لتجنب أخطاء البتات.

' Common constants.
'
Public Const Base10     As Double = 10

' Rounds Value by 4/5 with count of decimals as specified with parameter NumDigitsAfterDecimals.
'
' Rounds to integer if NumDigitsAfterDecimals is zero.
'
' Rounds correctly Value until max/min value limited by a Scaling of 10
' raised to the power of (the number of decimals).
'
' Uses CDec() for correcting bit errors of reals.
'
' Execution time is about 1µs.
'
Public Function RoundMid( _
    ByVal Value As Variant, _
    Optional ByVal NumDigitsAfterDecimals As Long, _
    Optional ByVal MidwayRoundingToEven As Boolean) _
    As Variant

    Dim Scaling     As Variant
    Dim Half        As Variant
    Dim ScaledValue As Variant
    Dim ReturnValue As Variant

    ' Only round if Value is numeric and ReturnValue can be different from zero.
    If Not IsNumeric(Value) Then
        ' Nothing to do.
        ReturnValue = Null
    ElseIf Value = 0 Then
        ' Nothing to round.
        ' Return Value as is.
        ReturnValue = Value
    Else
        Scaling = CDec(Base10 ^ NumDigitsAfterDecimals)

        If Scaling = 0 Then
            ' A very large value for Digits has minimized scaling.
            ' Return Value as is.
            ReturnValue = Value
        ElseIf MidwayRoundingToEven Then
            ' Banker's rounding.
            If Scaling = 1 Then
                ReturnValue = Round(Value)
            Else
                ' First try with conversion to Decimal to avoid bit errors for some reals like 32.675.
                ' Very large values for NumDigitsAfterDecimals can cause an out-of-range error 
                ' when dividing.
                On Error Resume Next
                ScaledValue = Round(CDec(Value) * Scaling)
                ReturnValue = ScaledValue / Scaling
                If Err.Number <> 0 Then
                    ' Decimal overflow.
                    ' Round Value without conversion to Decimal.
                    ReturnValue = Round(Value * Scaling) / Scaling
                End If
            End If
        Else
            ' Standard 4/5 rounding.
            ' Very large values for NumDigitsAfterDecimals can cause an out-of-range error 
            ' when dividing.
            On Error Resume Next
            Half = CDec(0.5)
            If Value > 0 Then
                ScaledValue = Int(CDec(Value) * Scaling + Half)
            Else
                ScaledValue = -Int(-CDec(Value) * Scaling + Half)
            End If
            ReturnValue = ScaledValue / Scaling
            If Err.Number <> 0 Then
                ' Decimal overflow.
                ' Round Value without conversion to Decimal.
                Half = CDbl(0.5)
                If Value > 0 Then
                    ScaledValue = Int(Value * Scaling + Half)
                Else
                    ScaledValue = -Int(-Value * Scaling + Half)
                End If
                ReturnValue = ScaledValue / Scaling
            End If
        End If
        If Err.Number <> 0 Then
            ' Rounding failed because values are near one of the boundaries of type Double.
            ' Return value as is.
            ReturnValue = Value
        End If
    End If

    RoundMid = ReturnValue

End Function



لتوسيع قليلا على الإجابة المقبولة:

"وظيفة جولة يؤدي جولة إلى حتى، والذي يختلف من جولة إلى أكبر".
--مايكروسوفت

تنسيق يقترب دائما.

  Debug.Print Round(19.955, 2)
  'Answer: 19.95

  Debug.Print Format(19.955, "#.00")
  'Answer: 19.96

ACC2000: أخطاء التقريب عند استخدام أرقام النقطة العائمة: http://support.microsoft.com/kb/210423

ACC2000: كيفية تقريب رقم لأعلى أو لأسفل بواسطة زيادة مطلوبة: http://support.microsoft.com/kb/209996

جولة وظيفة: http://msdn2.microsoft.com/en-us/library/se6f2zfx.aspx

كيفية تنفيذ إجراءات التقريب المخصصة: http://support.microsoft.com/kb/196652




1 place = INT(number x 10 + .5)/10
3 places = INT(number x 1000 + .5)/1000

وهكذا سوف تجد كثيرا ما يبدو أن حلول كلودجي على ما يبدو مثل هذا أسرع بكثير من استخدام وظائف إكسيل، لأن فبا يبدو أن تعمل في مساحة ذاكرة مختلفة.

على سبيل المثال If A > B Then MaxAB = A Else MaxAB = B حوالي 40 × أسرع من استخدام ExcelWorksheetFunction.Max




VBA.Round(1.23342, 2) // will return 1.23



إذا كنت تتحدث عن التقريب إلى قيمة عدد صحيح (وليس التقريب إلى المنازل العشرية)، فهناك دائما طريقة المدرسة القديمة:

return int(var + 0.5)

(يمكنك جعل هذا العمل ل n المنازل العشرية أيضا، لكنه يبدأ للحصول على فوضوي قليلا)




لن تسمح لك واجهة Excel الخاصة باستعلامات SQL Server بوجود معلمات مخصصة. طريقة حول هذا هي إنشاء استعلام Microsoft عامة ، ثم إضافة معلمات ، ثم لصق استعلام parametorized الخاص بك في خصائص الاتصال. فيما يلي الخطوات التفصيلية لبرنامج Excel 2010:

  1. افتح برنامج Excel
  2. علامة التبويب بيانات الانتقال
  3. من الزر "من مصادر أخرى" اختر من Microsoft Query
  4. ستظهر نافذة "اختيار مصدر البيانات". اختر مصدر بيانات وانقر فوق موافق .
  5. سؤال الاستعلام
    1. اختر العمود: ستظهر النافذة. الهدف هو إنشاء استعلام عام. أوصي باختيار عمود واحد من جدول صغير.
    2. تصفية البيانات: فقط انقر فوق التالي
    3. ترتيب الفرز: فقط انقر فوق التالي
    4. الانتهاء: فقط انقر فوق " إنهاء" .
  6. ستظهر نافذة "استيراد البيانات":
    1. انقر فوق الزر خصائص ...
      1. اختر علامة التبويب التعريف
      2. في قسم "نص الأمر:" ، أضف عبارة WHERE التي تتضمن معلمات Excel. من المهم إضافة جميع المعلمات التي تريدها الآن. على سبيل المثال ، إذا كنت أريد معلمتين ، يمكنني إضافة هذا:
        أين 1 =؟ و 2 =؟
      3. انقر على موافق للرجوع إلى نافذة "استيراد البيانات"
    2. اختر تقرير PivotTable
    3. انقر فوق موافق
  7. ستتم مطالبتك بإدخال قيمة المعلمات لكل معلمة.
  8. بمجرد إدخال المعلمات ، ستكون في الجدول المحوري الخاص بك
  9. انتقل batck إلى علامة التبويب بيانات وانقر على زر خصائص الاتصالات
    1. انقر فوق علامة التبويب التعريف
    2. في قسم "نص الأمر:" ، لصق في استعلام SQL الحقيقي الذي تريده مع نفس العدد من المعلمات التي قمت بتعريفها مسبقًا.
    3. انقر فوق الزر Parameters ...
      1. أدخل القيم موجه لكل معلمة
      2. انقر فوق موافق
    4. انقر فوق موافق لإغلاق نافذة الخصائص
  10. تهانينا ، لديك الآن معلمات.






excel ms-access access-vba rounding worksheet-function