Clever-Excel-Forum

Normale Version: Ist das bei Excel alles ganz normal?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
... und nun, wie weiter?
Code:
Sub M_snb()
    For Each it In Tabelle1.Comments
        With it.Shape
            .LockAspectRatio = -1
            .TextFrame.AutoSize = 0
        End With
    Next
End Sub
(28.08.2021, 08:44)schauan schrieb: [ -> ]Hallöchen,

VBA:

Alternativ könnte man mit etwas Aufwand beim Wechsel in eine Zelle die Kommentargröße ermitteln und beim Wechsel in eine andere Zelle die Kommentargröße der vorherigen Zelle wiederherstellen.

(29.08.2021, 08:35)TxbyFmjy schrieb: [ -> ]Dieses Schnitzel gehört nicht in ein Modul, sondern unter Microsoft Exel Objekte in DieseArbeitsmappe.

Das ist falsch: Dieses Schnitzel gehört nicht in ein Modul, sondern unter Microsoft Exel Objekte in DieseArbeitsmappe.

Das ist richtig: Dieses Schnitzel gehört nicht in ein Modul, sondern unter Microsoft Exel Objekte in die Tabelle (hier: Tabelle1), in der das Makro seinen Dienst tun soll.

Code:
Option Explicit
Public ACA As String

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

'** Excel 2016: Keep in mind however, that executing the Worksheet_SelectionChange macro destroys the Undo stack, so using _
this technique essentially disables Excel's Undo feature.

Dim H As Double
Dim W As Double
Cells.Interior.ColorIndex = xlNone
With ActiveCell
On Error Resume Next

    Range(ACA).Comment.Shape.Height = 150 '** 5,29 cm
    Range(ACA).Comment.Shape.Width = 300  '** 10,58 cm
   
    Debug.Print ACA; Range(ACA).Comment.Shape.Height; Range(ACA).Comment.Shape.Width

    H = .Comment.Shape.Height
    W = .Comment.Shape.Width
   
    .EntireRow.Interior.Color = RGB(219, 229, 241)
    .EntireColumn.Interior.Color = RGB(219, 229, 241)

    ACA = ActiveCell.Address

    Debug.Print ACA; H; W

End With
On Error GoTo 0
End Sub

Nachteil dieser Lösung: Beachte aber, dass das Ausführen des Worksheet_SelectionChange Makros den Undo Stack zerstört, sodass bei der Benutzung dieser Technik de facto Excel's Undo Feature deaktiviert wird.

Diese Lösung funktioniert jedoch nur dann, wenn zuerst die Zelle und dann das zugehörige Kommentar selektiert wird. Wird das Kommentar direkt selektiert, passiert nichts.
Grund: Kommentar hinzufügen, bearbeiten oder löschen löst das Change event nicht aus, sodass kein Change event der Kommentare ausgewertet werden kann.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)

'** Excel's Undo stack is destroyed whenever an event procedure makes a change to the worksheet.

Dim H2 As Double
Dim W2 As Double
With ActiveCell
On Error Resume Next
    H2 = .Comment.Shape.Height '** Excel 2016: Adding, editing or deleting a cell comment doesn't trigger the Change event.
    W2 = .Comment.Shape.Width
   
    ACA2 = ActiveCell.Address

    Debug.Print ACA2; H2; W2

End With
On Error GoTo 0
End Sub

[attachment=40010]
Hallöchen,

sorry, aber vielleicht schreibst Du auch mal, was genau die Frage ist. Schnitzel gab's bei uns vor zwei Wochen zuletzt und wenn da Lösungen funktionieren und Dir ist es trotz eventueller Nachteile oder Einschränkungen recht, ist ja alles gut. 92
(30.08.2021, 17:09)TxbyFmjy schrieb: [ -> ]Nachteil dieser Lösung: Beachte aber, dass das Ausführen des Worksheet_SelectionChange Makros den Undo Stack zerstört, sodass bei der Benutzung dieser Technik de facto Excel's Undo Feature deaktiviert wird.

Diese Lösung funktioniert jedoch nur dann, wenn zuerst die Zelle und dann das zugehörige Kommentar selektiert wird. Wird das Kommentar direkt selektiert, passiert nichts.
Grund: Kommentar hinzufügen, bearbeiten oder löschen löst das Change event nicht aus, sodass kein Change event der Kommentare ausgewertet werden kann.

(30.08.2021, 17:23)schauan schrieb: [ -> ]Hallöchen,

sorry, aber vielleicht schreibst Du auch mal, was genau die Frage ist. Schnitzel gab's bei uns vor zwei Wochen zuletzt und wenn da Lösungen funktionieren und Dir ist es trotz eventueller Nachteile oder Einschränkungen recht, ist ja alles gut. 92

Sorry, aber ich habe die Nachteile dieser Lösung geschildert, weil ich offensichtlich damit nicht zufrieden bin und jemand der darüber Bescheid weiß, wüsste vielleicht eine bessere Lösung oder könnte erklären, dass es keine bessere Lösung gibt.

Gerne kann ich die Frage noch einmal explizit für dich formulieren: Gibt es für diese Lösung eine noch bessere Lösung, durch die die geschilderten Probleme vermieden werden können?
Hallöchen,

was übrig bleibt und wo Du noch nicht Stellung bezogen hast hatte ich in #6 geschrieben, hier mal um zwei Eigenschaften erweitert:

Du müsstest ggf. eine Standardgröße und/oder ein Standardseitenverhältnis und/oder eine Standardposition festlegen was dann alles beim Speichern für alle Kommentare der Mappe oder eines Blattes wieder eingestellt wird.
(30.08.2021, 17:09)TxbyFmjy schrieb: [ -> ]Das ist falsch: Dieses Schnitzel gehört nicht in ein Modul, sondern unter Microsoft Exel Objekte in DieseArbeitsmappe.

Das ist richtig: Dieses Schnitzel gehört nicht in ein Modul, sondern unter Microsoft Exel Objekte in die Tabelle (hier: Tabelle1), in der das Makro seinen Dienst tun soll.

Schnitzel war ein Tippfehler. Richtig ist vielmehr Schnipsel.

(28.08.2021, 08:44)schauan schrieb: [ -> ]Hallöchen,

VBA:

Oder Du hast eine Standardgröße und stellst diese vor dem Speichern der Datei wieder her.
Oder ...

Diese Schnipsel gehören nicht in ein Modul, sondern unter Microsoft Exel Objekte in DieseArbeitsmappe.

Code:
Option Explicit
Dim ScaleValue1 As Double

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim objComment As Comment
Dim ScaleValue2 As Double

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

For Each objComment In ActiveSheet.Comments

'Resize
        With objComment.Shape

            .LockAspectRatio = msoFalse
            .TextFrame.AutoSize = False

        ScaleValue2 = .Height / .Width

        If ScaleValue2 <> ScaleValue1 Then
        .Width = 150
        .Height = .Width * ScaleValue1

            .LockAspectRatio = msoTrue

        Debug.Print ScaleValue1; ScaleValue2; .Width; .Height

        End If
        End With

        Debug.Print ScaleValue1; ScaleValue2; objComment.Shape.Width; objComment.Shape.Height

Next

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Code:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim objComment As Comment
Dim ScaleValue2 As Double

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

For Each objComment In ActiveSheet.Comments

'Resize
        With objComment.Shape

            .LockAspectRatio = msoFalse
            .TextFrame.AutoSize = False

        ScaleValue2 = .Height / .Width

        If ScaleValue2 <> ScaleValue1 Then
        .Width = 150
        .Height = .Width * ScaleValue1

            .LockAspectRatio = msoTrue

        Debug.Print ScaleValue1; ScaleValue2; .Width; .Height

        End If
        End With

        Debug.Print ScaleValue1; ScaleValue2; objComment.Shape.Width; objComment.Shape.Height

Next

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Code:
Private Sub Workbook_Open() '** Beim Öffnen der Arbeitsmappe wird das richtige Seitenverhältnis am Kommentar 1 ermittelt.
Dim objComment As Comment
Dim i As Integer
Dim SV As Double
i = 0

For Each objComment In ActiveSheet.Comments
i = i + 1
With objComment.Shape
SV = .Height / .Width
End With
If i = 1 Then GoTo LabelFinish
Next
LabelFinish:
ScaleValue1 = SV
Debug.Print SV; ScaleValue1
End Sub

Diese Lösung bringt jedoch leider auch ein Problem mit sich, wenn die Tabelle Hunderte oder über Tausend Kommentare enthält, weil dann das Speichern der Datei für Benutzer*innen inakzeptabel lange dauert.

Auch funkioniert diese Lösung nur, wenn die Arbeitsmappe nur eine Tabelle enthält und nicht zwischen weiteren Tabellen hin- und hergewechselt wird und das Seitenverhälltnis aller Kommentare identisch ist.

Im Modul1 befindet sich zum Durcheinanderbringen aller Kommentare folgendes Schnipsel:

Code:
Private Sub comments_mathematical_exact_arrangement()

    Dim objComment As Comment
    Dim i As Long
    Dim j As Double
    Dim z As Double
    i = 0
        If ActiveSheet.Comments.Count = 0 Then
         MsgBox "No comments in entire sheet"
         Exit Sub
        End If
        ' Alle Kommentare des aktuellen Arbeitsblatts durchlaufen
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
        For Each objComment In ActiveSheet.Comments
                i = i + 1
                z = Rnd              
                If z <= 0.1 Then
                    j = i * z ^ 1
                    ElseIf z <= 0.2 Then j = i * z ^ 2
                    ElseIf z <= 0.3 Then j = i * z ^ 3
                    ElseIf z <= 0.4 Then j = i * z ^ 4
                    ElseIf z <= 0.5 Then j = i * z ^ 5
                    ElseIf z <= 0.6 Then j = i * z ^ 6
                    ElseIf z <= 0.7 Then j = i * z ^ 7
                    ElseIf z <= 0.8 Then j = i * z ^ 8
                    ElseIf z <= 0.9 Then j = i * z ^ 9
                    ElseIf z <= 1 Then j = i * z ^ 10
                End If                          
            With objComment

                .Shape.TextFrame.AutoSize = True

                If j <= 10 Then
                    .Shape.Top = .Parent.Top + (.Parent.Height * (j / 10))
                    .Shape.Left = .Parent.Left + (.Parent.Width * (j / 10))
                ElseIf j <= 100 Then
                    .Shape.Top = .Parent.Top + (.Parent.Height * (j / 10))
                    .Shape.Left = .Parent.Left + (.Parent.Width * (j / 100))
                 ElseIf j <= 1000 Then
                    .Shape.Top = .Parent.Top + (.Parent.Height * (j / 10))
                    .Shape.Left = .Parent.Left + (.Parent.Width * (j / 1000))
                ElseIf j <= 10000 Then
                    .Shape.Top = .Parent.Top + (.Parent.Height * (j / 100))
                    .Shape.Left = .Parent.Left + (.Parent.Width * (j / 100))
                End If
            End With      
        Next      
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
    On Error GoTo 0
End Sub

(29.08.2021, 10:01)schauan schrieb: [ -> ]... und nun, wie weiter?

"Vorwärts immer, rückwärts nimmer!"

Die Arbeit geht weiter. Eine abgerundete Lösung zu finden, ist nicht trivial.

(28.08.2021, 08:44)schauan schrieb: [ -> ]Hallöchen,

VBA:

Oder ...

[attachment=40025]
Hallöchen,

Du merkst ja an den "zahlreichen" Antwortern, dass da wohl nix mehr kommen wird. Wo Licht ist, ist auch Schatten. Nun finde mal das Licht ohne Schatten ...

Zitat:wenn die Tabelle Hunderte oder über Tausend Kommentare enthält

ja, wenn die jemand alle ändert, der hat Zeit 15 .
Du kannst Code übrigens auch beim Blattwechsel ausführen. Wo der hingehört, wissen wir Smile

Zitat:Deshalb ist 'Menüpunkt "Kommentar bearbeiten" aus dem Kontextmenü entfernen' keine Lösung.
Mal weiter gedacht, füge die Kommentare mit einem eigenen Makro ein bzw. ändere sie mit einem eigenen Makro.
(01.09.2021, 18:55)schauan schrieb: [ -> ]Hallöchen,

Du merkst ja an den "zahlreichen" Antwortern, dass da wohl nix mehr kommen wird. Wo Licht ist, ist auch Schatten. Nun finde mal das Licht ohne Schatten ... 

Früher nannte man so etwas Einzelunterricht (hier: bei schauan). Nur die Besten erhielten Zugang zum Einzelunterricht.

(01.09.2021, 18:55)schauan schrieb: [ -> ]Hallöchen,

ja, wenn die jemand alle ändert, der hat Zeit  15 .

Niemand muss über Tausend Kommentare auf einmal ändern. Thema verfehlt. Das "Problem" ist zur Zeit jedoch, dass beim Schließen, Speichern alle Kommentare auf eine Größenänderung hin abgeklappert werden und das dauert natürlich.

(01.09.2021, 18:55)schauan schrieb: [ -> ]Hallöchen,

Du kannst Code übrigens auch beim Blattwechsel ausführen. Wo der hingehört, wissen wir Smile
Das "wir" das wissen sollte nicht das Ziel eines Forums sein. Andere werden das hier vielleicht lesen und durch meinen Hinweis eine Hilfe erfahren.

Ich hatte einmal einen Such-Treffer (Suche: Excel Kommentare Größe) in einem Forum, wo dem Hilfesuchenden nicht nur eine Lösung angeboten wurde, sondern auch noch erklärt wurde, wo hinein das Schnipsel gehört. Das hat mir sehr geholfen.

Zitat:Excel Kommentar Größe automatisch anpassen, Exl121150, Erfahrener User, 8. Februar 2018

Will man, dass neu hinzugefügte Kommentare automatisch größenmäßig angepasst werden, muss man das Ganze in eine Ereignisbehandlungsroutine (entweder der Arbeitsmappe oder des Arbeitsblattes) einfügen.

Willst du, dass die automatische Kommentar-Größenanpassung in der gesamten Arbeitsmappe (also in allen Arbeitsblättern dieser Mappe) wirksam ist, musst du die Anpassung zB. in die "SheetSelectionChange"-Ereignisbehandlung des "ThisWorkbook"/"DieseArbeitsmappe"-Objektes einbauen:

Code:
Option Explicit

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
  With Target
    If Not .Comment Is Nothing Then
      With .Comment.Shape.TextFrame
       .AutoSize = True
       .AutoMargins = False
       .MarginTop = 0
       .MarginLeft = 0
       .MarginRight = 10  'Pt: 10 Pt = 0,35 cm   (72 Pt = 1" = 2,54 cm)
       .MarginBottom = 10 'Pt
      End With
    End If
  End With
End Sub

Dazu gehst du folgendermaßen vor:

1) Du drückst im aktiven Arbeitsblatt die Tastenkombination Alt+F11, sodass du in den VBA-Code-Editor gelangst.
2) Falls dort das "Projekt-VBAProjekt"-Fenster nicht zu sehen ist, drückst die Tastenkombination Strg-R
3) Dort machst du einen Doppelklick auf den Listeneintrag "DieseArbeitsmappe" (bzw. "ThisWorkbook") im Unterabschnitt "Microsoft Excel Objekte", sodass das Code-Editierfenster der Arbeitsmappe eingeblendet wird.
4) Dort fügst du das von oben kopierte Makro ein.
5) Das Makro von vorhin sieht zB. zusätzlich vor, dass der untere Kommentarfensterrand 10 Pt (=0,35 cm) beträgt und ebenso der rechte Fensterrand, während der Rand oben und links =0 Pt beträgt --> an deine Wünsche anpassen!
6) Mit Tastenkombination Alt-F11 wieder zurück ins Arbeitsblatt wechseln und Arbeitsmappe (als *.xlsm-Datei) speichern.

Willst du jedoch die Größenautomatik für die Kommentarfenster nur in einem bestimmten Arbeitsblatt haben, müsstest du in Punkt 3) statt auf "DieseArbeitsmappe" einen Doppelklick auf den Listeneintrag für das betreffende Arbeitsblatt (zB. "Tabelle4 (TabName)") machen, sodass das Codemodul-Fenster dieses Blattes erscheint, in welches du dann folgendes Makro kopieren solltest:

Code:
Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With Target
    If Not .Comment Is Nothing Then
      With .Comment.Shape.TextFrame
       .AutoSize = True
       .AutoMargins = False
       .MarginTop = 0
       .MarginLeft = 0
       .MarginRight = 10  'Pt: 10 Pt = 0,35 cm   (72 Pt = 1" = 2,54 cm)
       .MarginBottom = 10 'Pt
      End With
    End If
  End With
End Sub

Jedes Forum ist andersartig 15 .
Hallöchen,

warum postest Du eigentlich die Codes mit ...SelectionChange... wenn die Deinem Anspruch wegen der eingeschränkten UNDO-Funktion nicht gerecht werden?
Du fügst die auch häufig als Zitat ein. Soll das auch für den aufmerksamen Leser gut sein? Ich finde das ziemlich hinderlich. Die Threads werden immer länger und unübersichtlicher und es wird immer schwieriger, herauszufinden, was Du willst und was nicht. Gilt das mit dem UNDO vielleicht inzwischen nicht mehr, weil es im Zitat fehlt? Falls doch, wie gesagt, es fällt nicht leicht, zwischen den ganzen Zitaten einzelne Info's zu finden ...

Hast Du nun mal versucht, Kommentare mit einem eigenen Makro einzufügen, zu bearbeiten und zu löschen?
Seiten: 1 2 3