Excel VBA CommandButton auf einem anderen Tabellenblatt arbeiten lassen

!NeXT

Cadet 4th Year
Registriert
Nov. 2015
Beiträge
98
Hallo liebe CB-Community,
ich würde gerne meinen CommandButton in der Tabelle1 so bearbeiten, das er eine IF Abfrage auf einem anderen Tabellenblatt macht.
Leider habe ich im Thema VBA nicht die größten Erfahrungen, mein erster Lösungsversuch war dieser hier:

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Sheets("Berechungen").Activate
    If [h53] = 200 Then
        CommandButton1.Visible = True
    Else
        CommandButton1.Visible = False
    End If
End Sub

Mir ist natürlich klar das es so einfach nicht geht :D

Könnt ihr mir helfen?
 
Es gibt 4 mir bekannte Moeglichkeiten Zellen anzusprechen:

  • Range("Zelle") / Cells(Reihe, Spalte)
    -> Range("H53"), Cells(53, 8)
    Spricht eine Zelle im aktuell aktiven Blatt an.
    Empfinde ich persoenlich im Code zu unuebersichtlich und fehleranfaellig,
    wenn man mehr als ein Blatt hat.

  • Sheets("Tabellenname").Range("Zelle")
    -> Sheets("Berechungen").Range("H53")
    Der Tabellenname bezieht sich auf den in der Excelebene vergebenen Namen des Blattes.
    Aendert sich der, funktioniert der Verweis nicht mehr.

  • Sheets(Index).Range("Zelle")
    -> Sheets(1).Range("H53")
    Der Index bezieht sich auf die Reihenfolge, wie die Blaetter in der Excelebene angeordnet sind.
    1 -> 1. Blatt, 2 -> 2. Blatt, usw.
    Unabhaengig vom Namen, aber abhaengig von der Reihenfolge.
    Gut, wenn man schleifen ueber alle Blaetter erstellen moechte.

  • VBATabellenName.Range("Zelle")
    In der VBA Ebene koennen Namen unabhaengig von der Excelebene vergeben werden.
    Vorteil: In der Excelebene kann man die Blaetter verschieben und unbenennen; Es stoert das Makro nicht.
    Nachteil: Funktioniert nicht Dateiuebergreifend.
    VBA_Tabellenname.PNG
Range und Cells sind gleichwertig, Range diente hier nur als Beispiel.
Um nur Inhalte der Zelle abzufragen ".Value" anhaengen.

Sheets("Berechungen").Range("H53").Value
 
  • Gefällt mir
Reaktionen: spcqike und !NeXT
@!NeXT Hab dir paar Infos ins PN geschrieben.
 
Scientist schrieb:
Es gibt 4 mir bekannte Moeglichkeiten Zellen anzusprechen:

  • Range("Zelle") / Cells(Reihe, Spalte)
    -> Range("H53"), Cells(53, 8)
    Spricht eine Zelle im aktuell aktiven Blatt an.
    Empfinde ich persoenlich im Code zu unuebersichtlich und fehleranfaellig,
    wenn man mehr als ein Blatt hat.

  • Sheets("Tabellenname").Range("Zelle")
    -> Sheets("Berechungen").Range("H53")
    Der Tabellenname bezieht sich auf den in der Excelebene vergebenen Namen des Blattes.
    Aendert sich der, funktioniert der Verweis nicht mehr.

  • Sheets(Index).Range("Zelle")
    -> Sheets(1).Range("H53")
    Der Index bezieht sich auf die Reihenfolge, wie die Blaetter in der Excelebene angeordnet sind.
    1 -> 1. Blatt, 2 -> 2. Blatt, usw.
    Unabhaengig vom Namen, aber abhaengig von der Reihenfolge.
    Gut, wenn man schleifen ueber alle Blaetter erstellen moechte.

  • VBATabellenName.Range("Zelle")
    In der VBA Ebene koennen Namen unabhaengig von der Excelebene vergeben werden.
    Vorteil: In der Excelebene kann man die Blaetter verschieben und unbenennen; Es stoert das Makro nicht.
    Nachteil: Funktioniert nicht Dateiuebergreifend.
    Anhang anzeigen 709877
Range und Cells sind gleichwertig, Range diente hier nur als Beispiel.
Um nur Inhalte der Zelle abzufragen ".Value" anhaengen.

Sheets("Berechungen").Range("H53").Value

Vielen Dank für deine Mühe, leider bekomme ich aber folgenden Fehler:

"Laufzeitfehler 9"
"Index außerhalb des gültigen Bereichs"
 
Scientist schrieb:
Wie sieht dein aktueller Code aus?
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Sheets("Berechungen").Range("H53").Value
    If [H53] = 200 Then
        CommandButton1.Visible = True
    Else
        CommandButton1.Visible = False
    End If
End Sub

So hier.. :)
 
Ne, das gehoert wo anders hin :D

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    If Sheets("Berechungen").Range("H53").Value = 200 Then
        CommandButton1.Visible = True
    Else
        CommandButton1.Visible = False
    End If
End Sub
 
Scientist schrieb:
Ne, das gehoert wo anders hin :D

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   
    If Sheets("Berechungen").Range("H53").Value = 200 Then
        CommandButton1.Visible = True
    Else
        CommandButton1.Visible = False
    End If
End Sub

Komisch ich bekomm trotzdem den Fehler..
1.PNG

Ergänzung ()

Alles gut. hat sich doch alles geklärt.
Statt "Berechnungen" steht im Code "Berechungen".
Mein Fehler! :D

Lieben Dank für die Hilfe! :)
Ergänzung ()

Trotzdem habe ich nochmal eine Nachfrage.
SelectionChange bedeutet ja nun, das bei jeder Änderung abgefragt wird, ob bei H53 eine 200 steht.
Kann man das so umschreiben das er immer nachfragt ob dort eine 200 steht?, sonst muss ich zum Aktualisieren immer eine Zelle anklicken.. Das wäre blöd.
 
Du willst einen Button einblenden lassen, wenn in einer Bestimmten Zelle ein Wert steht, richtig?
Dann ist doch eigentlich nur interessant, wenn sich der Wert in dieser Zelle aendert.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
  
    If Not Intersect(Target, Range("H54")) Is Nothing and Target = 200 Then
        Sheets("Mir unbekantes Blatt").CommandButton1.Visible = True
    Else
        Sheets("Mir unbekantes Blatt").CommandButton1.Visible = False
    End If
End Sub

Mit dem Change-Event koennen wir Eingaben abfangen.
Target ist eine Variable und dieser wird vom Change-Event
automatisch der bearbeitete Bereich zugewiesen.
Mit Intersect wird ueberprueft, ob die bearbeitete Zelle (Target)
in einem bestimmten Bereich liegt (hier nur Zelle H54).
Damit wird der Code nicht bei jeder Eingabe auf dem Blatt ausgefuehrt,
sondern nur, wenn sich der Inhalt in Zelle H54 aendert und der Wert 200 ist.

Weil der Button auf einem anderem Blatt liegt, muss wie bei Zellen zusaetzlich das Blatt definiert werden.
 
Hm.. Ich verstehe zwar was du meinst, aber trotzdem bekomme ich jetzt den Fehler hier:
1.PNG

Kann auch sein das ich mal wieder nicht klar denke :D
Zum Verständis: Auf Tabelle 1 mit dem Namen "Dateneingabe" soll der CommandButton stehen, dieser soll aber nur angezeigt werden, wenn auf der Seite "Berechnungen" Range H54, eine 200 steht.

Mache ich was falsch? :pcangry:
 
Das Skript wurde nach "Berechnungen" verschoben?
"Mir unbekanntes Blatt" wurde gegen "Dateneingabe" ausgetauscht?
Blattschutz vorhanden?
Der Button heißt "CommandButton1"?
 
Ja ich hab alles genau so gemacht.
Mittlerweile bekomme ich keinen Fehler mehr, habe es irgendwie gefixt. Glaube es lag daran, dass H54 eine verbundene Zelle war, das hab ich entfernt.
Aber irgendwie funktioniert das ganze noch nicht so ganz..
Du musst dir vorstellen, dass in dem Tabellenblatt "Dateneingabe" 2 Aufgabenteile eingegeben werden. Sobald Teil 1 absolviert ist erhält die Berechnungstabelle 50 "Punkte". Ist Teil 2 erledigt und somit die Eingabe vollständig werden aus der 50 eine 100.
Vielleicht ist das von Bedeutung, in der Zelle H54 ist also eine =Summe() Funktion.

Teilweise wird der CommandButton die ganze Zeit angezeigt, manchmalgar nicht...
Ergänzung ()

Habe das ganze gerade mal getestet. Anscheinend liegt es an der Summen Funktion.
Kann man das irgendwie umgehen? :confused_alt:
 
Zuletzt bearbeitet:
Ok, bin halt davon ausgegangen, dass direkt in Zelle H54 geschrieben wird.
So hatte ich es auch beschrieben ...
Wenn in Zelle H54 nie etwas eingegeben wird, wird das mit dem Makro so nie funktionieren.
Dann muss H54 direkt abgefragt werden.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

    If Range("H54").Value = 200 Then
        Sheets("Dateneingabe").CommandButton1.Visible = True
    Else
        Sheets("Dateneingabe").CommandButton1.Visible = False
    End If
End Sub
 
Trotzdem muss ich immer in der Berechnungsseite etwas eintippen oder eine Zelle anklicken, damit der CommandButton angezeigt wird..

Puh ist das alles kompliziert mit dem Commandbuttons... :(
 
Okay, mittlerweile hab ich verstanden wie deine Datei aufgebaut ist und was du vorhast ...
Blatt 1: Eingaben
Blatt 2: keine Eingaben, nur Rechenzellen

Komplett Missverstanden ...

Dann muss das Makro natuerlich bei dem Blatt mit den Eingaben im Change-Event sein ...
Zellverweis zu H54 muss dann noch angepasst werden auf das andere Blatt.
 
Ich fühle mich hier nur eine einzige regel erinnert: Referenzieren, Referenzieren, Referenzieren.
Ort - Straße - Hausummer = Mappe - Blatt - Zelle.

CN8
 
Scientist schrieb:
Okay, mittlerweile hab ich verstanden wie deine Datei aufgebaut ist und was du vorhast ...
Blatt 1: Eingaben
Blatt 2: keine Eingaben, nur Rechenzellen

Komplett Missverstanden ...

Dann muss das Makro natuerlich bei dem Blatt mit den Eingaben im Change-Event sein ...
Zellverweis zu H54 muss dann noch angepasst werden auf das andere Blatt.

Wie meinst du das?
Worksheet_Change ist doch dann schon richtig oder nicht?
 
Jedes Blatt hat seine eigenen Events und weil ich dich falsch verstanden habe, ist es im falschen.
 
Scientist schrieb:
Jedes Blatt hat seine eigenen Events und weil ich dich falsch verstanden habe, ist es im falschen.

Jetzt hab ich alles in die Dateneingabe geschrieben.
Geht nur leider trotzdem nicht :evillol:
Ich kann nich mehr XD..
 
Anscheind hab ich es gefixt.. Seit dem ich im CommandButton eine Funktion habe, funktioniert alles wie geschmiert. :D
Wie auch immer danke @All :)
 
Zurück
Oben