Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1832to1836
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
VBA mehrere Zellen abfragen (Or)
08.06.2021 14:08:11
Marc
Hallo zusammen,
kurze Frage, wie muss denn der korrekte Code heißen wenn ich S40, S44, S48 und S52 abfragen möchte?
S40 oder S44 oder .....
Nur mit der Abfrage von S40 sieht mein Code so aus:
Option Explicit

Sub Anzeige_wechseln()
If Workbooks("SG Kolping Remscheid lll -.xlsm").Worksheets("Spielbericht").Range("S40").Value  "" Then
Workbooks("Spielstandanzeige.xlsm").Worksheets("Anzeige").Range("G11").Value = "S"
End If
If Workbooks("SG Kolping Remscheid lll -.xlsm").Worksheets("Spielbericht").Range("S40").Value = "" Then
Workbooks("Spielstandanzeige.xlsm").Worksheets("Anzeige").Range("G11").Value = "A"
End If
End Sub
Es geht mir um die richtige Schreibweise.
Danke für Eure Hilfe
Gruß Marc

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA mehrere Zellen abfragen (Or)
08.06.2021 14:22:18
Rudi
immer A oder S nach G11 schreiben?

Sub aaaa()
Dim strOUT As String
With Workbooks("SG Kolping Remscheid lll -.xlsm").Worksheets("Spielbericht")
Select Case True
Case .Range("S40")  "", .Range("S44")  "", .Range("S48")  "", .Range("S52")  ""
strOUT = "S"
Case Else: strOUT = "A"
End Select
End With
Workbooks("Spielstandanzeige.xlsm").Worksheets("Anzeige").Range("G11") = strOUT
End Sub
Gruß
Rudi
AW: VBA mehrere Zellen abfragen (Or)
08.06.2021 14:51:07
Marc
Hallo Rudi,
vielen Dank!!!
Funktioniert einwandfrei.
Gruß Marc
P.S. Eigentlich wollte ich nur, dass wenn in dem Arbeitsblatt (SG Kolping Remscheid lll -.xlsm/Spielbericht) in den Zellen S40, S44, S48 oder S52 ein Wert eingetragen wird dann automatisch ein Makro gestartet wird. Wenn die Zellen leer sind/bleiben, dann soll nichts passieren. Geht sowas irgendwie?
Es geht darum, dass auf einem externem Monitor (Spielstandanzeige.xlsm) die Anzeige gewechselt werden soll.
Darf ich Dir dazu evtl. noch einmal schreiben?
Ich möchte allerdings Deine Hilfe keineswegs überstrapazieren.
Gruß Marc
Anzeige
du darfst schreiben ...
08.06.2021 15:51:28
Rudi
... soviel du willst. Dafür ist ein Forum da.
Wenn ich keine Lust habe, antworte ich einfach nicht. ;-)
Gruß
Rudi
AW: du darfst schreiben ...
08.06.2021 16:30:05
Marc
Hallo Rudi,
genau mein Humor :-)
Wie müsste denn dann jetzt das Makro aussehen?
Option Explicit
Sub Anzeige_wechseln()
Dim strOUT As String
With Workbooks("SG Kolping Remscheid lll -.xlsm").Worksheets("Spielbericht")
Select Case True
Case .Range("S40") "", .Range("S44") "", .Range("S48") "", .Range("S52") ""
strOUT = "S"
Case Else: strOUT = "A"
End Select
End With
Workbooks("Spielstandanzeige.xlsm").Worksheets("Anzeige").Range("G11") = strOUT
End Sub Dann müsste doch anstatt strOUT = "S" der Aufruf für das Makro stehen. Aber wie?
Und vor allem wie müsste dann das andere Makro aussehen?
Momentan sieht es so aus:
Option Explicit

Private Sub worksheet_change(ByVal Target As Excel.Range)
Application.ScreenUpdating = False
If Intersect(Target, Range("G11")) Is Nothing Then
Exit Sub
Else
If Target.Value = "S" Then
Range("A1").FormulaR1C1 = _
"='[SG Kolping Remscheid lll -.xlsm]Spielbericht'!R26C41"
Range("A16:F50,H16:M50").ClearContents
With Range("A16:F50,H16:M50")
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Range("A16:F50").FormulaR1C1 = _
"='[SG Kolping Remscheid lll -.xlsm]Spielbericht'!R30C41"
Range("H16:M50").FormulaR1C1 = _
"='[SG Kolping Remscheid lll -.xlsm]Spielbericht'!R30C44"
End If
End If
Application.ScreenUpdating = True
End Sub
Dann müsste ja theoretisch ("G11") und "S" weg.
Ich weiß nur leider nicht wie.
Das erste Makro (von Dir) steht in der Datei "SG Kolping Remscheid lll -" als Modul Spielstandanzeige"
Das zweite Makro steht in der Datei "Spielstandanzeige" im Tabellenblatt "Anzeige".
Ich hoffe das ist richtig so.
Sollte auf Jedenfall automatisch starten sobald in S40 usw. etwas eingegeben wird.
Danke
Gruß Marc
Anzeige
AW: du darfst schreiben ...
08.06.2021 16:59:36
Daniel
Hi
1. wenn ein Makro automatisch starten soll, sobald in eine oder mehrere Zellen auf einem bestimmten Tabellenblatt etwas vom Anwender eingegeben wird, musst du hierfür das

Private Sub worksheet_change(ByVal Target As Excel.Range)
Marko verwenden und zwar immer im Modul desjenigen Tabellenblatts, auf welchem auch die Zellen liegen, die das Makro auslösen sollen.
liegen die Zellen über mehrere Blätter verteilt, so brauchst du für jedes Blatt ein eigenes Makro.
2. willst du hierbei mehrere Zellen überwachen, so geht das, wenn jede der Zelle die gleiche Aktion auslösen soll, für mehrere Zellen am besten so:

Private Sub worksheet_change(ByVal Target As Excel.Range)
If Not Intersect(Target, Range("S40,S44,S48,S52")) Is Nothing Then
hier der Code der ausgeführt werden soll, wenn eine dieser Zellen geändert wurde
end If
End sub
die Variante mit der Aktion im vollständigen IF-Block mit "NOT Intersect () is Nothing" ist hier gegen der Exit-Sub Variante vorziehen, weil du dann das Makro einfacher erweitern kannst, wenn du noch weitere Zellen, hast die Aktionen auslösen sollen, aber jedoch andere.
die könntest du dann durch Anhängen weiterer IF-Blöcke ergänzen.
Arbeitest du mit Exit Sub, so funktioniert das dann nur für eine Variante.
Gruß Daniel
Anzeige
AW: du darfst schreiben ...
08.06.2021 17:47:26
Marc
Hallo Daniel,
soweit prinzipiell verstanden.
ABER:
Der Code bzw. das was geändert werden soll liegt ja in einer anderen Datei und anderen Tabellenblatt.
Wie und wo soll ich das denn dann eintragen? Da wo Du geschrieben hast?
Excel muss doch dann wissen wo und was geändert werden muss.
Also ich bekomme das irgendwie nicht "gebacken".
Der Code liegt ja jetzt direkt im Tabellenblatt.
Hier mal der Code:
Option Explicit

Private Sub worksheet_change(ByVal Target As Excel.Range)
Application.ScreenUpdating = False
If Intersect(Target, Range("G11")) Is Nothing Then
Exit Sub
Else
If Target.Value = "S" Then
Range("A1").FormulaR1C1 = _
"='[SG Kolping Remscheid lll -.xlsm]Spielbericht'!R26C41"
Range("A16:F50,H16:M50").ClearContents
With Range("A16:F50,H16:M50")
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = True
End With
Range("A16:F50").FormulaR1C1 = _
"='[SG Kolping Remscheid lll -.xlsm]Spielbericht'!R30C41"
Range("H16:M50").FormulaR1C1 = _
"='[SG Kolping Remscheid lll -.xlsm]Spielbericht'!R30C44"
End If
End If
Application.ScreenUpdating = True
End Sub
Dann müsste ich ja den ganzen Code abändern, Oder?
Dass das ("G11") und "S" da raus muss ist mir klar.
Nur was ich dann wie und wo eintragen muss verstehe ich leider nicht.
Gruß Marc
Anzeige
AW: du darfst schreiben ...
08.06.2021 18:02:50
Daniel
Wenn du automatisch erkennen willst, dass die Zelle A1 auf dem Tabellenblatt "Tabelle1" von Anwender geändert wurde und dadurch ein Makro ausgelöst werden soll, brauchst du dazu das Change-Eventmakro im Modul des Tabellenblatts "Tabelle1"
alles andere geht nicht. VERSTANDEN?
du kannst nicht von der Mappe2 aus die Mappe1 automatisiert auf Veränderung überwachen.
So eine Überwachung funktioniert nur innerhalb der eigenen Mappe.
Ist wie ein Brandmelder. Den musst du auch in dem Zimmer installieren, das überwacht werden soll.
selbst wenn du einen Brandmelder hast, der bei Alarm nicht nur piept, sondern auch die Feuerwache alamieren soll.
Der Brandmelder muss in deinem Zimmer installiert werden und nicht auf der Feuerwache.
Der Brandmelder kann zwar ein Signal an die Feuerwache funken, wenn er in deinem Zimmer ist, aber er kann nicht den Rauch in deinem Zimmer erkennen, wenn er auf der Brandwache liegt.
hast du uns schon erklärt, was du genau erreichen willst (und war so ausführlich, dass jemand der deine Datei nicht vor sich hat und deine Aufgabenstellung nicht kennt, das auch versteht), wenn nein, solltest du das vielleicht erstmal tun (und zwar ohne daran zu denken, wie das vielleicht programmiert werden kann, sondern einfach: wer macht was und was soll darauf hin passieren)
wenn ja, wo kann ich das nachlesen.
vermeide dabei auch möglichst passiv-konstruktionen wie "Zelle xy ändert sich" oder "Zelle xy wird geändert" weil hier einfach die wichtige Information fehlt, wer oder was die Zellen xy ändert.
Gruß Daniel
Anzeige
AW: du darfst schreiben ...
08.06.2021 18:33:04
Marc
Hallo Daniel,
wenn sich in einer Datei in einem Tabellenblatt in 4 ausgewählten Zellen etwas ändert, dann ist es nicht möglich in einer anderen Datei in einem anderen Tabellenblatt ein Makro zu starten das dort ausgeführt wird und dort Änderungen vornimmt?
Verstehe ich das richtig?
Gruß Marc
AW: du darfst schreiben ...
08.06.2021 19:46:10
Daniel
das ist schon alles möglich.
es ist nur so, dass wenn du automatisch erkennen willst, dass in dem einen Tabellenblatt in der einen Datei eine von 4 möglichen Zellen geändert wurde, dann brauchst du ein Makro dass Modul dieses einen Tabellenblatts in der einen Datei liegt.
dieses Makro kann dann in der anderen Datei Änderungen ausführen oder auch andere Makros, die sich in der anderen Datei befinden ausführen lassen (dann nicht über Call sondern mit Application.Run), aber du brauchst für die Automatische Ausführung immer den "Initialzünder", dh das Change-Eventmarko in der einen Datei in dem einen Tabellenblatt, in dem die Änderungen gemacht werden, die die Änderungen in dem anderen Tabellenblatt auslösen sollen.
Es ist nicht möglich, dass ein Makro, dass in der anderen Datei liegt, von sich aus automatisch startet, wenn in der einen Datei eine Zelle geändert wird.
wie gesagt, dein Makro ist wie ein Rauchmelder. Wenn der Rauchmelder einen Brand in einem Zimmer erkennen soll, dann musst du ihn auch in diesem einen Zimmer installieren und nicht in einem anderen.
Gruß Daniel
Anzeige
AW: du darfst schreiben ...
08.06.2021 20:13:29
Marc
Hallo Daniel,
da bin ich aber beruhigt.
Und wie muss muss jetzt das Makro aussehen das die Änderung ausführt und wo muss es hin und wie lautet der Aufruf dazu?
Ich weiß es leider nicht.
Gruß Marc
AW: du darfst schreiben ...
08.06.2021 20:40:53
Daniel
welche Zelle(n) sollen das Makro auslösen (bitte gebe konkret an Zellladressen, Tabellenblattname, Dateiname)
welche Zelle(n) sollen durch dieses Makros verändert werden (gib bitte wieder Zelladresse, Tabellenblattname und Dateinamen an)
hatten wir dir das nicht alles schon mal erklärt?
vielleicht liest du mit deinen neuen Erkenntnissen im Kopf die anderen Antworten nochmal durch, vielleicht verstehst du sie dann besser.
Gruß Daniel
Anzeige
AW: du darfst schreiben ...
08.06.2021 22:34:22
Marc
Hallo Daniel,
wenn in der Datei "SG Kolping Remscheid lll -.xlsx" / "Spielbericht" die Zellen S40 oder S44 oder S48 oder S52 verändert werden ("")
Dann hätte ich gerne, dass in der Datei "Spielstananzeige.xlsx" / "Anzeige" folgendes passiert:
Lösche A16-F50 und H16-M50
Verbinde mir die Zellen A6-F50 und H16-M50
Dann Zeige mir in A6 an was in "SG Kolping Remscheid lll -.xlsx" / "Spielbericht" AO30 steht
Und zeige mir in H16 an was in "SG Kolping Remscheid lll -.xlsx" / "Spielbericht" AR30 steht
Dann zeige mir In A1 an, was in "SG Kolping Remscheid lll -.xlsx" / "Spielbericht" AO26 steht
Feddich.
Das finde ich zum Beispiel kompliziert Euch zu schreiben.
Ich mache das ja nicht extra schwer für Euch, aber jeder braucht ggf. andere Informationen.
Gruß Marc
Anzeige
AW: du darfst schreiben ...
08.06.2021 22:38:30
Marc
Sorry muss natürlich im 6. Satz A16 heißen
AW: du darfst schreiben ...
08.06.2021 23:24:34
Daniel
naja, erwarte nicht ein vollständiges Makro
Deine Arbeit darfst du schon selber erledigen.
prüfen wir mal, ob du auch verstanden hast, was ich dir geschrieben habe und beantworte einfach folgende Frage:
in welches Modul welcher Datei muss der Code rein:
a) Datei "SG Kolping Remscheid lll -.xlsx" ins Modul der Tabelle "Spielbericht" (Modulname ist normalerweise noch TabelleX, so wie ursprünglich vor er Umbenennung
b) Datei "Spielstananzeige.xlsx" ins Modul der Tabelle "Anzeige"
die nächste inhaltliche Frage wäre:
warum müssen die Zellen A6-F50 verbunden werden?
ändert sich das irgendwann mal? Wenn nein, dann mach das doch einmalig von Hand.
dann muss das nicht in den Code rein.
Alles was stets gleich ist, sollte man nicht per Makro ändern, sondern von Hand machen , damit das Makro nicht unnötig kompliziert wird.
Gruß Daniel
Anzeige
AW: du darfst schreiben ...
09.06.2021 09:50:34
Marc
Hallo Daniel,
wie bitte kommst Du darauf, dass ich ein vollständiges Makro erwarte?
Das habe ich doch schon längst erstellt (siehe Nachricht vom 08.06.2021 14:51:07)
Funktioniert ja auch prima.
Ich bekomme es nur nicht automatisiert.
Händisch bzw. über meinen CommandButton klappt ja alles.
Ein Makro zu erwarten, ohne es selbst versucht zu haben, wäre auch etwas dreist wie ich selber finde. Das wäre ja dann eher eine Auftragsprogrammierung.
Ein Makro geringfügig abzuändern damit es ggf. besser, schneller oder automatisch funktioniert, da hatte ich gedacht dass man hier Hilfe finden kann.
Manchmal hilft so ein kleiner Schubser.
Danke trotzdem für Deine Arbeit/Mühe.
Gruß Marc
AW: du darfst schreiben ...
09.06.2021 11:47:18
Daniel
Also gehe ich mal davon aus, dass dir jetzt klar ist, in welchem Modul das Change-Event_Marko platzieren musst.
ist das einzige was vielleicht noch offen sein könnte die Frage, wie man in einem Makro Zellen anspricht, die auf einem anderen Tabellenblatt in einer anderen Mappe liegen.
Das geschieht durch vollständige Referenzierung, in dem man vor dem Range oder Cells beides noch mit angibt:
  • Workbooks("Dateiname").Sheets("Tabellenblattname").Range("A1").Value = "Hallo Welt"

  • wie du innerhalb einer Formel auf eine andere Mappe referenzierst, weist du ja , wie deine Codes zeigen.
    somit müsstest du das ganze eigentlich ans laufen bringen.
    Gruß Daniel
    AW: du darfst schreiben ...
    09.06.2021 14:19:21
    Marc
    Hallo Daniel,
    ich habe leider null Plan wo was hin muss und was geändert werden muss.
    Dafür weis ich aber jetzt wie Rauchmelder funktionieren. :-)
    Ich lass das jetzt erst einmal so wie es ist.
    Das Makro läuft ja.
    Vielleicht finde ich ja online noch irgendwo etwas das mich diesbezüglich weiterbringt.
    Gruß Marc
    Grundwissen, die zweite
    09.06.2021 16:37:42
    Yal
    Hallo Marc,
    ich verfolge seit einigen Thread deine Hilfslosigkeit, die Erkärungen, die Dir gegeben worden sind, zu verstehen. Ich glaube, Du bist auf die Lösung des Problems so fixiert, dass Du die Zusammenhänge nicht erfassen kannst (vor lauter Bäumen den Wald nicht sehen. Kenne ich selber).
    Abstand nehmen, tief einatmen. Zuerst verstehen, dann lösen.
    Alles was in Tabelle1 passiert löst ein "eigene" Ereignis. Diese eigene Ereignisse sind alle in der eigene Codepane aufgelistet (erreichbar am einfachste mit Rechtsklick auf dem Tabellenblatt-Reiter mit "Code anzeigen").
    Dann dort über den Codefenster oben links anstatt "allgemein" "Worksheet" auswählen.
    Auf dieselbe Höhe rechts kommt jetzt in der Dropdown viele Einträge, u.a. Change. Das sind die verfügbare Ereignisse. Schau Dir an, was alles zur Verfügung steht. Diese reagieren alle auf Ereignis die in Tabelle 1 passieren. Diese Schritt hast Du offenbach hinter Dir.
    Solltest Du eine Reaktion haben wollen, wenn etwas auf Tabelle2 passiert, same Procedure, aber im Codepane von Tabelle2.
    Solltest Du eine Reaktion haben wollen, wenn etwas Tabellen unabhängig passiert, dann schaue in der Codepane namens "DieseArbeitsmappe". Es sind andere Ereignis. Z.B. "Before Close". Warum? weil es hier um das Objekt Arbeitsmappe handelt, der die Arbeitsmappe-Ereignis behandelt.
    Im Prinzip, wenn dasselbe passieren soll, wenn in den jeweiligen "G11" passiert, dann kannst Du in den jeweiligen Codepane eine Basis-Behandlung machen und die tatsächlich Behandlung (den Du nicht 10 mal schreiben möchte) in einem Modul ablegen. Es handelt sich in dem Fall um eine normalen Procedure und keine Eregnis.
    Also in Codepane von Tabelle1, wenn G11 und S4x behandelt werden sollen:
    
    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Select Case Target.Address(False, False)
    Case "G11"
    MeinBehandlungFür_G11 Target
    Case "S40", "S42", "S44"
    MeinBehandlungFür_Sxx Target
    End Select
    End Sub
    
    In Codepane von Tabelle2, wenn nur G11 behandelt werden soll:
    
    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
    Select Case Target.Address(False, False)
    Case "G11"
    MeinBehandlungFür_G11 Target
    End Select
    End Sub
    
    usw.
    Wenn diese Procedure (= "Sub" oder "Function". Function ist ein Sub, das ein Ergebnis zurückliefern darf) in einem anderen Datei liegt, dann muss Du den Code mitteilen, wo diese Procedure zu finden sei.
    Im Allgemein beachte folgende Grundwissen:
    https://de.wikibooks.org/wiki/VBA_in_Excel/_G%C3%BCltigkeit_von_Variablen_und_Konstanten
    VG
    Yal

    28 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige