Avatar billede hubertus Seniormester
16. juni 2007 - 13:20 Der er 7 kommentarer og
2 løsninger

afrundingsproblem i forbindelse med skrivning tilbage i regnearke

Jeg bruger nedenstående kode til at indtaste info i et regneark. Jeg har et problem i rutinen der skriver data tilbage til regnearket. Når gas og el skrives i arket sker det fint med decimaler, men når tallet for vandforbruget skrives tilbage, så sker der en afrunding - selvom jeg bruger samme funktion til at gemme data med. Det er lidt frustrerende ikke at kunne gennemskue det - kan du?



Option Explicit
Dim dage, ny_gas, ny_el, ny_vand, gl_gas, gl_el, gl_vand, gas, el, vand As Integer

Private Sub CmdAnnuler_Click()
    Unload Me
End Sub

Private Sub UserForm_Activate()
 
    txtGas.Text = Round(hent_gl_data("gas", "S6"), 1)
    txtEl.Text = Round(hent_gl_data("el", "O6"), 1)
    txtVand.Text = Round(hent_gl_data("vand", "N6"), 1)
    txtantal_dage = 7
    txtDato.Text = Format(Now, "dd-mm-yy")
   
    gl_gas = txtGas.Text
    gl_el = txtEl.Text
    gl_vand = txtVand.Text
   
End Sub

Private Sub CmdGem_Click()
Dim a As Integer
'ResetArk
Application.ScreenUpdating = True

If txtGas.Value = "" Then
    MsgBox "Der skal angives en værdi for gas"
    txtGas.SetFocus
End If

If txtEl.Value = "" Then
    MsgBox "Der skal angives en værdi for el"
    txtEl.SetFocus
End If

If txtVand.Value = "" Then
    MsgBox "Der skal angives en værdi for vand"
    txtVand.SetFocus
End If

If txtantal_dage = "" Then
    MsgBox "Der skal angives en værdi for dage"
    txtantal_dage.SetFocus
End If

ny_gas = txtGas.Value
ny_el = txtEl.Value
ny_vand = txtVand.Value
dage = txtantal_dage.Value

'Beregn forbrug
gas = gl_gas + ((ny_gas - gl_gas) / dage * 7)
el = gl_el + ((ny_el - gl_el) / dage * 7)
vand = gl_vand + ((ny_vand - gl_vand) / dage * 7)

'gem nye data  (streng, celle, værdi, talformat)
a = gem_data("gas", "S65536", gas, "00000.0")
a = gem_data("el", "O65536", el, "0000.0")
a = gem_data("vand", "N65536", vand, "0000.0")

Unload Me

End Sub

Sub ResetArk()
    Dim x As Long
    x = ActiveSheet.UsedRange.Rows.Count
End Sub

Function hent_gl_data(streng, celle)
    Dim x As Integer
    Dim var1 As String
    x = ActiveSheet.UsedRange.Rows.Count
    Worksheets(streng).Select
    Range(celle).End(xlDown).Select
    var1 = ActiveCell.Address
    hent_gl_data = CSng(Range(var1).Value)
End Function

Function gem_data(streng, celle, værdi, talformat) ' den er ikke korrekt
  Dim x As Integer, var1 As String
 
  x = ActiveSheet.UsedRange.Rows.Count
  Worksheets(streng).Select
  Sheets(streng).Range(celle).End(xlUp).Select
  Range(celle).End(xlUp).Select  ' ok hertil
  var1 = ActiveCell.Address
 
  ' sætter formatet for aktiv celle
  ActiveCell.Offset(1, 0).Activate
  Range(var1).NumberFormat = talformat
  ActiveCell.Value = værdi * 1
'  ActiveCell.Value = CSng(ActiveCell.Value)


End Function
Avatar billede kabbak Professor
16. juni 2007 - 16:19 #1
Funktionen kan kortes lidt ned, sådan;
Function gem_data(streng, celle, værdi, talformat)    ' den er ikke korrekt
    Worksheets(streng).Range(celle).End(xlUp).Offset(1, 0).NumberFormat = talformat
    Worksheets(streng).Range(celle).End(xlUp).Offset(1, 0).Value = værdi * 1
End Function


prøv den
Avatar billede kabbak Professor
16. juni 2007 - 16:46 #2
du har fejlen i din Dim

Dim dage, ny_gas, ny_el, ny_vand, gl_gas, gl_el, gl_vand, gas, el, vand As Integer


vand As Integer ,er et heltal
Avatar billede kabbak Professor
16. juni 2007 - 16:48 #3
når du dimmer på denne måde
Dim dage, ny_gas, ny_el, ny_vand, gl_gas, gl_el, gl_vand, gas, el, vand As Integer
er det kun den sidste der er integer, jeg mener de andre bliver variant, når du ikke skriver noget.
Avatar billede hubertus Seniormester
16. juni 2007 - 18:54 #4
Hej kabbak
Din udgave af funktionen virker fint - der lærte jeg noget nyt :o)
hvorfor er vand et heltal? jeg mente da, at alle variablerne er integer,  når de erklæres på denne måde - er det ikke korrekt?
Avatar billede hubertus Seniormester
16. juni 2007 - 19:02 #5
Jeg har prøvet at fjerne as integer, og så virker den også som den skal, jeg kan blot ikke se logikken i det - kan du kaste lys over sagen?
Avatar billede kabbak Professor
16. juni 2007 - 20:38 #6
Hvis du vil være sikker på at dimme rigtig, så er det sådan:

Dim dage as integer, ny_gas as double, ny_el as double, ny_vand as double, gl_gas as double, gl_el as double, gl_vand as double, gas as double, el as double, vand As double
Avatar billede hubertus Seniormester
17. juni 2007 - 12:21 #7
Hej Kabbak - der er ok - jeg mente blot at når den var kommasepareret, så gjalt det hele linien - men sådan er det tilsyneladende ikke. Anyway din indsats løste mit problem, og det er jeg glad for - tak for det. :-) ha en fortsat god søndag.
Avatar billede kabbak Professor
17. juni 2007 - 13:33 #8
tak og i lige måde ;-))
Avatar billede kabbak Professor
18. juni 2007 - 16:49 #9
husk at lukke
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester