Find den næste tomme celle med Excel VBA
Når man laver makroer med Excels VBA, har man ofte brug for at kunne finde den næste tomme celle i en kolonne eller række. Det kan f.eks. være der, man skal sætte data ind i forlængelse af ældre data.
Her følger et eksempel på en funktion, der gør netop dette. Funktionen kaldes af en procedure eller en anden funktion og får i kaldet at vide, hvilken celle den skal tage udgangspunkt i.
Public Function FindNextTomme(ByVal rCell As Range) As Range
On Error GoTo ErrorHandle
With rCell
If Len(.Formula) = 0 Then
Set FindNextTomme = rCell
ElseIf Len(.Offset(1, 0).Formula) = 0 Then
Set FindNextTomme = .Offset(1, 0)
Else
Set FindNextTomme = .End(xlDown).Offset(1, 0)
End If
End With
Exit Function
ErrorHandle:
MsgBox Err.Description & ", Function FindNextTomme."
End Function
Funktionen kan selvfølgelig nemt ændres, så den i stedet for at søge nedad, søger mod venstre, højre eller opad. Det er et spørgsmål om at ændre på "Offset". (1,0) er rækken under, (0,1) er kolonnen til højre, (0,-1) er kolonnen til venstre og (-1,0) er rækken ovenover. Pas på at du f.eks. ikke siger kolonnen til venstre .Offset(0,-1), hvis du er i kolonne A - det vil udløse en fejl. Ud over Offset, skal man også ændre (xlDown) til (xlToRight), (xlToLeft) eller (xlUp).
Nedenstående lille procedure er et eksempel på, hvordan man kan kalde funktionen FindNextTomme. Den angiver celle A1 som startcelle. Hvis du vil prøvekøre, så kopier nedenstående procedure ("TestTomme") og funktionen ind i et VBA-modul. Udfyld nogle celler i kolonne A startende med celle A1. Kør derefter Sub TestTomme().
Sub TestTomme()
Dim rCell As Range
Set rCell = FindNextTomme(Range("A1"))
rCell.Value = "Udfyldt af makro"
MsgBox rCell.Address & " " & rCell.value
Set rCell = Nothing
End Sub
Find næste tomme celle som offset
I samme boldgade er følgende funktion. Den returnerer ikke første tomme celle som et Range objekt, men i stedet cellens offset (afstand) fra udgangscellen.
Public Function NextEmptyRow(ByVal rCell As Range) As Integer
On Error GoTo ErrorHandle
If Len(rCell.Formula) = 0 Then
NextEmptyRow = 0
ElseIf Len(rCell.Offset(1, 0).Formula) = 0 Then
NextEmptyRow = 1
Else
Set rCell = Range(rCell.Offset(0, 0), _
rCell.Offset(0, 0).End(xlDown))
NextEmptyRow = rCell.Rows.Count
End If
BeforeExit:
Set rCell = Nothing
Exit Function
ErrorHandle:
MsgBox Err.Description & ", Funktionen NextEmptyRow"
Resume BeforeExit
End Function
Hvis du vil prøvekøre funktionen, så kopier dén og følgende lille procedure ind i et VBA-modul og kør proceduren "TestOffset". Proceduren bruger celle A1 som udgangscelle, så skriv noget i denne og nogle flere celler.
Sub TestOffset()
Dim i As Integer
i = NextEmptyRow(Range("A1"))
MsgBox "Offset er " & i
End Sub
Relateret
|