De ce îmi rotunjește Excel VBA rezultatele diviziunii întregi? (Programare, Excel, Vba)

Nigel Stevens a intrebat.

Scriu o macro VBA în Excel 2002 pentru a manipula datele de la un dispozitiv care oferă 10 valori pe fiecare dintre cele 4 canale.

Când încerc să împart un număr întreg cu un alt număr întreg pentru a calcula rândul și coloana, rezultatul arată că folosește rotunjirea bankers, ca și cum ar fi o variabilă cu virgulă mobilă.

Sub TestRounding()
    Dim Y As Integer
    Dim Field As Integer
    Dim Channel As Integer

    ActiveWorkbook.Sheets.Add
    ActiveWorkbook.ActiveSheet.Cells.Select
    range("A1").Select

    For Field = 1 To 40
        Channel = (Field - 1) / 10
        Y = Field - 1
        ActiveSheet.range("A1").Offset(Y, Channel).Value = Field
    Next Field

End Sub

Y este rândul în care se pune ieșirea, pe care de obicei îl setez cu

Y = (Field -1) mod 10

dar am lăsat-o ca

Y = Field - 1

pentru a ilustra mai clar punctul din foaia de calcul rezultată.

Channel ar trebui să fie coloana în care se pune ieșirea.

Când execut această macro, valorile 1-6 sunt puse în coloana A, apoi 7-15 sunt puse în coloana B, 16-26 sunt puse în coloana C, apoi 27-35 în coloana D și apoi 36-40 în coloana E.

Ceea ce mă așteptam era ca valorile 1-10 să fie introduse în coloana A, 11-20 în coloana B, 21-30 în coloana C și 31-40 în coloana D.

Sunt obișnuit cu C și C++, unde, dacă împart un număr întreg cu un alt număr întreg, rezultatul este calculat cu ajutorul matematicii numerelor întregi. Ce este diferit în VBA?

2 răspunsuri
Daniel

Pentru a folosi „integer maths” pentru împărțire folosiți în loc de /.

Diviziunea numerelor întregi \

A împărți un element înseamnă a-l tăia în bucăți sau fracțiuni dintr-o valoare stabilită. Prin urmare, diviziunea este folosită pentru a obține fracția unui număr în raport cu un alt număr. Limbajul Visual Basic oferă două tipuri de operații pentru împărțire. Dacă doriți ca rezultatul operației să fie un număr natural, numit număr întreg, utilizați operatorul de inversare „
ca divizor. Formula care trebuie folosită este: Value1 Value2 Această operație poate fi efectuată pe două tipuri de numere valide, cu sau fără părți zecimale. După operație, rezultatul va fi un număr natural.

Decimal Division /
Cel de-al doilea tip de împărțire are ca rezultat un număr zecimal. Se efectuează cu bara oblică „/”. Formula sa este următoarea: „/”: Value1 / Value2 După efectuarea operației, rezultatul este un număr zecimal.

Sursa

Comentarii

  • Mulțumesc Daniel, asta mi-a rezolvat problema. În peste 25 de ani de programare (dar cât mai puține chestii Microsoft), este prima dată când cred că am văzut o backslash făcând ceea ce în mod normal m-aș aștepta să facă o slash înainte. Oricum, va trebui să verific și alt cod care nu funcționa cum trebuie, probabil din cauza aceluiași lucru. –  > Por Nigel Stevens.
  • Nigel, dacă asta ți-a rezolvat problema, acceptă-l ca răspuns pentru a-i ajuta pe alții cu aceeași problemă în viitor. –  > Por Jon Crowell.
  • Acest lucru este vechi, dar am dat peste o problemă aparentă. Am pus ?5.52 în fereastra imediată, iar acesta returnează 3 în loc de 2. –  > Por Ron Rosenfeld.
  • @RonRosenfeld 5.5/2 = 2.75 Dacă rotunjești la un număr întreg, obții 3. Nu aș considera că este o problemă. dacă doriți să rotunjească în jos, de fapt la podea, utilizați int(5.5/2) –  > Por Daniel.
  • @Daniel Diviziunea întregi este definită în altă parte (inclusiv în VB, Wolfram) ca fiind o diviziune în care partea fracționară este eliminată, , nu este rotunjită. În plus, în VBA, se pare că operatorul rotunjește mai întâi fiecare valoare (folosind metoda round-to-even din VBA) și apoi împarte cele două valori. De exemplu, 5.52.5 –> 3, dar 5.5/2.5 –> 2.2 -.  > Por Ron Rosenfeld.
Jon Crowell

Bara oblică inversă este utilizată pentru împărțirea numerelor întregi, iar bara oblică înainte pentru împărțirea zecimală. Schimbați bară oblică înainte cu o bară oblică înapoi și ar trebui să obțineți rezultatul pe care îl așteptați.

http://www.functionx.com/vbaexcel/Lesson04.htm

Tags:,