Just nu i M3-nätverket
Jump to content

If...Then problem i Excel


Mzungo

Recommended Posts

Jag har ställt ett enkelt If...Then villkor (om värdet i två specifika celler i två olika worksheets är identiska så kör koden.) Problemet är att Excel anser att värdena INTE är identiska trots att de är det och följaktligen går direkt till End if.

 

Jag har kopierat den lilla delen av koden till en annan fil och kört den där och det fungerar alldeles utmärkt, det är alltså bara i den fil jag arbetar med som det inte funkar.

 

Nån som känner igen problemet eller har en lösning?

 

 

 

Link to comment
Share on other sites

Svårt att svara utan mer detaljer. Hur ser din If-sats ut? Vad är det du försöker jämföra?

 

är värdena verkligen lika? Strängar? kanske med extra mellanslag eller liknande? Jämför du värdena i cellerna?

 

/T

 

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

 

Link to comment
Share on other sites

Tack för intresset!

 

Kodbiten ser ut så här:

 

For counter = 1 To Wtemp1.Range("aa1")
   If Wtemp2.Range("f2") = Wra.Range("d2") Then
   Wtemp2.Range("h2:i2").Copy Destination:=Wtemp3.Range("a(Wtemp3.Cells(1, 27)")
   Wtemp3.Cells(1, 27) = Wtemp3.Cells(1, 27) + 1
   Wtemp2.Range("e2:i2").Delete Shift:=xlUp
  End If
  Next counter

Kanske lite rörigt eftersom jag har många worksheets. I alla fall, cellerna f2 i Wtemp2 och d2 i Wra har båda värdet 1. Om jag ersätter någon av cellreferenserna med det absoluta värdet 1 så funkar det. Det funkar också om jag kopierar koden till en annan fil och döper worksheetsen där till samma namn. Problemet är att båda cellerna är relativa och kan anta andra värden så jag måste ha båda referenserna med.

 

/M

Kod-taggar infogade av moderator

 

[inlägget ändrat 2009-02-25 17:51:33 av Monshi]

Link to comment
Share on other sites

Två saker du kan testa

 

 

If Wtemp2.Range("f2").Value = Wra.Range("d2").Value Then

Eller

Dim iTemp1 as Integer, iTemp2 as Integer
iTemp1 = Wtemp2.Range("f2").Value
iTemp2 =  Wra.Range("d2").Value 
If temp1 = temp2 Then

 

vid problem av denna sort är det inte fel att bryta ned i så små delar som möjligt, i detta fall plocka ut värdena till variabler som man sedan kan undersöka. Kanske att i ena filen det inte står exakt värdet 1 utan 1,0001? Eller att i ena filen är cellerna formatera som text på ena bladet och tal på andra?

 

Samt denna adressering:

Wtemp3.Range("a(Wtemp3.Cells(1, 27)")

fungerar det? Ser mycket konstigt ut.

 

 

 

/T

 

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

 

Link to comment
Share on other sites

Då är bara frågan vad som egentligen finns i cellerna på det bråkande bladet.

 

Om du är lika nyfiken som jag, skapa två nya variabler av typen Variant och stoppa koden när de tilldelats. Då brukar man kunna snoka reda på lite mer detaljer.

 

 

/T

 

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

 

Link to comment
Share on other sites

Åh, nu är jag verkligen förvirrad...

 

Förstår inte riktigt vad du menar att jag ska göra efter att variablerna tilldelats. Hur snokar man? (är lite grön på vb.)

 

I alla fall: Din lösning funkade i så motto att excel accepterade att de två cellerna hade samma värde och körde koden. Sedan kopierade jag koden och ändrade referensen Wra.Range(”d2”) till d3 istället (d-kolumnen innehåller perioder som användaren själv får definiera (i det här fallet månad 1 till 12) och som man vill ha statistikrapporter för) och körde den koden efter den första (det finns förmodligen smidigare sätt än att köra samma kodsnutt tolv gånger, men det är en senare fråga.)

 

När jag gör det kör excel koden efter If...Then argumentet trots att värdena nu INTE är samma (jag har inte lagt in någon statistik för period 2.) Koden ser alltså ut såhär:

 

Row = 2
  For counter = 1 To Wtemp1.Range("aa1")
   Dim iTemp1 As Integer, iTemp2 As Integer
   iTemp1 = Wtemp2.Range("f2").Value
   iTemp2 = Wra.Range("d2").Value
   If temp1 = temp2 Then
   Wtemp2.Range("h2:i2").Copy Destination:=Wtemp3.Cells(Row, 1)
   Row = Row + 1
   Wtemp2.Range("e2:i2").Delete Shift:=xlUp
  End If
  Next counter

Row = 2
  For counter = 1 To Wtemp1.Range("aa1")
   iTemp1 = Wtemp2.Range("f2").Value
   iTemp2 = Wra.Range("d3").Value
   If temp1 = temp2 Then
   Wtemp2.Range("h2:i2").Copy Destination:=Wtemp3.Cells(Row, 3)
   Row = Row + 1
   Wtemp2.Range("e2:i2").Delete Shift:=xlUp
  End If
  Next counter

 

Resultatet blir att statistiken för period 4 (som är nästa jag lagt in data för hamnar i utdatakolumnen för period 2.) Jag testade att ersätta det andra kodstycket med följande:

 

Dim x As Variant, y As Variant
  x = Wtemp2.Range("f2").Value
  y = Wra.Range("d3").Value
  MsgBox "Värdet på x är " & x & Chr(13) & "Värdet på y är " & y & ""

 

Då returneras värdena x = 4 och y = 2. Ändå kör excel koden efter If...Then argumentet. Men fyra är ju inte lika med två, vad jag vet. Jag måste ha gjort något galet nånstans.

 

Förslag?

 

/M

 

 

Link to comment
Share on other sites

Inga på rak arm... eehhh, joooo . Skriv in raden

Option Explicit

på FÖRSTA raden i din modul. Då kommer du få en varning på din If-sats. Icke deklarerad variabel! Bocka för i inställningarna för VBA att variabler alltid ska deklareras så skriver VBA in kommandot ovan i varje modul.

 

Några saker:

 

1: Adressering - när man adresserar celler på bladet är det allt som oftast en bra idé att namnge dem. Att adressera direkt kan ge problem på sikt när bladet ändras.

 

2: När man tar Value från en tom cell kan man få nollvärden. Kanske det är ett problem? Ja, när man mellanlagrar i en Integer det vill säga.

 

3: variant. Tanken alltså att du sätter en brytpunkt i koden och sedan granskar de objekt som skapats, vilken typ av objekt.

 

 

/T

 

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

 

 

[inlägget ändrat 2009-02-27 14:02:26 av Monshi]

Link to comment
Share on other sites

Ok, det var uppenbarligen min bristande noggrannhet som var problemet. Har fortfarande ingen aning om varför det blev fel men sedan jag vederbörligen deklarerat alla variabler och objekt fungerar det som det ska. Tack för tipsen.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...