Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Zelle formatieren

Betrifft: Zelle formatieren von: Lukas
Geschrieben am: 14.09.2020 10:24:19

Hallo,


ein Beispiel zu meiner Frage.

In der Zelle 2 der Spalte B steht beispielsweise der Einkauf von einer Person.

Am Anfang steht eine Datumsangabe und danach die Einkaufsliste.

Zum Beispiel: 14.09.20 Marmelade, Toast, Butter, Schinken, Eis, ...


Bei einem neuen Einkauf soll in der "gleichen Zelle" nach gleichem Vorgehen (Datum und dann die Einkaufsliste), der Eintrag oben drüber geschrieben werden.


Ich möchte, dass nur der aktuellste Eintrag angezeigt wird, und dass maximal 3 Zeilen angezeigt werden.


Gruß

Lukas

Betrifft: AW: Zelle formatieren
von: ChrisL
Geschrieben am: 14.09.2020 15:22:15

Hi Lukas

Hier eine mögliche Interpretation.

Code ins Modul der betreffenden Tabelle kopieren.
Public strText As String

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B2")) Is Nothing Then
    If Range("B2") = "" Then
        strText = ""
        Exit Sub
    End If
    On Error GoTo errorhandler
    Application.EnableEvents = False
    If strText <> "" Then
        If InStr(Range("B2"), Chr(10)) Then Range("B2") = Split(Range("B2"), Chr(10))(0)
        If InStr(strText, Chr(10)) Then
            Range("B2") = Range("B2") & Chr(10) & Split(strText, Chr(10))(0) & _
                Chr(10) & Split(strText, Chr(10))(1)
        Else
            Range("B2") = Range("B2") & Chr(10) & strText
        End If
    End If
    strText = Range("B2")
    Application.EnableEvents = True
End If

Exit Sub
errorhandler:
Application.EnableEvents = True
MsgBox Err.Number & Chr(10) & Err.Description
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("B2")) Is Nothing Then strText = Range("B2")
End Sub
cu
Chris

Betrifft: AW: Zelle formatieren
von: Lukas
Geschrieben am: 15.09.2020 08:04:18

Hallo,

Danke für die Antwort.
Wenn ich früher ein Makro erstellt habe dann konnte ich dies einem Button hinterlegen.
Dieses Makro finde ich aber nicht, wenn ich dies auf einen Button hinterlegen möchte.
Muss ich kein Button hinterlegen?
Schön für mich wäre es, wenn der Code direkt nach Eingabe in das Feld B2 ausgeführt wird.

Gruß
Lukas

Betrifft: AW: Zelle formatieren
von: ChrisL
Geschrieben am: 15.09.2020 12:58:22

Hi Lukas

Muss ich kein Button hinterlegen? Nein (bzw. ja, musst du nicht)

Schön für mich wäre es, wenn der Code direkt nach Eingabe in das Feld B2 ausgeführt wird.
Genau, darum braucht es keinen Button.

Einfach mal probieren!

cu
Chris

Betrifft: AW: Zelle formatieren
von: Lukas
Geschrieben am: 16.09.2020 09:31:58

Hallo,

ich habe paar Werte in Zelle C2 geschrieben. Diese habe ich kopiert und in Zelle B2 eingefügt.
Wenn ich in die Zelle B2 klicke und danach aus der Zelle herausgehe, dann werden drei Einträge dargestellt. Der zweite Eintrag wird identisch mit dem ersten Eintrag. Es werden nur noch die Werte angezeigt, die in der Tabelle stehen.



Da jeder neue Eintrag mit dem aktuellen Jahr beginnt und ich nur ein Eintrag sehen möchte in der Excel Tabelle (wenn man aber auf die Zelle B3 klickt, sollen oben in dem Kästchen, neben fx alle Einträge zu sehen sein) habe ich mir gedacht, dass man alles anzeigen soll, bis zum zweiten mal das Jahr 2020 kommt.
Ich habe folgenden Code.
Sub InStr()
Dim iAnzahl As Integer
Dim sEintrag As String
Dim sEintragen As String    'ohne 2020 am Anfang
Dim sAnzeigen As String

sEintrag = Range("B2")
sEintragen = Right(sEintrag, Len(sEintrag) - 4)
iAnzahl = InStr(sEintragen, "2020")
sAnzeigen = Left(sEintrag, iAnzahl + 2)

End Sub
Ich habe den Text auf der Variablen sAnzeigen, ich weis jedoch nicht, wie man das programmieren soll, dass nur dieser Eintrag in der Tabelle angezeigt wird, aber dennoch die anderen Sachen im Kästchen(neben fx) stehen, wenn man auf das Kästchen klickt.

Danke für die bisherige Hilfe.

Gruß
Lukas

Betrifft: AW: Zelle formatieren
von: ChrisL
Geschrieben am: 16.09.2020 13:05:34

Hi

Solange die Spalte breiter wie der Text ist, kannst du die gewünschte Darstellung umsetzen (fixe Zeilenhöhe).


Die Zeilenhöhe dynamisch aufgrund der automatisch generierten Zeilenumbrüche zu steuern, sehe ich hingegen weniger realistisch.

Dein Makro solltest du nicht als InStr benennen, weil es sich dabei auch um einen VBA-Befehl (geschützter Begriff) handelt. Zudem würde ich nicht nach Jahreszahlen suchen (der Code soll ja auch nächstes Jahr noch funktionieren) und stattdessen eher die Zeilenschaltung Chr(10) suchen.

Nachfolgend ein neuer Lösungsvorschlag. Neue Logik: Aktuelle Eingabe & Alter Zelleninhalt, danach auf 3 Zeilen kürzen. Dies beisst sich natürlich, wenn du eigentlich nur den alten Eintrag abändern wolltest. Die perfekte Lösung gibt es nicht, weil das Programm deine Intention (neuer Eintrag oder Korrektur) nicht kennen kann.
Public strText As String
  
Private Sub Worksheet_Change(ByVal Target As Range)
Dim arr As Variant

If Not Intersect(Target, Range("B2")) Is Nothing Then
    If Range("B2") = "" Then
        strText = ""
        Exit Sub
    End If

    If strText <> "" Then
        strText = Range("B2") & Chr(10) & strText
        arr = Split(strText, Chr(10))
        If UBound(arr) > 2 Then ReDim Preserve arr(2)
        strText = Join(arr, Chr(10))
        
        On Error GoTo errorhandler
        Application.EnableEvents = False
        Range("B2") = strText
        Application.EnableEvents = True
    Else
        strText = Range("B2")
    End If
End If

Exit Sub
errorhandler:
Application.EnableEvents = True
MsgBox Err.Number & Chr(10) & Err.Description
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("B2")) Is Nothing Then strText = Range("B2")
End Sub
cu
Chris

Betrifft: AW: Zelle formatieren
von: Lukas
Geschrieben am: 16.09.2020 15:32:31

Hallo,

das Programm finde ich jetzt besser als vorher.
Ich habe mir gedacht, dass ich die "Aufgabe" vereinfache.
Die Zeilenhöhe wird automatisch eingestellt. Wenn die Zeilenhöhe größer als 75 ist, wird die Zeilenhöhe auf 75 gesetzt.(5 Zeilen in der Schriftgröße)

Der Code soll automatisch ausgeführt werden, dieser hat noch Fehler.
Sub Hi()
Dim dHoehe As Double

dHoehe = Range("B2").Rows.AutoFit
If dHoehe >= 75 Then
Cells(2, 2).RowHeight = 75
Else:
Cells(2, 2).Rows.AutoFit
End If

End Sub
Für dHoehe kommt bei mir -1?
Was muss ich verändern?
Danke Chris für deine Hilfe.

Gruß
Lukas

Betrifft: AW: Zelle formatieren
von: ChrisL
Geschrieben am: 16.09.2020 16:45:02

Hi
With Cells(2, 2)
    .Rows.AutoFit
    If .RowHeight >= 75 Then .RowHeight = 75
End With
cu
Chris

Betrifft: AW: Zelle formatieren
von: Lukas
Geschrieben am: 17.09.2020 08:42:01

Hallo Chris,

wann wird das Programm abgespielt?
Ich habe ein
Sub Zeilenhoehe()...End Sub
eingebaut, damit ich das Programm abspielen kann.
Sub Zeilenhoehe()

With Cells(2, 2)
    .Rows.AutoFit
    If .RowHeight >= 75 Then .RowHeight = 75
End With

End Sub
Ich habe es bisher nicht hinbekommen, dass die Zeilenhöhe automatisch, ohne Sub, eingestellt wird.
Kann das Programm automatisch ohne
Sub ausgeführt werden?

Gruß
Lukas


Betrifft: AW: Zelle formatieren
von: ChrisL
Geschrieben am: 17.09.2020 17:40:46

Hi Lukas

Ich würde es zwischen End If und Exit Sub ins Change-Ereignis einkopieren.

Call Zeilenhoehe

oder direkt den Code in die Prozedur integrieren.

cu
Chris

Betrifft: AW: Zelle formatieren
von: ChrisL
Geschrieben am: 17.09.2020 18:42:45

Ich Schussel... nicht nötig, dass der Schnipsel jedes mal abgespielt wird. Besser weiter oben einfügen.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim arr As Variant
    
    If Not Intersect(Target, Range("B2")) Is Nothing Then
        If Range("B2") = "" Then
            strText = ""
            Exit Sub
        End If
    
        If strText <> "" Then
            strText = Range("B2") & Chr(10) & strText
            arr = Split(strText, Chr(10))
            If UBound(arr) > 2 Then ReDim Preserve arr(2)
            strText = Join(arr, Chr(10))
            
            On Error GoTo errorhandler
            Application.EnableEvents = False
            Range("B2") = strText
            Application.EnableEvents = True

With Cells(2, 2)
    .Rows.AutoFit
    If .RowHeight >= 75 Then .RowHeight = 75
End With

        Else
            strText = Range("B2")
        End If
    End If
    
    Exit Sub
    errorhandler:
    Application.EnableEvents = True
    MsgBox Err.Number & Chr(10) & Err.Description
    End Sub

cu
Chris

Beiträge aus dem Excel-Forum zum Thema "Zelle formatieren"