PDA

Vollständige Version anzeigen : Excel-Sheet automatisch aktualisieren


richi193
20.09.2016, 10:31
Hallo,
folgendes Problem bekomme ich nicht in den Griff:
Je nach Eintrag in Zelle A1 soll ein anderer ComandButton angezeigt werden. Soweit so gut, mein Code sieht so aus:

Private Sub CommandButton1_Click()
MsgBox "Inhalt1"
End Sub

Private Sub CommandButton2_Click()
MsgBox "Inhalt2"
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("A1")) Is Nothing Then
If LCase(Me.Range("A1").Value) = "Admin" Then
Me.CommandButton1.Visible = True
Me.CommandButton1.Enabled = True
Else
Me.CommandButton1.Visible = False
Me.CommandButton1.Enabled = False
End If
If LCase(Me.Range("A1").Value) = "Mitarbeiter" Then
Me.CommandButton2.Visible = True
Me.CommandButton2.Enabled = True
Else
Me.CommandButton2.Visible = False
Me.CommandButton2.Enabled = False
End If
End If
End Sub

Der Inhalt in Zelle A1 wird über ein anderes Dokument automatisch aktualisiert. Das Makro startet aber leider nicht automatisch. Erst nach Klick auf die Zelle und dann "Enter" ist auch die entsprechende Schaltfläche vorhanden.
Was kann ich tun, dass bei Änderung in Zelle A1 automatisch auch das Makro ausgeführt wird?

Danke euch
Richard

ASE
20.09.2016, 13:40
Hallo,
so ganz kann ich Deinen Code nicht nachvollziehen!
Aber wie die Zelle A1 gefüllt wird ist dem Event egal. Möglicherweise hast Du die Events irgend wo ausgeschaltet und nicht wieder an.
Die Abrfage ist auch vom Code her nicht optimal bzw. überflüssig bis quatsch.
Wenn eine Button unsichtbar "visible=False" gestellt wird ist er unsichtbar und "Enable" auf False zu setzen ist nicht noch nötig.

Zum einschalten der Events benutze das:

Sub Reset()
Application.EnableEvents = True
End Sub

Bei mir funktioniert der folgende Code ohne Probleme:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" And LCase(Target.Value) = "admin" Then
CommandButton1.Visible = True
'CommandButton1.Enabled = True 'Wozu ? wenn ausgeblendet dann kannst Du das auch nicht betätigen!
CommandButton2.Visible = False
Else
CommandButton1.Visible = False
CommandButton2.Visible = True
End If
End Sub

richi193
20.09.2016, 14:10
Danke für die Antwort.
Der Code hat definitiv noch Verbesserungspotenzial, ich war aber froh als es funktionierte, daher bin ich erstmal zufrieden.
Dein Vorschlag löst leider nicht das Problem. Es geht halt darum, dass ich in einer ersten Maske ein Thema auswählen kann und bei Klick aauf weiter zu besagter Tabelle gelange. Je nach Auswahl steht eben ein anderer Begriff in Zelle A1. Davon abhängig gibt es andere Nebeninformationen, die man bei Bedarf abrufen kann.
Daher die Idee mit den verschiedenen CommandButton, welche je nach Schlagwort eben verschiedene Hyperlinks hinterlegt haben. Funktioniert auch mit meinem krummen Code. Nur eben will ich eben noch erreichen, dass automatisch schon der richtige Button dann da ist.
Aktuell muss man halt Zelle A1 selektieren und Enter drücken. Erst dann wird anscheinend das Makro aufgerufen.

Lange Rede kurzer Sinn: Bei Änderung in Zelle A1 soll automatisch das Makro ausgeführt werden

ASE
20.09.2016, 15:54
Hallo,
irgendwie werde ich das Gefühl nicht los, Dein Problem ist nicht mehr meines.

richi193
21.09.2016, 09:28
Wie meinst du das? Würde mich freuen wenn du oder jemand anderes doch eine Lösung hat.

EarlFred
21.09.2016, 09:34
Hallo Richard,

Inhalt in Zelle A1 wird über ein anderes Dokument automatisch aktualisiert.
wie genau? Ist in A1 eine Formel hinterlegt? Dann greift das Change-Ereignis nicht!

Option Explicit

Private Sub Worksheet_Calculate()
Me.CommandButton1.Visible = LCase(Me.Range("A1").Value) = "Admin"
Me.CommandButton1.Enabled = LCase(Me.Range("A1").Value) = "Admin"

Me.CommandButton2.Visible = LCase(Me.Range("A1").Value) = "Mitarbeiter"
Me.CommandButton2.Enabled = LCase(Me.Range("A1").Value) = "Mitarbeiter"
End Sub

Grüße
EarlFred

richi193
21.09.2016, 10:43
Hallo EarlFred,

über einen =sverweis usw.

Deine Lösung funktioniert perfekt. Und dann auch noch deutlich eleganter als meine Lösung. Vielen Dank, jetzt klappt es einfach wunderbar.

Gruß
Richard

EarlFred
21.09.2016, 10:53
Hallo

über einen =sverweis usw.
vielleicht als etwas holprige Erläuterung:
Das Change-Ereignis reagiert auf Änderungen des Zell-"Inhalts".
Der "Inhalt" bleibt aber immer gleich, nämlich die Formel selbst. Und die änderst Du ja nicht.
Was sich ändert, ist das Ergebnis der Formel, also der angezeigte Wert. Der löst aber das Ereignis nicht aus.

Änderst Du den Inhalt, dann immer das Change-Ereignis nehmen, allein schon deshalb, weil Du den Ort des Geschehens genau feststellen kannst (Target) und nicht "blind" reagierst, wie es beim Calculate-Ereignis der Fall ist.

Grüße
EarlFred

richi193
21.09.2016, 11:43
Prima. Wieder was gelernt, so macht die Arbeit dann auch Spaß.

In dem Fall fungiert dieses Blatt als Formular, da im eigentlichen Dokument für die weitere Bearbeitung das ganze zu unübersichtlich geworden wäre.
Auf Calculate bin ich nicht gekommen, bzw. kannte ich auch nicht besonders vorher. Für diesen Fall ist das aber vollkommen ausreichend.