Excel-VBA: Autodetektiv

Hallo,

ich nutze sehr häufig die Detektivfunktion „Spur zum Vorgänger“, um mir schnell einen Überblick über Verweise auf andere Zellen in meinen Formeln zu verschaffen.

Um nicht in jeder Zelle erneut die Schaltfläche in der Symbolleiste betätigen zu müssen, war meine Idee, die Funktion bei jeder Zellmarkierung per VBA auszulösen (auf Worksheet_SelectionChange-Ereignis reagieren).

Das habe ich bereits in folgendem funktionierenden Code umgesetzt:

Dim DetektivEin As Boolean

Sub AutoDetektivEinAusSchalten()
DetektivEin = Not DetektivEin
If DetektivEin Then
 MsgBox "Detektiv permanent aktiviert!"
Else
 ActiveSheet.ClearArrows
 MsgBox "Detektiv deaktiviert!"
End If
End Sub


Private Sub Worksheet\_SelectionChange(ByVal Target As Range)
If DetektivEin Then
 If ActiveCell.HasFormula Then
 ActiveSheet.ClearArrows
 Target.ShowPrecedents
 End If
End If
End Sub

Dumm ist allerdings, dass man den Code für jedes Tabellenblatt, in dem man die Funktion nutzen möchte wiederholen muß.

Ich würde gerne den „Autodetektiv“ in die „personl.xls“ integrieren, so dass die Funkionalität für alle geöffneten Arbeitsmappen zur Verfügung steht.
Nur mein Problem dabei ist, wie kann ich das Ereignis „Worksheet_SelectionChange“ jedes Tabellenblattes der geöffneten Arbeitsmappen in der externen Datei „personl.xls“ abfangen und entsprechend darauf reagieren.
Mit Klassenmodulen müsste da doch was zu machen sein.
Kann mir jemand Tips zur Umsetzung geben?

Viele Dank und viele Grüße, tester

Hallo tester,

ich nutze sehr häufig die Detektivfunktion „Spur zum
Vorgänger“, um mir schnell einen Überblick über Verweise auf
andere Zellen in meinen Formeln zu verschaffen.

ich habe das mal benutzt, die Pfeile innerhalb des Blattes sind klar, aber wenn es zu einem anderen Blatt führt erscheint nur ein Symbol. Wie kriege ich heraus welches andere Blatt gemeint ist? Danke

Um nicht in jeder Zelle erneut die Schaltfläche in der
Symbolleiste betätigen zu müssen, war meine Idee, die Funktion
bei jeder Zellmarkierung per VBA auszulösen (auf
Worksheet_SelectionChange-Ereignis reagieren).
Dumm ist allerdings, dass man den Code für jedes
Tabellenblatt, in dem man die Funktion nutzen möchte
wiederholen muß.

Ich würde gerne den „Autodetektiv“ in die „personl.xls“
integrieren, so dass die Funkionalität für alle geöffneten
Arbeitsmappen zur Verfügung steht.
Nur mein Problem dabei ist, wie kann ich das Ereignis
„Worksheet_SelectionChange“ jedes Tabellenblattes der
geöffneten Arbeitsmappen in der externen Datei „personl.xls“
abfangen und entsprechend darauf reagieren.

Schreibe den Code doch in „Diese Arbeitsmappe“ und nimm
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
End Sub

Mit Klassenmodulen müsste da doch was zu machen sein.
Kann mir jemand Tips zur Umsetzung geben?

Nachfolgend ist meine personl.xls. Sie setzt in jeder geöffneten Datei den Verweis auf MX Forms2.0 weil ich en Verweis in jeder Datei brauche damit mein Makro was Tabellenbereiche für Beiträge hier formatiert nicht funktioniert, weiß grad nicht wegen was für einem Befehl, jedenfalls braucht der den Verweis auf Forms 2.0.
Weiterhin wird in jeder Datei die Berechnung auf automatisch gestellt, weil warum auch immer , die Berechnung gelegentlich auf manuell stand.
Bitte keine Rückfragen zum Klassenmodul an sich, hat mir jemand gebastelt, ich kenne mich da nicht aus.

Mit dem Code kannst du sicher erreichen dass in jeder Datei in Dieser Arbeitsmappe dann

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
End Sub

enthalten ist. Problem ist, wenn schon Workbook_SheetSelectionChange vorhanden ist, wird es schwierig zu entscheiden wo im Code eingefügt werden soll, könnten ja If Abfragen usw am Anfang stehen usw.
Weiteres Problem könnte sein, (ein paar Threads tiefer, mit dem Betreff „…Fortschrittsanzeige“, die beiden obersten Postings von mir), dass man zwar zur Laufzeit Code eintragen kann, dass dieser aber nicht kompiliert wird.
In der dortigen Datei trage ich zwar Code im Codebereich von Tabelle2 ein, aber er wird erst wirksam wenn ich manuell kurz in den Entwurfsmodus und zurück gehe. Ich mutmaße en Problem der „late binding“ aber das ist nur ein Wort für mich.
Bei eingebauten Ereignisprozeduren wie Workbook_SheetSelectionChange kann evtl. dieses Problem nicht auftreten. Rückmeldung bzw. funktionierender Code für die personal.xls wäre sehr nett.

Beim nachfolgenden Code ist es wichtig dass das Klassenmodul exakt so benannt wird.

Gruß
Reinhard

Diese Arbeitsmappe:

Option Explicit
Private objApplication As clsApplication
Private Sub Workbook\_Open()
 'Application.Caption = "Reinhard"
 Set objApplication = New clsApplication
 Set objApplication.prpApplication = Application
End Sub

Klassenodul: clsApplication

Option Explicit

Private WithEvents mobjApplication As Application

Public Property Set prpApplication(objApplication As Application)
 Set mobjApplication = objApplication
End Property

Private Sub mobjApplication\_NewWorkbook(ByVal Wb As Workbook)
 Call prcAddReverence(Wb)
End Sub

Private Sub mobjApplication\_WorkbookOpen(ByVal Wb As Workbook)
 Call prcAddReverence(Wb)
End Sub



Modul1:

Option Explicit

Private Const FM20\_GUID = "{0D452EE1-E08F-101A-852E-02608C4D0BB4}"

Public Sub prcAddReverence(objWorkbook As Workbook)
 Dim intIndex As Integer
 Dim blnFound As Boolean
 On Error GoTo err\_exit
 With objWorkbook.VBProject.References
 For intIndex = 1 To .Count
 If .Item(intIndex).GUID = FM20\_GUID Then
 If .Item(intIndex).IsBroken Then
 .Remove .Item(intIndex)
 Else
 blnFound = True
 End If
 End If
 Next
 If Not blnFound Then \_
 .AddFromGuid GUID:=FM20\_GUID, Major:=2, Minor:=0
 End With
 objWorkbook.Application.Calculation = xlCalculationAutomatic
 Exit Sub
err\_exit:
 MsgBox "Fehler " & CStr(Err.Number) & vbLf & \_
 vbLf & Err.Description, vbCritical, "Fehler"
End Sub

Hallo,

ich habe das mal benutzt, die Pfeile innerhalb des Blattes
sind klar, aber wenn es zu einem anderen Blatt führt erscheint
nur ein Symbol. Wie kriege ich heraus welches andere Blatt
gemeint ist? Danke

Doppelklick auf die schwarze Verbindungslinie. Dann öffnet sich das Fenster „Gehe zu“ und man kann von dort zu der verknüpften Zelle bzw. zum verknüpften Bereich springen. Bei Verknüpfungen zu externen Dateien geht dies nur, wenn die entsprechende Datei geöffnet ist.

Danke für den Rest der Antwort. Muß mich damit noch mal näher beschäftigen und melde mich dann, obs geklappt hat.

tester

Doppelklick auf die schwarze Verbindungslinie. Dann öffnet
sich das Fenster „Gehe zu“ und man kann von dort zu der
verknüpften Zelle bzw. zum verknüpften Bereich springen. Bei
Verknüpfungen zu externen Dateien geht dies nur, wenn die
entsprechende Datei geöffnet ist.

Arrgs, auf die Linie und dann auch noch doppelt. Habe ich wohl immer knapp vorbei geklickt weil ich mehr auf das Symbol klickte in allen Varianten.
Naja , knapp daneben is auch vorbei.
Danke
Reinhard

habs hinbekommen
Hallo Reinhard,

hab Deinen Code ein wenig angepasst und es hat geklappt. Da fallen mir doch gleich noch viele andere schöne Sachen ein, die man ähnlich realisieren kann…
Mit verschiedenen Selection-Change-Ereignissen gibt es keine Probleme. Diese werden in der Reihenfolge Worksheet, Workbook und Klassenmodul abgearbeitet. Also wird in Dateien evtl. vorhandener Code nicht beeinflusst. Die einzelnen Ereignisse beeinflussen sich nicht.

Zu Deiner Info hier noch der fertige Code. Habe ihn in eine extra xla-Datei gepackt und als Addin geladen, sonst wäre die personl.xls zu unübersichtlich und überfüllt geworden :

Viele Grüße, tester

Klassenmodul „clsApplication“:

Private WithEvents mobjApplication As Application
Private ADetAn As Boolean
 
Public Property Set prpApplication(objapplication As Application)
 Set mobjApplication = objapplication
End Property
 
Public Property Let Autodetektiv(eingeschaltet As Boolean)
ADetAn = eingeschaltet
End Property
 
Public Property Get Autodetektiv() As Boolean
Autodetektiv = ADetAn
End Property
 
Private Sub mobjApplication\_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'Reaktion bei Auswahländerung
If ADetAn Then
 If Target.HasFormula Then
 ActiveSheet.ClearArrows
 Target.ShowPrecedents
 End If
End If
End Sub

„Diese Arbeitsmappe“:

Private Sub Workbook\_Open()
Call WBÖffnen
End Sub

„Modul 1“:

Private objapplication As clsApplication
 
Public Sub DetektivEinAusSchalten()
With objapplication
 .Autodetektiv = Not .Autodetektiv
 If .Autodetektiv Then
 MsgBox "Detektiv permanent aktiviert!"
 Else
 ActiveSheet.ClearArrows
 MsgBox "Detektiv deaktiviert!"
 End If
End With
End Sub
 
Sub WBÖffnen()
Set objapplication = New clsApplication
Set objapplication.prpApplication = Application
End Sub