Just nu i M3-nätverket
Gå till innehåll

Ahhhhhhh, jag blir tokig..


PeterPAN

Rekommendera Poster

Det blir något fel när jag skall läsa in värdet för KmManTid i koden nedan. Det registerar värdet 3, men värdet är 2,893. Om jag byter ut Y-värdet på KmAnsTid, så hämtar den rätt värde.

 

KmAnsTid= Worksheets(BLAD).Cells(X, Y_AnsKm).Value

KmManTid = Worksheets(BLAD).Cells(X, Y_ManAnsKm).Value

 

Den enda skillnaden som jag kan se är på skillnaden i typ, när jag skapar en bevakning på dessa.

 

KmAnsTid=Variant/Double

KmManTid=Integer

 

Kan någon hjälpa mig med detta?

/Peter

[inlägget ändrat 2007-03-21 15:27:45 av PeterPAN]

Länk till kommentar
Dela på andra webbplatser

Integer = heltal.

 

Byt typ till Double

 

Variant bör man undvika om man kan, bättre att specificera exakt vilken typ av variabel man ska ha. (liten prestandavinst)

 

Edit:

Fast är det en tid du läser in kanske det är ett Date-objekt du vill använda?

Asch, ta en titt i VBA hjälpen över de olika data-typernas egenskaper.

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

 

[inlägget ändrat 2007-03-21 16:05:32 av Monshi]

Länk till kommentar
Dela på andra webbplatser

Ok, men hur ändrar jag det?

 

Jag har deklarerat en massa variabler som "Integer", men det är bara den som står sist som blir ett heltal alla andra blir "Double". Så mitt problem löste sig när jag flyttade på KmManTid. Vad beror detta på?

 

Dim X, X2, Y, Y2, RAD, ANSTID, RAPTID, ANVTID, KOD2, BRIST, TONR, LONEART, STALL, GRUND, _
TID, ANTAL, OP, KmManTid, KmAnsTid, ToAnsAntal, ToManAntal, ToOpAntal, Y_AnstNr, Y_To, Y_StartDatum, _
Y_StoppDatum, Y_Op, Y_Lag, Y_StallTid, Y_AnsKm, Y_AnsQ, Y_QOk, Y_QKass, Y_Km, Y_KodTid, Y_ManQOk, _
Y_ManQKass, Y_ManStallTid, Y_ManAnsKm, Y_ManKm, Y_ManLon, Y_AnsLon, Y_TidKod As Integer

 

/P

 

Länk till kommentar
Dela på andra webbplatser

As Integer gäller bara för den variabel som står efter det sista kommatecknet (märkligt nog, man skulle ju tro att det gäller hela raden)

 

Dim X, X2, Y, Y2, RAD,.....As Integer

Skall altså skrivas

 

Dim X As Integer, X2 As Integer, Y As Integer, Y2 As Integer, RAD As Integer...

 

Logiskt och lättarbetat? Nej inte ett dugg. Men det är så regeln ser ut i VBA

 

*Tillägg*

 

alla andra blir "Double". Så mitt problem löste sig när jag flyttade på KmManTid. Vad beror detta på?

De blir egentligen inte "Double". De blir odeklarerad, dvs "Variant" som anpassar sig dynamiskt efter inehållet. Enkelt, smidigt och ibland riktigt ovärdeligt. Vist ger det prestandaförluster, men det är försumbart i VBA's långsamma värld. Däremot är det ett enkelt sett att skaffa sig svårfunna problem i vissa situationer så deklarera när du kan.

 

[inlägget ändrat 2007-03-22 18:20:48 av MH2]

Länk till kommentar
Dela på andra webbplatser

Vist ger det prestandaförluster, men det är försumbart i VBA's långsamma värld. Däremot är det ett enkelt sett att skaffa sig svårfunna problem i vissa situationer så deklarera när du kan.

Sant och sant.

 

Två saker man bör göra i VBA

1: Skriva in Option Explicit först i varje modul (finns ett val i VBA-editorns egenskaper som ger detta).

2: Deklarera variabler i den typ som man vill ha den så att man alltid vet att det i det man tror är en integere finns en integer.

 

Annars som sagt, svårfunna fel är lätta att skapa.

 

ja, en sak till man bör göra (som VBA heller inte kräver).

3: När man anropar funktioner i (andra) moduler, använd modulnamnet. Gör det SÅÅÅ mycket enklare att senare gå tillbaka och följa vad en programkod gör (har jag funnit).

Dvs

Har du en modul som heter mdlExec och där en funktion StartExec skriv (ex.v.)

Call mdlExec.StartExec

 

VBA är verkligen inget bra programmeringsspråk, alltför fria tyglar som inte borde vara fria.

 

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...