2.3k Aufrufe
Gefragt in Tabellenkalkulation von acr Mitglied (215 Punkte)
Hallo Exelfreaks
Ich habe in meiner Exeltabell-Blatt1- folgenden VBA-Code stehen:


' Zeilen überprüfen und kopieren
Private Sub Worksheet_Change(ByVal Target As Range)

Dim rngBer As Range
Dim rngObj As Range
Dim Sh As Worksheet

On Error GoTo Err_Handler

' zu prüfende Zellen als Gesamtbereich festlegen
With Me
Set rngBer = Union(.Range("F8:F50"), .Range("G8:G50"), .Range("I8:I50"), _
.Range("J8:J50"))
End With

' gucken ob change im Zielbereich liegt
If Not Intersect(Target, rngBer) Is Nothing Then
With Target

' wenn ja, Abfrage ob alle Zellen gefüllt sind, wenn eine leer dann raus aus sub
For Each rngObj In rngBer

' nur wenn Zeile stimmt Inhalt prüfen
If rngObj.Row = .Row Then

' wenn Zeile stimmt, aber einer der 4 Checkbereiche leer, dann exit
If rngObj.Value = "" Then
GoTo Exit_This
End If
End If
Next rngObj

' sheetauswahl nach Angabe im Tabellenblatt, Spalte l
' nicht existent wird im err_handler abgearbeitet
Set Sh = Sheets(Right(Cells(.Row, 12), 4))

Application.EnableEvents = False
Application.ScreenUpdating = False
Sh.Unprotect
Me.Unprotect

' Zeile kopieren ins neue Sheet
Rows(.Row).Copy Destination:=Sh.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)

' Zeile im Ursprungssheet löschen
Rows(.Row).Delete
Me.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Sh.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End With
End If

Exit_This:
Application.EnableEvents = True
Application.ScreenUpdating = True
Set rngBer = Nothing
Set rngObj = Nothing
Set Sh = Nothing

Exit Sub

' Fehlerprüfroutine
Err_Handler:
Select Case Err.Number
Case 9
MsgBox "Das angegebene Tabellenblatt existiert nicht!"
Case Else
MsgBox "Fehler: " & Err.Number & vbLf & Err.Description
End Select
Resume Exit_This

End Sub

' Aufruf eines Kalenders
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

Dim RaBereich As Range
If Target.Count > 1 Then Exit Sub
' Bereich der Wirksamkeit
Set RaBereich = Range("A8:A50, J8:J50, M8:M50")

If Not Intersect(Target, RaBereich) Is Nothing Then
Kalender.Show
ElseIf Target.Row >= 4 And Target.Row <= 7 And Target.Column <= 12 Then
Kalender.Show
End If
' ActiveSheet.protect ("hsxxxx")
Set RaBereich = Nothing
End Sub

Ich möchte jetzt die zur Bearbeitung anstehende Zelle farblich hervorhaben. Hierzu habe ich in einem Forum folgenden Code gefunden:

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Cells.Interior.ColorIndex = xlNone
ActiveCell.Interior.ColorIndex = 6
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Cells.Interior.ColorIndex = xlNone
ActiveCell.Interior.ColorIndex = 6
End Sub

Wenn ich diesen Code in mein Tabellenblatt einfüge, erhalte ich eine Fehlermeldung. Frage, wie wird dieser Code richtig eingefügt, damit kein Fehler entsteht.
Bin auf dem Gebiet VBA blutiger Anfänjger.
Für die Hilfe Dank im Voraus.

Gruß Horst

8 Antworten

0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Horst,

schau mal auf meiner HP in der Rubrik Anleitungen und dort dann in der Anleitungsnummer 2 nach. Dort stelle ich dazu eine bebilderte Anleitung zur Verfügung, die Dir sicherlich helfen wird.

Aber Achtung! Die Ereignisse
Private Sub Worksheet_Change(ByVal Target As Range)
und
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
dürfen immer nur einmal pro Tabellenblatt vorkommen. Bei dem Code, den Du hier gepostet hast, kommt das Ereignis
Private Sub Worksheet_Change(ByVal Target As Range)
2x vor.

Bei Fragen melde Dich.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von acr Mitglied (215 Punkte)
Hallo Oliver

Vielen Dank für den Tip auf Deine Seite. Er hilft mir jedoch nicht weiter. Der bestehende Code funktioniert in meinem Tabellenblatt einwandfrei. Hier sollte im Code nur -)) der andere Code eingefügt werden, um die zu bearbeiten Zelle einzufärben.
Meine Frage also nochmal: Wie arbeite ich den zweiten Code in den ersten Code ein.

Gruß Horst
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Horst,

kopiere alle, was in Deinem 2. VBA-Code zwischen

Private Sub Worksheet_Change(ByVal Target As Range) und

End Sub steht und füge es in Deinem bereits vorhandenen Ereignis zwischen

Private Sub Worksheet_Change(ByVal Target As Range) und

End Sub ein. Am Besten Du fügst es vor End Sub ein. Das Gleiche machst Du mit dem

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
-Ereignis


MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von acr Mitglied (215 Punkte)
Hallo Oliver

Funtioniert leider nicht. Folgender Code wurde hinter der Fehlerroutine eingefügt:

Cells.Interior.ColorIndex = xlNone
ActiveCell.Interior.ColorIndex = 6

Cells.Interior.ColorIndex = xlNone
ActiveCell.Interior.ColorIndex = 6
End Sub
0 Punkte
Beantwortet von coros Experte (4k Punkte)
Hallo Horst,

sorry, war mein Fehler. Das mit der Fehlerrpoutine habe ich übersehen. Der Code muss in dem Ereignis vor den Eintrag "Exit Sub", weil nach "Exit Sub wird nur abgearbeitet, wenn ein Fehler auftritt.

MfG,
Oliver
[sub]Da hier der einzige Lohn für die Helfer eine Rückmeldung ist, wäre es nett, wenn Du[/sub]
[sup] ein Feedback abgeben könntest, ob der Lösungsvorschlag Dein Problem gelöst hat.[/sup]
0 Punkte
Beantwortet von acr Mitglied (215 Punkte)
Hallo Oliver

Auch das funktionier nicht......

Schade

Gruß Horst
0 Punkte
Beantwortet von
Hi,

Auch das funktionier nicht......


Du möchtest doch hier die Hilfe. Und nur Du sitzt vor Deiner Datei. Warum schreibst Du dann nicht genau, was nicht funktioniert. Passiert überhaupt nichts? Oder gibst es eine Fehlermeldung? Wenn Fehlermeldung, dann poste sie doch bitte auch mit der CodeZeile bei der sie auftritt. Das geht auch als VBA-Anfänger.

Nun habe ich ja Deine Datei noch von einem früheren Posting hier auf der Platte. Dein Wunsch die gerade aktive Zelle einzufärben, würde ich nur im SelectionChange-Ereignis in Angriff nehmen wollen. Da Du Dein Blatt aber auch geschützt hast, musst Du diesen Schutz zuvor auch aufheben. Versuch es einfach mal wie folgt:
' Aufruf eines Kalenders

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

Me.Unprotect
Range("A8:M47").Interior.ColorIndex = xlNone
ActiveCell.Interior.ColorIndex = 6
Me.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True


Dim RaBereich As Range
If Target.Count > 1 Then Exit Sub
' Bereich der Wirksamkeit
Set RaBereich = Range("A8:A50, J8:J50, M8:M50")

If Not Intersect(Target, RaBereich) Is Nothing Then
Kalender.Show
ElseIf Target.Row >= 4 And Target.Row <= 7 And Target.Column <= 12 Then
Kalender.Show
End If
' ActiveSheet.protect ("hsxxxx")
Set RaBereich = Nothing

End Sub


bye
malSchauen
0 Punkte
Beantwortet von acr Mitglied (215 Punkte)
Hi @malSchauen

Deine Beschreibung hat mein Problem vorzüglich gelöst. Es funktioniert genauso, wie ich es mir vogestellt hatte.
Allen, die sich mit meinem Problem beschäftigt hatten, ein herzliches Dankeschön


Gruß ACR
...