Home Rejser Gæstebog Erics blog Kontakt
 

Home > Excel makroer & VBA > Test af en celles indhold

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.


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.