Avatar billede john2010 Praktikant
01. april 2011 - 10:43 Der er 19 kommentarer

VB-problem med #value

Hej,

Jeg har lavet følgende script:
For a = 5 To 123
    If Cells(a, 16) > Cells(a, 18) Then
        Cells(a, 19) = "0"
    Else
        Cells(a, 19) = Cells(a, 19) + 1
    End If
'
' Hvis kolonne 26 (25) er 1 (rengøres), sættes aktivitet lig med null
'
    If Cells(a, 26) = 1 Then
      Cells(a, 19) = "0"
    End If
Next a

Nu er problemet, at nogle af de celle som jeg beregner på til tide indeholder værdien #VALUE!

Fejlen opstår pga. der er nogle bagvedliggende data, som til tider kan have et forkert indhold. Når en celle indeholder #VALUE stopper scriptet uhensigtsmæssigt.

Jeg vil gerne have fundet en løsning, så scriptet tager højde for at en celle kan have en forkert værdi, så skal den bare sætte værdien a = 0

Mvh
John
Avatar billede Tryphon Nybegynder
01. april 2011 - 11:23 #1
Du kunne evt. lave en  error trap, der kunne se sådan ud

Før den linie, der går i fejl, skriver du

On Error goto Fejlhaandtering

I bunden af din kode lige før end function skriver du

Exit Function
Fejlhaandtering:
select case err
  case (her skriver du nummeret på den fejl, der opstår)
    a=0
    resume next
end select

resume next får koden til at fortsætte med kodelinjen umiddelbart efter den, der går i fejl.

Du kan evt. nulstille error trappen ved at skriv "On error goto 0".
Avatar billede Mads Larsen Nybegynder
01. april 2011 - 11:26 #2
Ville mene en Isnumeric kunne bruges til at tjekke om det er tal.

For derefter at kunne bruge >
Avatar billede john2010 Praktikant
01. april 2011 - 11:32 #3
hej Tryphon

Det ser ok ud, men hvilket fejlnummer har en fejl  #VALUE!

Mvh
John
Avatar billede john2010 Praktikant
01. april 2011 - 11:32 #4
Hej IT-GuFFE,

Hvordan tænker du lige at bruge lsnumeric ?

Mvh
John
Avatar billede Tryphon Nybegynder
01. april 2011 - 11:38 #5
Det ser du, når du kører din kode crasher. Der kommer en dialog boks op der f.eks. siger "Run-time error '13': Type Mismatch. Fejlmummeret er så 13.

IsNumeric vil nok kunne bruges, men du sætter a = "0", hvilket indikerer, at dine tal står som string typer. Det gør så, at IsNumeric vil være ulogisk.
Avatar billede Mads Larsen Nybegynder
01. april 2011 - 11:53 #6
If IsNumeric(Cells(a, 16)) = True And IsNumeric(Cells(a, 18)) = True Then
        If Cells(a, 16) > Cells(a, 18) Then
            Cells(a, 19) = "0"
        Else
            Cells(a, 19) = Cells(a, 19) + 1
        End If
    Else
        Cells(a, 19) = "Hvad det nu skal være"
End If
Avatar billede Mads Larsen Nybegynder
01. april 2011 - 11:58 #7
IsNumeric ser ud til godt at kunne klare en string

If IsNumeric(Cells(1, 1)) = True Then
MsgBox ("True")
Else
MsgBox ("False")
End If

A1 står der 0 og formateret som tekst
Avatar billede Tryphon Nybegynder
01. april 2011 - 12:08 #8
IsNumeric kan godt klare tal formatteret som tekst, men man har ikke 100% styr på sine datatyper.

Spørgsmålet er, om hele kolonnen ikke er formatteret som tal, og det ville være mere korrekt at skrive Cells(a, 19) = 0 (uden anførselstegn).

Som så ofte før er der flere løsninger på samme problem. IsNumeric er fuldt ud lige så god som en Error Trap. Det er en smagssag.
Avatar billede john2010 Praktikant
01. april 2011 - 12:26 #9
Hej IT-Guffe,
Jeg kan ikke rigtigt få din scrit implementeret i mit. Hvor vil du sætte det ind henne?

Mvh
John
Avatar billede Mads Larsen Nybegynder
01. april 2011 - 12:29 #10
For a = 5 To 123
    If IsNumeric(Cells(a, 16)) = True And IsNumeric(Cells(a, 18)) = True Then
        If Cells(a, 16) > Cells(a, 18) Then
            Cells(a, 19) = 0
        Else
            Cells(a, 19) = Cells(a, 19) + 1
        End If
    Else
        Cells(a, 19) = 0
    End If
'
' Hvis kolonne 26 (25) er 1 (rengøres), sættes aktivitet lig med null
'
    If Cells(a, 26) = 1 Then
      Cells(a, 19) = 0
    End If
Next a

Men forstår ikke helt hvorfor du vil have a til at være 0? så vil den da bare køre i ring? :-)
Avatar billede john2010 Praktikant
01. april 2011 - 12:50 #11
Hej IT-GuFFE,

Når jeg implementerer det du skriver, kommer den med en compile error: "Next without For". Det er på den sidste "Next a" fejlen kommer.

Det du skriver med 0 - hvad tænker du lige på? Mit udgagspunkt er rigtigt (testet) og giver det korrekte resultat. Det som det skal bruges til, er at se på, om der har været aktivitet i et rum ved hjælp af en rumføler. Hvis der har været aktivitet skal der lægges 1 til.

Mvh
John.
Avatar billede Mads Larsen Nybegynder
01. april 2011 - 13:10 #12
Jeg vil gerne have fundet en løsning, så scriptet tager højde for at en celle kan have en forkert værdi, så skal den bare sætte værdien a = 0

Mvh
John


Det var mere det jeg tænkte på.

Men den fejl fik du ikke før? jeg får ingen fejl når jeg kører scriptet..
Avatar billede Mads Larsen Nybegynder
01. april 2011 - 13:11 #13
Har du sat det ind som der står der, eller har du lavet ændringer? :)
Avatar billede john2010 Praktikant
01. april 2011 - 13:32 #14
Hele rutinen ser således ud:
Sub optaeldage()
'
' Tager kolonne U og lægger 1 til (U = U + T)
'
    Sheets("Punkter").Select
    Range("A1").Select

For a = 5 To 123
   
   
'    If IsNumeric(Cells(a, 16)) = True Then
'        If Cells(a, 16) > Cells(a, 18) Then
'            Cells(a, 19) = Cells(a, 19) + 1
'        Else
'            Cells(a, 19) = "0"
'        End If
'        Else
'            Cells(a, 19) = "0"
           

If IsNumeric(Cells(a, 16)) = True And IsNumeric(Cells(a, 18)) = True Then
   
    If Cells(a, 16) > Cells(a, 18) Then
      Cells(a, 19) = 0
  Else
      Cells(a, 19) = Cells(a, 19) + 1
  End If
  Else
  Cells(a, 19) = 0
 
'
' Hvis kolonne 26 (25) er 1 (rengøres), sættes aktivitet lig med null
'
    If Cells(a, 26) = 1 Then
      Cells(a, 19) = "0"
    End If
Next a
End Sub
Avatar billede Mads Larsen Nybegynder
01. april 2011 - 13:41 #15
Sub optaeldage()
'
' Tager kolonne U og lægger 1 til (U = U + T)
'
    Sheets("Punkter").Select
    Range("A1").Select

For a = 5 To 123
   
   
'    If IsNumeric(Cells(a, 16)) = True Then
'        If Cells(a, 16) > Cells(a, 18) Then
'            Cells(a, 19) = Cells(a, 19) + 1
'        Else
'            Cells(a, 19) = "0"
'        End If
'        Else
'            Cells(a, 19) = "0"
           

If IsNumeric(Cells(a, 16)) = True And IsNumeric(Cells(a, 18)) = True Then
   
    If Cells(a, 16) > Cells(a, 18) Then
      Cells(a, 19) = 0
          Else
      Cells(a, 19) = Cells(a, 19) + 1
    End If
  Else
  Cells(a, 19) = 0
End If '<--------- ændret den blev aldrig lukket
'
' Hvis kolonne 26 (25) er 1 (rengøres), sættes aktivitet lig med null
'
    If Cells(a, 26) = 1 Then
      Cells(a, 19) = "0"
    End If
Next a
End Sub
Avatar billede john2010 Praktikant
01. april 2011 - 14:28 #16
Hej,
Det er som om at der er noget galt, for nu nulstiller den alle felterne hele tiden (kolonne)
Avatar billede john2010 Praktikant
01. april 2011 - 14:35 #17
Hej,

Der er et eller andet galt, for kolonne 19 bliver nu sat til 0 hele tiden og ikke opsummeret som den oprindeligt gjorde.

jeg tror at der må være en fejl i fejlhåndteringen?
Avatar billede Mads Larsen Nybegynder
01. april 2011 - 14:40 #18
står der altid noget i kolonne 16 og 18? ellers vil den jo være "false", og så skrive 0.
Avatar billede excelent Ekspert
01. april 2011 - 17:48 #19
Du kunne jo starte med at slette alle celler med #VALUE!!

Range("P5:Z123").SpecialCells(xlCellTypeFormulas, 16).ClearContents
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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