RSS

Test af en celles indhold

Når man arbejder med VBA (makroer) i Excel, har man ofte brug for at teste eller kontrollere en celles indhold: Er cellen tom, indeholder den et tal, en tekst, en formel, en fejl, en dato - eller har cellen en kommentar, eller er den betinget formateret?

Og hvordan gør man så lige det?

Herunder følger nogle eksempler. Du kan markere koden her på siden og kopiere den (CTRL + C) og sætte den ind (CTRL + V) i et VBA modul og så køre den. I eksemplet bruges celle A1 i det aktive regneark, men en hvilken som helst celle eller større range kan bruges.

Hvis du ser denne side på en lille skærm, kan nogle af kodelinjerne se "knækkede" ud, men linjeskiftene er okay, når du kopierer koden ind i et VBA-modul.


Sub CelleTjek()
'Eksempler på kontrol af celleværdier

Dim rCell As Range
Dim sMyString As String

On Error GoTo ErrorHandle

'Vi sætter vores range-variabel
'til celle A1 i det aktive ark.
Set rCell = Range("A1")

'Den følgende kontrol tester, om en celle er tom.
'Det gør den ved at se på længden af det, som måske
'står i cellen. Derfor bruges egenskaben "Formula"
'i stedet for "Value". Hvis man brugte "Value",
'ville den sige, at cellen er tom, selvom der
'måske er ét eller flere mellemrum/blanke.
If Len(rCell.Formula) = 0 Then
   MsgBox "Celle " & rCell.Address & " er tom."
End If

'Samme kontrol kan laves med VBA-funktionen IsEmpty.
'IsEmpty returnerer True, hvis cellen er tom.
'Det er en smartere kontrol end ovenfor, når det
'drejer sig om en celles indhold, men ikke hvis
'der var tale om f.eks. en streng-variabel.
If IsEmpty(rCell) Then
   MsgBox "Celle " & rCell.Address & " er tom."
End If

'Den følgende kontrol tjekker, om cellen indeholder
'et tal - altså om værdien er numerisk.
If IsNumeric(rCell.Value) Then
   MsgBox "Celle " & rCell.Address & " er en talværdi."
End If

'Denne kontrol undersøger, om en celle indeholder en 
'fejlværdi. Det kan f.eks. være division med nul eller
'en formel, som indeholder en ikke eksisterende
'henvisning (f.eks. navn).
If IsError(rCell.Value) Then
   MsgBox "Celle " & rCell.Address & " indeholder en fejl."
End If

'Denne kontrol undersøger, om en celle
'(eller et udtryk) indeholder en dato.
If IsDate(rCell.Value) Then
   MsgBox "Celle " & rCell.Address & " indeholder en dato."
End If

'Den følgende kontrol tjekker, om en celle indeholder tekst.
'Hvis det ikke er en numerisk værdi og hvis cellen ikke
'indeholder en fejl som f.eks. division med nul, regner
'vi med, at det er en tekst af datatypen String. Datoer kan
'også opfattes som tekst, så hvis man vil have dem sorteret
'fra, må man indføje "IsDate(rCell.Value) = False" i
'sin kontrol.
If IsNumeric(rCell.Value) = False And _
IsError(rCell.Value) = False Then
   'VBA-funktionen Trim fjerner blanke (mellemrum) foran og
   'bagefter. Hvis indholdets længde derefter er 0, har
   'indholdet været lutter blanke/mellemrum.
   sMyString = Trim(rCell.Value)
   If Len(sMyString) > 0 Then
      MsgBox "Celle " & rCell.Address & " er en tekst med " & _
      Len(sMyString) & " karakterer."
   Else
      MsgBox "Cellens indhold er blanke mellemrum"
   End If
End If

'Kontrollerer om en celle har betinget formatering
If rCell.FormatConditions.Count > 0 Then
   MsgBox rCell.Address & " har betinget formatering."
Else
   MsgBox "Ikke betinget formatering."
End If

'Undersøger om en celle indeholder en formel.
If rCell.HasFormula Then
   MsgBox "Celle " & rCell.Address & " indeholder en formel."
Else
   MsgBox "Cellen indeholder ikke en formel."
End If

'Kontrollerer om cellen har en kommentar.
If rCell.Comment Is Nothing Then
   'Hvis ikke, tilføjes en kommentar.
   With rCell.AddComment
      .Visible = False
      .Text "Kommentar tilføjet " & Date
   End With
Else
   MsgBox rCell.Address & " har allerede en kommentar."
End If

BeforeExit:
Set rCell = Nothing
Exit Sub
ErrorHandle:
MsgBox Err.Description & " Fejl i procedure CelleTjek."
Resume BeforeExit
End Sub

Om celler

I koden har ovenfor jeg mange gange skrevet "rCell.Value". Egentlig er det unødvendigt, fordi "Value" er en celles default property, så jeg kunne med samme resultat nøjes med at skrive "rCell".

Det synes jeg imidlertid er lidt sjusket, og det går ud over læseligheden.

Relateret