RSS

Dobbeltklik-makro som alternativ til hyperlinks i Excel

Denne side beskriver, hvordan dobbeltklik på en celle kan erstatte hyperlinks til at navigere mellem celler, faneblade og regneark.

Hyperlinks er smarte, hvis man har store og uoverskuelige regneark, hvor man gerne vil kunne hoppe fra ét sted til et andet ved at klikke på et link.

Men hyperlinks har også ulemper. Skal man lave mange, tager det lang tid, og indsætter man en række eller en kolonne i destinationsarket, går der koks i det, medmindre hyperlinket er til et navngivet område.

Herunder beskrives, hvordan man ved at dobbeltklikke på en celle kan hoppe til en anden celle med identisk indhold, skifte faneblad eller aktivere/åbne et andet regneark - ganske som med hyperlinks.

Fidusen er at benytte sig af fanebladets eller projektmappens BeforeDoubleClick-event, der kører helt automatisk, når man dobbeltklikker. Mere herom senere.

Du kan markere makroerne med musen, kopiere dem (CTRL+C) og sætte dem ind (CTRL+V) i Excels VBA-editor. Hvis din skærm er lille, kan nogle af kodelinjerne være ombrudte, men når du sætter det kopierede ind i et VBA-modul, er linjeskiftene OK.

Du kan også downloade en zipkomprimeret fil med 3 regneark med eksempler på nedenstående. De 2 af regnearkene, Test1 og Test2, indeholder ingen makroer og er bare med for at vise, hvordan de kan åbnes ved dobbeltklik på en celle.

Hop til celle med identisk indhold

Forestil dig, at du har et regneark med 20 faneblade om forskellige varer, og at kolonne E på de første 19 indeholder firmanavne på leverandører, mens det sidste er en alfabetisk oversigt over samtlige leverandører incl. kontaktinformation.

Når du klikker på et leverandørnavn i et af de første 19 faneblade, skal cursoren automatisk hoppe til den rette celle i fanebladet med oversigten og kontaktinformation.

Til det formål kan man bruge hyperlinks, men hvis man i fanebladet med kontaktinformation indsætter en række med en ny leverandør, går der kuk i hyperlinksene, medmindre de er til navngivne celler.

Dette kan løses meget nemmere ved at bruge fanebladenes eller projektmappens BeforeDoubleClick-event og tilføje lidt kode. Højreklik på fanen forneden (fx "Ark1"), vælg "Vis programkode" og indsæt følgende:


Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)

'Hvis der ikke står noget i cellen, eller hvis 
'det ikke er kolonne E, forlader vi proceduren.
If Len(Target.Value) = 0 Or Target.Column <> 5 Then Exit Sub

'Nu kalder vi proceduren FindName og lader
'cellens indhold (Target.Value) følge med.
Module1.FindName Target.Value

End Sub

Project Explorer

I det tænkte eksempel skal koden indsættes i kodearket for alle 19 faneblade, og er man doven, nøjes man i stedet med at indsætte følgende i projektmappens (regnearket som indeholder fanebladene) kodeark, som kører, uanset hvilket faneblad der dobbeltklikkes på.

Det har også den fordel, at det også virker for evt. nye faneblade, som man tilføjer senere.

Projektmappens kodeark finder du ved at åbne VBA-editoren (ALT+F11) og åbne Project Explorer under "View" (hvis den da ikke er åben). Projektmappen er "ThisWorkbook".


Private Sub Workbook_SheetBeforeDoubleClick _
(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)

If Len(Target.Value) = 0 Then Exit Sub

'Hvis fanebladet hedder "Contact Data" hopper vi ud
If ActiveSheet.Name = "Contact Data" Then Exit Sub

'Hvis der ikke er klikket i kolonne E
If Target.Column <> 5 Then exit Sub

'Kalder proceduren FindName i Module1
Module1.FindName Target.Value

End Sub

Nu er det tid at indsætte et modul med den makro, som finder cellen med firmanavnet i fanebladet "Contact Data". Proceduren ser således ud:


Sub FindName(ByVal sName As String)
'Finder og aktiverer først fundne
'celle med samme indhold som cellen
'der blev dobbeltklikket på.
'sName i procedurekaldet er
'cellens indhold.
Dim rColumn As Range
Dim rFind As Range

'Aktivér fanebladet med kontaktinfo
Worksheets("Contact Data").Activate

'Ranget rColumn sættes = kolonne A
Set rColumn = Columns("A:A")

'Søg i kolonne A
Set rFind = rColumn.Find(sName)

'Hvis cellen er fundet, aktiveres den
If Not rFind Is Nothing Then
   rFind.Activate
Else
   'Ellers aktiveres celle A1
   Range("A1").Activate
End If

Set rColumn = Nothing
Set rFind = Nothing

End Sub

Hop til et andet faneblad

Den er helt enkel - makroen hopper til det faneblad, hvis navn står i cellen, der dobbeltklikkes på. I eksemplet her stilles dog som betingelse, at det skal være dobbeltklik i kolonne C. Her er det kode til et enkelt faneblad:


Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)

'Hvis cellen er tom eller ikke er i kolonne 3, hopper vi ud.
If Len(Target.Value) = 0 or Target.Column <> 3 Then Exit Sub

On Error Resume Next
Worksheets(Target.Value).Activate

End Sub

Vi er nødt til at skrive "On Error Resume Next", da der udløses en fejl, hvis cellens indhold ikke matcher navnet på et faneblad.

Hop til eller åbn et andet regneark

Dobbeltklik på en celle kan også hoppe til et andet regneark, hvis cellen indeholder navnet på regnearket. Eksemplet herunder kræver, at cellen, der dobbeltklikkes på, befinder sig i kolonne A, og at det andet regneark ligger i samme katalog.

Cellen skal indeholde regnearkets "fornavn", som i dette tilfælde er "Test1". Filnavnets endelse (fx .xls) skal ikke med.

Som før skal vi skrive noget i fanebladets BeforeDoubleClick event, og så skal vi have et par makroer i Module1. Først fanebladets BeforeDoubleClick event:


Private Sub Worksheet_BeforeDoubleClick _
(ByVal Target As Range, Cancel As Boolean)

'Hvis cellen er tom eller ikke er i kolonne 1 (A), hopper vi ud.
If Len(Target.Value) = 0 Or Target.Column <> 1 Then Exit Sub

'Kalder proceduren "ActivateWorkbook" I Module1
Module1.ActivateWorkbook Target.Value

End Sub

I Module1 skal vi have en procedure og en function. Først proceduren:


Sub ActivateWorkbook(ByVal sWbName As String)

On Error GoTo ErrorHandle

'Kalder funktionen BookIsOpen, som tjekker, om
'regnearket er åbent.
If BookIsOpen(sWbName) Then
   'Aktiver det hvis åbent
   Workbooks(sWbName).Activate
Else
   'Hvis det ikke er åbent, tjekker vi, om det
   'findes i samme katalog som dette regneark.
   'Hvis det gør, åbner vi det.
   If Len(Dir(ThisWorkbook.Path & "\" & sWbName & ".xl*")) > 0 Then
      Workbooks.Open (sWbName)
   Else
      MsgBox "Workbook " & sWbName & " findes ikke i " & _
      ThisWorkbook.Path
   End If
End If

Exit Sub
ErrorHandle:
MsgBox Err.Description & " Procedure ActivateWorkbook, Module1"
End Sub

Og så funktionen, som tjekker, om regnearket er åbent:


Function BookIsOpen(sWbName As String) As Boolean
'Hvis regnearket ikke er åbent, vil det følgende
'give en fejl, og derfor skriver vi
'"On Error Resume Next"

On Error Resume Next

BookIsOpen = Len(Workbooks(sWbName).Name)

End Function

Det var det: Eksempler på hvordan man kan "hoppe" eller navigere i og mellem regneark ved at dobbeltklikke på en celle.

Der er mange andre muligheder - cellen, man dobbeltklikker på, kunne fx blive rød, gul eller blå, eller teksten kunne formateres på en bestemt måde. Det kan egentlig koges ned til, at bestemte hændelser - Events - i et regneark automatisk kan køre makroer, uden at man skal klikke på knapper eller menuer.

Der er andre Events tilknyttet et regneark. Du kan se hvilke, hvis du fx højreklikker på et faneblads fane og vælger "Vis programkode". Så åbner VBA-editoren, og du klikker på ComboBoxen foroven til venstre, hvor der står (General) og vælger "Worksheet".

Relateret