yan2021
Goto Top

Excel - Text unsichtbar machen, wenn ausgeblendet

Hallo,

ich habe eine Excel-Datei (Excel-Vers. 2021), in der verschiedene Zellen gesperrt und ausgeblendet sind, da sie Text enthalten, der nicht sichtbar sein soll. Der Blattschutz ist über ein Kennwort aktiviert.

Damit man den Text auch nicht geschrieben in der Zelle sieht, habe ich den Text einfach mit der Textfarbe weiß formatiert.
Da die Zellen dann auch ausgeblendet sind, sieht man ihn dann auch nicht oben in der Adressleiste.

Das funktioniert grds. sehr gut...

Nun würde ich gerne eine Funktion haben, die fertige Zeilen der Datei automatisch mit hellgrauer Hintergrundfarbe einfärbt.
Dabei ergibt sich dann jedoch das Problem, dass man dann auch in den gesperrten und ausgeblendeten Zellen die entsprechenden Einträge sehen kann, die ja mit der Textfarbe weiß formatiert sind.

Es würde auch nichts bringen, die Einträge jetzt mit hellgrauer Textfarbe einzufärben, damit man die Einträge nicht sehen kann. Die Zellen haben ja zunächst einen weißen Hintergrund. Und erst, nachdem sie fertig belegt sind, sollen sie einen hellgrauen Hintergrund haben.

Hat jemand von Euch eine Idee, wie ich das umsetzen kann?

1) Sobald die Zeile fertig ausgefüllt ist, werden die Zellen (A9 - E9 und G9 - K9) hellgrau hinterlegt
2) Die Einträge in den Zellen (H9 - K9) sollen unsichtbar sein... egal ob weißer oder hellgrauer Hintergrund

## das gilt dann auch für die Zeilen 10 bis 20 ##

Zur Info:

Es gibt bereits den folgenden VBA-Code, der bewirkt, dass die fertigen Zellen gesperrt werden und somit nicht mehr veränderbar sind. Vielleicht muss man diesen Code ja nur entsprechend erweitern, um mein Vorhaben umsetzen zu können...

Hier der Code (2 Teile):

1) "Diese Arbeitsmappe":

Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim objCell As Range
    With Worksheets("Eingaben")  
        For Each objCell In Range("Q9:Q20")  
            If IsDate(objCell.Value) Then objCell.EntireRow.Locked = True
        Next
    End With
End Sub

2) "Tabelle 1" (also erstes Tabellenblatt):

Option Explicit

Private Sub Worksheet_Calculate()
    Dim objCell As Range
    For Each objCell In Range("O9:O20")  
        With objCell
            If .Text = "OK" Then _  
                If Not IsDate(.Offset(0, 2).Value) Then .Offset(0, 2).Value = Date
        End With
    Next
End Sub

Grüße von
Yan face-wink

Content-Key: 6542951741

Url: https://administrator.de/contentid/6542951741

Printed on: April 27, 2024 at 14:04 o'clock

Member: kpunkt
kpunkt Mar 28, 2023 at 13:42:21 (UTC)
Goto Top
Wenn du definieren kannst, was "fertig belegt" bedeutet solltest du mal nach "bedingter Formatierung" suchen.

Es gibt übrigens auch reine Excel-Foren, die sich mit sowas befassen.
Member: Kraemer
Kraemer Mar 28, 2023 updated at 14:08:25 (UTC)
Goto Top
Zellen "unsichtbar" machen kannst du mit dem benutzerdefinierten Zahlenformat ";;;" - ohne " natürlich.
Member: TK1987
TK1987 Mar 28, 2023 at 14:09:12 (UTC)
Goto Top
Moin,

wie wäre es mit:
objCell.NumberFormat = ";;;"  
So wird der Zellinhalt schlichtweg unsichtbar.

Gruß Thomas
Member: Yan2021
Yan2021 Mar 29, 2023 updated at 07:02:26 (UTC)
Goto Top
Danke für Eure Hilfe.

Ich habe jetzt (wie von @Kraemer empfohlen) die entsprechenden Zellen mit dem benutzerdefinierten Zahlenformat ";;;" formatiert. Das hat funktioniert.

Wo wäre der Vorteil, wenn ich den Code

objCell.NumberFormat = ";;;"  

stattdessen in meinen VBA-Code einsetzen würde?

Und... wo genau muss ich ihn dort einsetzen?
Und... muss ich ihn in beiden Codes einsetzen (also im Code für die Arbeitsmappe und im Code für das Tabellenblatt)?

Grüße von
Yan face-wink
Member: Kraemer
Kraemer Mar 29, 2023 at 07:01:53 (UTC)
Goto Top
Morgen,

nun denke doch einmal kurz darüber nach und dann sollte dir die Lösung selbst einfallen.
Member: Yan2021
Yan2021 Mar 29, 2023 at 07:02:53 (UTC)
Goto Top
sorry, ich hatte noch eine Änderung an meiner letzten Nachricht vorgenommen face-smile

Grüße von
Yan face-wink
Member: Kraemer
Kraemer Mar 29, 2023 at 07:05:03 (UTC)
Goto Top
Zitat von @Yan2021:

Wo wäre der Vorteil, wenn ich den Code

objCell.NumberFormat = ";;;"  

stattdessen in meinen VBA-Code einsetzen würde?

Die Frage, die du dir stellen musst: Brauchst du eine statische oder eine dynamische Lösung.
Statisch: machs per Hand
Dynamisch: programmiere ne Funktion
Member: Yan2021
Yan2021 Mar 29, 2023 at 07:13:02 (UTC)
Goto Top
OK und danke nochmal...

Ich habe Deine (@Kraemer) Lösung jetzt getestet und es funktioniert sehr gut.
Das würde ich jetzt so lassen.

Jetzt wäre nur noch die Frage, wie ich es hinbekomme, dass die durch den VBA-Code (siehe oben) jeweils komplett gesperrten Zeilen in hellgrauer Hintergrundfarbe formatiert werden.

Es wurde ja schon geschrieben, dass das auch über "bedingte Formatierung" gehe.
Aber ausgelöst wird die Sperrung der jeweiligen Zeile ja durch den VBA-Code.
Daher bin ich mir nicht sicher, wie ich das dann über die "bedingte Formatierung" umsetzen soll.

Grüße von
Yan face-wink
Member: kpunkt
kpunkt Mar 29, 2023 at 07:23:13 (UTC)
Goto Top
Klassisches Beispielmakro für bedingte Formatierung

Sub BedingteFormatierungBeispiel()

'Bereich definieren  
Dim MeinBereich As Range
Set MeinBereich = Range("A1:A10")  

'Vorhandene bedingte Formatierung aus dem Bereich löschen  
MeinBereich.FormatConditions.Delete

'Bedingte Formatierung anwenden  
MeinBereich.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
        Formula1:="=100", Formula2:="=150"  
MeinBereich.FormatConditions(1).Interior.Color = RGB(255, 0, 0)
End Sub
Member: Yan2021
Yan2021 Mar 29, 2023 at 07:40:45 (UTC)
Goto Top
Danke Dir für das Code-Beispiel.

Ich habe das Prinzip aber noch nicht verstanden.
Oben habe ich ja die beiden Codes eingestellt.

Im ersten Code steht ja u.a. die Codezeile:

For Each objCell In Range("Q9:Q20")  
            If IsDate(objCell.Value) Then objCell.EntireRow.Locked = True

Ich nehme an, dass damit die jeweiligen Zeilen aus dem Bereich "Q9 bis Q20" gesperrt werden, sobald in Spalte "Q" irgendwo ein Datum erscheint.

Das kann ja dann erst der Auslöser dafür sein, dass jetzt diese entsprechende Zeile (wo also in Spalte "Q" ein Datum erschien) in hellgrauer Hintergrundfarbe eingefärbt wird.

Und das muss ich ja dann... wahrscheinlich... in diesem ersten Code-Abschnitt mit aufnehmen. Oder sehe ich das falsch?

Ich habe Dein Beispiel jetzt mal auf meine Datei angepaßt:

Sub BedingteFormatierungHellgrau()

'Bereich definieren  
Dim BereichHellgrau As Range
Set BereichHellgrau = Range("A9:E10;G9:K20")2  

'Bedingte Formatierung anwenden  
BereichHellgrau.FormatConditions.Add Type:=xlCellValue, Operator:=xlBetween, _
        Formula1:="=100", Formula2:="=150"  
BereichHellgrau.FormatConditions(1).Interior.Color = RGB(221, 221, 221)
End Sub

Muss das als eigenständiger Code eingesetzt werden oder kann ich einen Code-Teil hiervon z.B. in meinen ersten Code (siehe oben) einbinden?

Und... ich habe hinter "Range" zwei Codebereiche angegeben. Ist es richtig, diese mit einem Semikolon zu trennen?

Grüße von
Yan face-wink
Member: kpunkt
kpunkt Mar 29, 2023 at 08:08:42 (UTC)
Goto Top
Puh...bin da schon lange nicht mehr in VBA unterwegs.

Den Code kannst du auch hinter die Schleife im ersten Code setzen.

Es sollen die Bereiche eingefärbt werden, wenn die gesperrt sind. Und gesperrt werden die nur, wenn da ein Datum, also ein Wert, drin steht. Also musst du einfärben, wenn da was drin steht.

Zwei Bereiche trennt man mit Komma ab, nicht mit Semikolon.

Nimm mal als Operator ein xlGreater und für Formula1 setzt du >0 ein. Formula2 brauchst du nicht.
Sollte dann alles in den Bereichen alles einfärben, wenn der Inhalt größer 0 ist. Und das ist ja bei dir immer der Fall, wenn die Zelle nicht leer ist.
Oder aber du nimmst als Operator xlEqual und die Formel lautet dann <>"" (also ungleich leer).
Da musst du testen.

Aber wie gesagt, es gibt da sehr gute Office-Foren, die da auch bei VBA extrem gut weiterhelfen.
Member: Yan2021
Yan2021 Mar 29, 2023 at 08:26:11 (UTC)
Goto Top
OK, ich habe es gerade mal versucht.
Dabei erschien jedoch der folgende Fehler in der "SET"-Zeile:

fehler

Und... habe ich die Änderung für Formula1 richtig umgesetzt?
Dort habe ich folgendes geschrieben:

Formula1:=">0"  

Grüße von
Yan face-wink
Member: kpunkt
kpunkt Mar 29, 2023 at 08:30:22 (UTC)
Goto Top
Was macht denn da auch die 2?
Member: Yan2021
Yan2021 Mar 29, 2023 updated at 08:35:02 (UTC)
Goto Top
...die stammt aus Deinem Code von weiter oben face-smile

Hab sie jetzt entfernt und die Fehlermeldung taucht nicht mehr auf.
Werde das Ganze jetzt mal testen

Grüße von
Yan face-wink
Member: kpunkt
kpunkt Mar 29, 2023 at 08:40:33 (UTC)
Goto Top
Bitte wo?
Und wie schon x-mal erwähnt...hervorragende Foren!
Member: Yan2021
Yan2021 Mar 29, 2023 at 09:10:01 (UTC)
Goto Top
Habe jetzt beide Varianten getestet (xlGreater und xlEqual), aber die Zellbereiche, die hellgrau hinterlegt werden sollen, bleiben weiß.

Falls hier sonst Niemand eine Idee hat, werde ich mal ein spezielles Excel-Forum suchen, um die Frage dort zu stellen.

Danke und Grüße von
Yan face-wink
Member: WilfKe
WilfKe Mar 29, 2023 at 18:15:46 (UTC)
Goto Top
Hallo Yan,

versuche doch einmal anstatt in Zellbereiche das auszublendende in eine Spalte unterzubringen.

Mit einer Formel und Prüfung der Voraussetzung wird der Inhalt der ausgeblendeten Zelle dann in einer sichtbaren Zelle angezeigt.
Spalte ausblenden, Formeln ausblenden, Zeilen- und Spaltenköpfe ausblenden, Blatt schützen

Gruß
Member: Yan2021
Solution Yan2021 Mar 30, 2023 at 07:07:35 (UTC)
Goto Top
Danke für Eure Hilfe,

ich habe tatsächlich auf Anhieb die Lösung in einem Excel-Forum gefunden.
Da Euch ja vielleicht das Ergebnis auch interessiert, stelle ich mal den funktionierenden Code hier ein:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Dim objCell As Range
    Dim loZ As Long
    With Worksheets("Eingaben")  
        For Each objCell In .Range("Q9:Q20")  
            If IsDate(objCell.Value) Then
                loZ = objCell.Row
                objCell.EntireRow.Locked = True
                objCell.Interior.Color = RGB(221, 221, 221)
                .Range(.Cells(loZ, 1), .Cells(loZ, 5)).Interior.Color = RGB(221, 221, 221)
                .Range(.Cells(loZ, 7), .Cells(loZ, 11)).Interior.Color = RGB(221, 221, 221)
            End If
        Next
    End With
End Sub

Hier wird einfach am Ende der Bereich angegeben, der nach der Sperrung der jeweiligen Zelle eingefärbt werden soll. Also die Zellen in A-E (also Code-Angabe 1 und 5) und G-K (also Code-Angabe 7 und 11).

Das funktioniert bestens und macht genau das, was es soll.

Grüße von
Yan face-wink