Jeigu yra būdas padaryti geriau, atrask jį. T. A. Edison

Sveiki, Svečias
Prisijungimo vardas: Slaptažodis: Prisiminti mane
  • Puslapis:
  • 1

TEMA: VBA Round - reiktų vengti.

VBA Round - reiktų vengti. prieš 3 m. 7 mėn. #1

  • bankeris
  • bankeris avataras
  • Neprisijungęs
  • Moderatorius
  • C#, VB.NET, VBA, MS Access, VSTO
  • Žinutės: 70
  • Gauta padėka 8
  • Reputacija: 8
Kadangi tam tikrais atvejais atsitinka taip...

Šiandien atėjo diena kai teko susidurti su dar vienu Excel VBA šposu.. Kai bandau pritaikyti dviem skirtingiems skaičiams ROUND - rezultatą gaunu tą patį.. Taigi, turiu 12.55 ir 12.65, juos reikia ROUND iki 1 skaičiaus po kablelio :) Deja abu šie variantai gauna tas pačias reikšmes: 12.6. Parašiau trumpą VBA kodą kuriuo galite patys įsitikinti.

Kol kas nežinau kodėl taip duoda, nežinau kaip reiktų to išvengti tik žinau, kad čia jau N metų senumo dalykas. Kai turėsiu VBA sprendimą įdėsiu jį čia, gal kas savo centus/skaičius išgelbės :).
Sub ine()
    Dim a As Double
    Dim b As Double
    Dim c As Currency
    Dim d As Currency
 
    a = Round(12.55, 1)
    b = Round(12.65, 1)
    'a = 12.6
    'b = 12.6

    c = Round(12.55, 1)
    d = Round(12.65, 1)
    'c = 12.6
    'd = 12.6
End Sub
Nepamirškite teisingiems atsakymams paspausti "Padėkos"

I could change the world, if only they would give me the source code....
Paskutinis taisymas: prieš 3 m. 7 mėn. nuo bankeris.
Administratorius uždraudė viešą pranešimų rašymą.

VBA Round - reiktų vengti. prieš 3 m. 7 mėn. #2

  • ZygD
  • ZygD avataras
  • Neprisijungęs
  • Auksinis narys
  • Žinutės: 197
  • Gauta padėka 60
  • Reputacija: 20
Sveikas, bankeri. VBA Round visada taip veikė, ir esu tikras, kad visada veiks. Esmė - kad toje vietoje, kur apvalinama yra lygiai 5 (12.55 ir 12.65), VBA apvalina iki artimesnio lyginio skaičiaus.

Ištaisyti galima:
(1) pridedant pvz 0.00001 prieš apvalinant, kas tavo vertės iš esmės nepakeistų, arba
(2) naudoti WorksheetFunction.Round() funkciją, kuri kreipiasi į Excelio funkciją.
Administratorius uždraudė viešą pranešimų rašymą.
Jums padėkojo šie nariai: dll

VBA Round - reiktų vengti. prieš 3 m. 7 mėn. #3

  • bankeris
  • bankeris avataras
  • Neprisijungęs
  • Moderatorius
  • C#, VB.NET, VBA, MS Access, VSTO
  • Žinutės: 70
  • Gauta padėka 8
  • Reputacija: 8
ZygD parašė:
Sveikas, bankeri. VBA Round visada taip veikė, ir esu tikras, kad visada veiks. Esmė - kad toje vietoje, kur apvalinama yra lygiai 5 (12.55 ir 12.65), VBA apvalina iki artimesnio lyginio skaičiaus.

Ištaisyti galima:
(1) pridedant pvz 0.00001 prieš apvalinant, kas tavo vertės iš esmės nepakeistų, arba
(2) naudoti WorksheetFunction.Round() funkciją, kuri kreipiasi į Excelio funkciją.

Labas,

Taip teko naudoti WorksheetFunction.Round(), ir prie Round gyvenime nebegrisiu - tiesiog nežinojau kad taip veikia, o jokios info nepridėta kai rašai round(.. Pirmas variantas tai nesamonė pridėti 0,00001.. praktiškai paprastas žmogus pradedantysis panaudos Round ir gaus paklaidą - taip žmonės ir darbų netenka dėl paklaidų. Ir taip šita vieta nesikeis, aš perskaičiau mokslinį straipsnį, kodėl taip įvyksta ir iš tiesų tai net ne klaida yra, o taip ir gaunasi su tik Double... o naudojant Round skaičiai automatiškai į Double verčiasi nes keliauja į VBA.Math.Round()... Tai va, atrodo pagrindus žinai, o pasirodo nieko nežinai :)
Nepamirškite teisingiems atsakymams paspausti "Padėkos"

I could change the world, if only they would give me the source code....
Administratorius uždraudė viešą pranešimų rašymą.
Jums padėkojo šie nariai: dll
  • Puslapis:
  • 1
Moderatoriai: bankeris
Puslapio sukūrimo laikas: 0.250 sekundžių