wenn in einem Bereich, z.b. spalte a und spalte b die beiden zellen der zeile eine 1 haben, soll eine msgbox mit hinweis öffnen.
dies soll jeweils bei der eingabe in die jeweilige zeile geschehen.
sollte also nicht ständig für alle zeilen anzeigen.
Sub Vergeleichen()
If Range(„a1“) = Range(„b1“) Then
MsgBox „Alles Ok!“, vbInformation
Else
End If
End Sub
Jetzt möchte ich jedoch in zwei Spalten, egal wie lang die Tabelle ist, jeweils die beiden Zellen der Zeilen miteinander vergleichen.
Was muss ich dazu eingeben?
Jetzt möchte ich jedoch in zwei Spalten, egal wie lang die
Tabelle ist, jeweils die beiden Zellen der Zeilen miteinander
vergleichen.
Was muss ich dazu eingeben?
Öffne Excel und erstelle ein Arbeitsblatt „Tabelle1“.
Dann gehe mit „Alt+F11“ in den VBA-Script Modus.
Dort gib bei „Tabelle1(Tabelle1)“ folgenden VBA-Code ein:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
If Target.Count = 1 Then Call Meldungsstart
End Sub
Dann erstelle ein Modul mit „rechte Maustaste - Einfügen - Modul“.
Dort füge folgenden VBA-Code ein:
Option Explicit
Sub Meldungsstart()
’ je nach Spalte, Steuerelement aktivieren
Select Case ActiveCell.Column
’ Spalte A
Case 1
MsgBox „Hinweis zu Spalte-A1“
’ Spalte B
Case 2
MsgBox „Hinweis zu Spalte-B1“
End Select
End Sub
Wenn du auf die Tabellen-Ebene zurück gehst, kannst du in Zelle-A1, oder Zelle-B1 eine Zahl hineinschreiben und bekommst eine Meldung!
Dies als kleine Hilfe.
Da ich keine Komplettlösungen anbiete, musst du dich damit leider zufrieden geben.
Ich hoffe trotzdem, dir bei deinem Problem ein wenig geholfen zu haben.
mit FIND in deutsch sicher FINDE sucht dir Excel das gewünscht eZeichen in der String des eingabefeldes oder einer anderen Zelle.
Wenn Du diese Funktion bei der Eingabe über ein Makro aufrufst geht es sicher. Entweder bei Änderung des Zellinhalts oder beim Abschluß der Eingabe.
da gibt es einige Lösungsansätze. Wichtig für den Lösungsansatz ist die Form der „Eingabe“. Wird diese „1“ immer manuell eingetragen oder wird die „1“ durch eine Formel berechnet? Sollte eine Formel im Spiel sein, müsste man auf alle für das Ergebnis relevanten Zellen prüfen und auf das Verändern dieser Zellen reagieren. Dann bitte poste mir die Formel als Muster.
Hallo Gerd, die „1“ wird in diesem Falle immer manuell eingegeben. Wie gesagt, wenn ich das Makro im Editor abspiele, geht es super. Jetzt muss ich nur noch hinbekommen, dass es automatisch auch in der Tabelle geht.
wenn in einem Bereich, z.b. spalte a und spalte b die beiden
zellen der zeile eine 1 haben, soll eine msgbox mit hinweis
öffnen.
dies soll jeweils bei der eingabe in die jeweilige zeile
geschehen.
sollte also nicht ständig für alle zeilen anzeigen.
Generell könntest Du das auch mit einer Formel und der Bedingten Formatierung anzeigen lassen.
Mit VBA kannst Du das dann z.B. so angehen:
Private Sub Worksheet\_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A:B")) Is Nothing Then
With Target
If Range("A" & .Row).Value = Range("B" & .Row).Value Then
MsgBox "Die Werte in Zeile " & .Row & " sind identisch"
End If
End With
End If
End Sub
versuche mal, folgenden Code zum Codebereich Deiner Tabelle hinzuzufügen:
Option Explicit
Private Sub Worksheet\_Change(ByVal Target As Range)
Dim Bereich As Range
Dim Zelle As Range
'Hier prüfen wir, ob die Zellen mit den Veränderungen in Spalte E liegen
Set Bereich = Intersect(Columns("A:B"), Target)
'Falls nein, verlassen wir die Prozedur wieder
If Bereich Is Nothing Then Exit Sub
For Each Zelle In Bereich.Cells
'Hier vergleichen wir, ob es in der veränderten Zeile
'in Spalte A und B jeweils eine 1 eingetragen wurde
If Zelle.EntireRow.Cells(1).Value = 1 And \_
Zelle.EntireRow.Cells(2).Value = 1 Then
MsgBox "In Zelle " & Zelle.EntireRow.Cells(1).Address & " und" & vbCr & \_
"in Zelle " & Zelle.EntireRow.Cells(2).Address & vbCr & \_
"wurde eine 1 eingetragen", , "Mitteilung"
End If
Next Zelle
Set Bereich = Nothing
Set Zelle = Nothing
End Sub
Dieser Code nutzt das Change-Ereignis der Tabelle und reagiert auf manuelle Eingaben.
hier ein entsprechendes Makro, das die Eingaben in einem Tabellenblatt überwacht.
Gruß
Franz
'Makro im VBA-Editor unter der Tabelle einfügen, deren Eingaben überwacht werden sollen
Private Sub Worksheet\_Change(ByVal Target As Range)
Dim Bereich As Range, Zeile As Range
'Bereich = Zellbereich in dem Eingaben überwacht werden sollen - Hier Spalten A und B
Set Bereich = Range(Cells(1, 1), Cells(Rows.Count, 2))
Set Bereich = Intersect(Target, Bereich)
If Not Bereich Is Nothing Then
For Each Zeile In Bereich.Rows
If Cells(Zeile.Row, 1) = 1 And Cells(Zeile.Row, 2) = 1 Then
If MsgBox("In Zeile " & Zeile.Row & " ist in Spalte A und B der Wert = 1", \_
vbInformation + vbOKCancel, "Prüfung Spalte A und B auf Wert 1") \_
= vbCancel Then Exit For
End If
Next Zeile
End If
End Sub
eine for-each-schleife erscheint mir überflüssig.
ich empfehle den code von thomas ramel mit folgender änderung:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range(„A:B“)) Is Nothing Then
With Target
If Range(„A“ & .Row).Value = 1 and Range(„B“ & .Row).Value = 1 Then
MsgBox „Die Werte in Zeile " & .Row & " sind beide gleich 1“
End If
End With
End If
End Sub
If LetzteZeileA > LetzteZeileB Then
MaxZeile = LetzeZeileA
Else
MaxZeile = LetzteZeileB
End If
Spalte1 = Target.Column
Zeile = Target.Row
If Spalte1 = 1 Then
Spalte2 = 2
Else
Spalte2 = 1
End If
wert1 = Cells(Zeile, Spalte1)
wert2 = Cells(Zeile, Spalte2)
Select Case wert1
Case Is = 1
If wert2 = 1 Then
MsgBox "Zwei Einsen in Zeile " & Zeile
End If
End Select
der eben geschickte Code war zu lang.
Hier die kürzere Version:
Gruß,
Jochen
P.S. Feedback wäre schön…
Hier der Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Long
If ActiveCell.Column „“ Then
Application.EnableEvents = False
End If
Spalte1 = Target.Column
Zeile = Target.Row
If Spalte1 = 1 Then
Spalte2 = 2
Else
Spalte2 = 1
End If
wert1 = Cells(Zeile, Spalte1)
wert2 = Cells(Zeile, Spalte2)
Select Case wert1
Case Is = 1
If wert2 = 1 Then
MsgBox "Zwei Einsen in Zeile " & Zeile
End If
End Select
Im VBA-Script steht in „Tabelle1(Tabelle1)“ folgende Sub-Routine:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case „$A$1“
MsgBox "Eingabe war: " & Cells(1, 1)
End Select
End Sub
Dort wo steht "MsgBox „Eingabe war: " & Cells(1, 1)“ kannst du „Call Vergleichen“ hinschreiben.
Wenn du jetzt in Spalte-A1 eine Zahl eingibst und mit Enter bestätigst, wir dein Unterprogramm „Vergleichen“ aufgerufen.
Zum Erweitern der Routine:
Die Sub-Routine bezieht sich auf Spalte-A1, kann sich aber auf jede andere Spalte z.B. „B1“ beziehen und würde dann lauten "Case „$B$1“.
Wenn dann in Spalte-A1 dein 1.Wert und in Spalte-B1 dein 2.Wert steht, welcher zur Spalte-A1 dazu addiert wird, löst das Verlassen der Spalte-B1 deine Sub-Routine aus, welche weitere Berechnungen ausführt.
Z.B. Ergebnis = cells(1,1)+Cells(1,2), wobei vorher natürlich die Variable „Ergebnis“ noch mit „Dim Ergebnis as Byte“ dimensioniert werden muss, hier als Byte-Variable (geht von ca. 0-256).