Arkadiusz Kania

Arkadiusz Kania Custody Tax SME,
Senior Associate

Temat: VBA Round()

Cześć,

jedną z funkcji, którą chcę wrzucić do mojego makra jest zaokrąglanie wartości w kolumnie do liczb całkowitych.

Niestety natknąłem się na jeden problem charakterystyczny dla VBA. Mianowicie liczby, które mają po przecinku 5 czy 6 zaokrąglane są losowo w dół lub w górę. Potrzebuję, żeby zawsze od 5 w górę zaokrąglać liczbę w górę, a poniżej 5 w dół.

W jaki sposób mogę to obejść?
Poniżej kod.

Sub zaokrag()

Dim x As Long

Range("C3").Select
Do While ActiveCell.Value <> ""
x = ActiveCell
Round (x)
ActiveCell.Value = x
ActiveCell.Offset(1, 0).Range("A1").Select
Loop


End Sub


Dziękuję za pomoc.
Oskar Shon

Oskar Shon Dodatki do Office
www.VBATools.pl

Temat: VBA Round()

Użyj formuły arkuszowej
WorksheetFunction.Round()

zamiast vba.Round()
A jak masz problem z 5-tym miejscem po przecinku to podnieś wartość o 10000, zrób zaokrąglenie do całkowitej, a potem podziel o tą samą wartość.Ten post został edytowany przez Autora dnia 19.01.20 o godzinie 11:59
Arkadiusz Kania

Arkadiusz Kania Custody Tax SME,
Senior Associate

Temat: VBA Round()

Dziękuję.

W sumie to chcę zrobić tak:

250,49 ---> 250
250,5 ---->251

Zrobiłem to w ten sposób:

Sub zaokrag()

Dim x As Long

Range("C3").Select
Do While ActiveCell.Value <> ""
x = ActiveCell
x = WorksheetFunction.Round(x, 1)
ActiveCell.Value = x
ActiveCell.Offset(1, 0).Range("A1").Select
Loop


End Sub


Efekt jest taki, że 1,5 zaokrąglane jest do 2, ale 2,5 też do 2.
Natomiast 2,51 makro zaokrągla prawidłowo do 3.Ten post został edytowany przez Autora dnia 19.01.20 o godzinie 12:38
Oskar Shon

Oskar Shon Dodatki do Office
www.VBATools.pl

Temat: VBA Round()

A dlaczego u ciebie deklaracja X to long?
Sprawdź dlaczego mi się to nie podoba.

oraz sprawdź takie rozumowanie i zastosuj to u siebie:
Sub test()
Debug.Print zaokr(1.5)
Debug.Print zaokr(2.5)
Debug.Print zaokr(2.51)
Debug.Print zaokr(250.49)
Debug.Print zaokr(250.5)
End Sub

Function zaokr(x As Currency) As Double
zaokr = WorksheetFunction.Round(x, 0.5)
End Function

Poza tym zamień pętle Do na For i nie używaj ActiveCell ani Select - tylko zadeklaruj zmienna obiektową typu Range
Arkadiusz Kania

Arkadiusz Kania Custody Tax SME,
Senior Associate

Temat: VBA Round()

Dziękuję za pomoc.

Domyślam się, że deklarowanie X as long jest tutaj zbędne ze względu na niewykorzystanie zakresu zmiennej long. Lepszym wyborem byłaby zmienna Integer. Czy o to chodziło?

Dlaczego używanie ActiveCell i Select jest niewskazane?Ten post został edytowany przez Autora dnia 01.02.20 o godzinie 22:25
Oskar Shon

Oskar Shon Dodatki do Office
www.VBATools.pl

Temat: VBA Round()

Long to liczby stałe. a więc jakiekolwiek zaokrąglenie dziesiętnych nie ma tutaj zastosowania.
Integer... no już prędzej, ale pytanie czy zaokrąglenie dotyczy wartości np cenowych, w tedy stosowniejsze jest currency. Zobacz do helpa [F1]. Masz tam opisane wszystkie zakresy zmiennych liczbowych.

ActiveCell i Select to pierwszy krok do opóźnienia kodu. Tak jednak nagrywa nagrywaczka w Excelu a potem stado baranów powiela ten schemat. Oczywiście stosujesz tylko i wyłącznie w tedy gdy zależy ci na przejściu do komórki, ale za obliczeniami np w pętlach nie musi stać przechodzenie z komórki do komórki jako jej zaznaczenie, prawda?
Arkadiusz Kania

Arkadiusz Kania Custody Tax SME,
Senior Associate

Temat: VBA Round()

W moim przypadku akurat nie ma wartości cenowych, więc currency się nie sprawdzi. Użyję w takim przypadku zmiennej Integer.

Tak, zgadzam się z użyciem ActiveCell i Select.
Faktycznie, w sytuacji kiedy mamy rozbudowaną pętle i używamy ActiveCell i Select to w każdym takim przypadku, przy przejściu do kolejnej komórki, Excel ją zaznacza.

Dzięki za poradę i wyjaśnienie.

Następna dyskusja:

Unikaty z kolumny - bez VBA...




Wyślij zaproszenie do