Der erste alphanumerische Wert

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Der erste alphanumerische Wert

#1

Beitrag von d'r Bastler »

Moin allerseits,

das suchte jemand ein Möglichkeit, seine Adresstabelle jeweils nach dem ersten Buchstaben zu filtern. Mit der Eingabe M möchte er gerne alle Müller, Meier, Mayer, Meir und Motzers ... sehen, aber alle andere nicht.

Angeboten wurden ihm zielführende Formel-Lösungen. Ich biete hier eine VBA-Lösung an: Man nehme eine beliebige Tabelle mit Kunden, Socken oder Hobbies und ergänze in ein Allg. Modul diesen Code:

Code: Alles auswählen

Option Explicit

Private Sub ClickOnShape()
Dim i As Integer, r As Integer, sName As String

sName = ""

With ActiveSheet
    Cells.EntireRow.Hidden = False
    r = .Cells(Rows.Count, 1).End(xlUp).Row
    sName = .Shapes(Application.Caller).Name
End With

For i = 9 To r
    Cells.EntireRow(i).Hidden = True
Next i
'MsgBox sName, , r

If Right(sName, 1) = "*" Then
    Cells.EntireRow.Hidden = False
    Exit Sub
Else
    For i = 9 To r
        Cells.EntireRow(i).Hidden = True
        If Left(Cells(i, 1), 1) = Right(sName, 1) Then
            Cells.EntireRow(i).Hidden = False
        End If
    Next i
End If
       
End Sub

Private Sub ShowTime(sgDelay As Single)
Dim sgShow As Single

sgShow = Timer + sgDelay    'sgDelay = 0.05 = 0,05 Sekunden
    Do While Timer < sgShow
        DoEvents
    Loop
    
End Sub

Sub MakeDir29()
Dim shp As Shape
Dim i As Integer, a As Integer, c As Integer, r As Integer, iOffset As Integer      'dynamische Parameter
Dim iLeft As Integer, iTop As Integer, iWidth As Integer, iHeight As Integer        'fixe Parameter
Dim aChrs

aChrs = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "Ä", "Ö", "Ü", "*")

For Each shp In ActiveSheet.Shapes
    If Left(shp.Name, 4) = "Dir_" Then
        shp.Delete
    End If
Next

iLeft = 50: iTop = 25: iWidth = 50: iHeight = 25       'wo soll das erste Segment wie hoch und breit denn hin?
iOffset = iLeft

i = 0
With ActiveSheet
For c = 1 To 15
    .Shapes.AddShape(msoShapeRectangle, iOffset, iTop, iWidth, iHeight).Select
            With Selection.ShapeRange.Fill
                .Visible = msoTrue
                .ForeColor.RGB = RGB(200, 200, 255)
                .Transparency = 0
                .Solid
            End With
            With Selection.ShapeRange
                .Name = "Dir_ " & aChrs(i)
                .TextFrame.Characters.Text = aChrs(i)
            End With
    i = i + 1
    iOffset = iOffset + iWidth * 1.05               'hier lässt sich der horizontale Abstand zwischen Shapes feinjustieren
    ShowTime 0.01
Next c

iLeft = 50: iTop = 54: iOffset = iLeft              'hier lässt sich der vertikale Abstand zwischen Zeile 1 & 2 feinjustieren
For c = 1 To 15
    .Shapes.AddShape(msoShapeRectangle, iOffset, iTop, iWidth, iHeight).Select
            With Selection.ShapeRange.Fill
                .Visible = msoTrue
                .ForeColor.RGB = RGB(200, 200, 255)
                .Transparency = 0
                .Solid
            End With
            With Selection.ShapeRange
                .Name = "Dir_ " & aChrs(i)
                .TextFrame.Characters.Text = aChrs(i)
            End With
        i = i + 1
        iOffset = iOffset + iWidth * 1.05
        ShowTime 0.01
Next c

    For Each shp In ActiveSheet.Shapes                          'hier bekommen ALLE Shapes ihr Fett weg: 1.) Textformatierung
        shp.Select
        With Selection.ShapeRange
                .TextFrame.Characters.Font.Color = RGB(0, 0, 0)
                .TextFrame.Characters.Font.Bold = True
                .TextFrame.Characters.Font.Size = 16
                .TextFrame.HorizontalAlignment = xlCenter
                .TextFrame.VerticalAlignment = xlCenter
        End With
        shp.OnAction = "ClickOnShape"                           'hier bekommen ALLE Shapes ihr Fett weg: 2.) ihr Universal-Makro verpasst
    Next
    .Cells(1, 1).Select
End With

End Sub
Wichtig: Die ersten 8 Zeilen bleiben bitte leer!

Dann führe man das Makro MakeDir29 (Alt-F8) aus und teste. Jeder als Shape dargestellte Buchstabe setzt einen Filter. Das "'*" zeigt wieder alle Einträge.

Lässt sich auf die verschiedensten Listen anwenden und anpassen.

Viel Spaß damit!
lg

Nachtrag: Step-by-step für VBAnfänger:
Zuerst oberhalb der Daten acht Leerzeilen einfügen: Rechte Maustaste in Zeile 1: Zellen einfügen x 8.
Dann mit Alt+F11 den VB-Editor öffnen.
Im linken oberen Fenster (Projekt-Explorer) mit der rechten Maustaste > Einfügen > Modul das allg. Modul bauen
Den gesamten Code von hier kopieren und in das neue Modul (großes Fenster rechts) einfügen (gibt es die Zeile Option Expl... zweimal, eine davon löschen)
Zurück zur Tabelle, dort mit Alt+F8 das Makro-Menü aufrufen und MakeDir29 ausführen.
Zeitaufwand: keine zwei Minuten ;)
Den Editor schließen und testen ....
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Der erste alphanumerische Wert

#2

Beitrag von thowe »

Moin!

Im Code sehe ich:

Code: Alles auswählen

Private Sub ClickOnShape()
Ich vermute da soll ein Shape (Einfügen Formen. vermutlich TextBox (auch noch schön kunterbund designed mit .Caption "FILTERN!") existieren, nicht?

lg
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Der erste alphanumerische Wert

#3

Beitrag von d'r Bastler »

Fast geenauu!!

Funktionieren kann das Ganze nur mit den per MakeDir29 geneierten Shapes, die einfach nur Rectangles (also keine Textboxen) mit standardisierten Namen ("Dir_" & aChrs(i) sind.

Einmal step-by-step durch und Spaß haben...
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Der erste alphanumerische Wert

#4

Beitrag von thowe »

Aaah okay heb,

hab es vertanden, jetzt
danke!
lg
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Der erste alphanumerische Wert

#5

Beitrag von d'r Bastler »

Moin allerseits,

und hier nun noch ein Version, die 1.) hoffentlich jeden Wartekringel (übrigens das beste Weihnachtsgebäck von Welt, weil definitiv CO2 neutral und Gluten-frei) vermeidet, 2.) jetzt auch numerische Einträge im Verzeichnis filtert und 3.) mit nur einem Makro sofort Test-bereit ist.

Man nehme eine leere Arbeitsmappe, öffne den VBE und packe den folgenden Code in ein Allg. Modul. Anschließend führt man per Alt+F8 das Makro Setup aus und fröne fröhlichem Testen. Die Test-Daten werden gleich mitgeliefert :)

Code: Alles auswählen

Option Explicit

Sub Setup()
ActiveSheet.Cells.Clear
    MakeDir30
    MakeTestData
End Sub

Private Sub MakeDir30()
Dim shp As Shape
Dim i As Integer, a As Integer, c As Integer, r As Integer, iOffset As Integer      'dynamische Parameter
Dim iLeft As Integer, iTop As Integer, iWidth As Integer, iHeight As Integer        'fixe Parameter
Dim aChrs

aChrs = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "---", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "Ä", "Ö", "Ü", "123", "*")

For Each shp In ActiveSheet.Shapes
    If Left(shp.Name, 4) = "Dir_" Then
        shp.Delete
    End If
Next

iLeft = 50: iTop = 25: iWidth = 50: iHeight = 25       'wo soll das erste Segment wie hoch und breit denn hin?
iOffset = iLeft

i = 0
With ActiveSheet
For c = 1 To 16
    .Shapes.AddShape(msoShapeRectangle, iOffset, iTop, iWidth, iHeight).Select
            With Selection.ShapeRange.Fill
                .Visible = msoTrue
                .ForeColor.RGB = RGB(200, 200, 255)
                .Transparency = 0
                .Solid
            End With
            With Selection.ShapeRange
                .Name = "Dir_ " & aChrs(i)
                .TextFrame.Characters.Text = aChrs(i)
            End With
    i = i + 1
    iOffset = iOffset + iWidth * 1.05               'hier lässt sich der horizontale Abstand zwischen Shapes feinjustieren
    ShowTime 0.01
Next c

iLeft = 50: iTop = 54: iOffset = iLeft              'hier lässt sich der vertikale Abstand zwischen Zeile 1 & 2 feinjustieren
For c = 1 To 16
    .Shapes.AddShape(msoShapeRectangle, iOffset, iTop, iWidth, iHeight).Select
            With Selection.ShapeRange.Fill
                .Visible = msoTrue
                .ForeColor.RGB = RGB(200, 200, 255)
                .Transparency = 0
                .Solid
            End With
            With Selection.ShapeRange
                .Name = "Dir_ " & aChrs(i)
                .TextFrame.Characters.Text = aChrs(i)
            End With
        i = i + 1
        iOffset = iOffset + iWidth * 1.05
        ShowTime 0.01
Next c

    For Each shp In ActiveSheet.Shapes                          'hier bekommen ALLE Shapes ihr Fett weg: 1.) Textformatierung
        shp.Select
        With Selection.ShapeRange
                .TextFrame.Characters.Font.Color = RGB(0, 0, 0)
                .TextFrame.Characters.Font.Bold = True
                .TextFrame.Characters.Font.Size = 16
                .TextFrame.HorizontalAlignment = xlCenter
                .TextFrame.VerticalAlignment = xlCenter
        End With
        shp.OnAction = "ClickOnShape"                           'hier bekommen ALLE Shapes ihr Fett weg: 2.) ihr Universal-Makro verpasst
    Next
    
    
    .Cells(1, 1).Select
End With

End Sub

Private Sub ShowTime(sgDelay As Single)
Dim sgShow As Single

sgShow = Timer + sgDelay    'sgDelay = 0.05 = 0,05 Sekunden
    Do While Timer < sgShow
        DoEvents
    Loop
    
End Sub

Private Sub MakeTestData()
Dim i As Integer, r As Integer, c As Integer
Dim aChrs
aChrs = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "Ä", "Ö", "Ü", "123")
r = 9

For i = 0 To UBound(aChrs)
    For c = 1 To 30
        Cells(r, 1) = aChrs(i)
        r = r + 1
    Next c
Next i

Columns(1).NumberFormat = "@"
End Sub

Private Sub ClickOnShape()
Dim i As Integer, r As Integer, sName As String, sValue As String

Application.ScreenUpdating = False
With ActiveSheet
    Cells.EntireRow.Hidden = False
    r = .Cells(Rows.Count, 1).End(xlUp).Row
    sName = .Shapes(Application.Caller).Name
End With

For i = 9 To r
    Cells.EntireRow(i).Hidden = True
Next i
'MsgBox sName, , r

If Right(sName, 1) = "*" Then
    Cells.EntireRow.Hidden = False
    Exit Sub
ElseIf Right(sName, 1) = "-" Then
    For i = 9 To r
        Cells.EntireRow(i).Hidden = True
    Next i
    Exit Sub
Else
    For i = 9 To r
        sValue = Cells(i, 1)
        Cells.EntireRow(i).Hidden = True
        If Left(sValue, 1) = Right(sName, 1) Then
            Cells.EntireRow(i).Hidden = False
        ElseIf IsNumeric(Left(sValue, 1)) = True Then
            Cells.EntireRow(i).Hidden = False
        End If
    Next i
End If
Application.ScreenUpdating = True

End Sub
Viel Spaß damit!
Zuletzt geändert von d'r Bastler am 21. Sep 2024, 14:33, insgesamt 1-mal geändert.
Folgende Benutzer bedankten sich beim Autor d'r Bastler für den Beitrag:
Amigo2
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Der erste alphanumerische Wert

#6

Beitrag von d'r Bastler »

Moin allerseits,

und hier noch ein kleines Pro/Con Userform-Buttons vs. Shapes:

Über Jahre habe ich als HumanDeviceInterface (HDI) der ersten Wahl XL UserForms (USF) genutzt und empfohlen. thowe hat aus eigenen Projekten berichtet, die Shapes (SHP) anstelle der USF nutzen. Und tatsächlich gibt es Aufgaben, für die SHPs erheblich besser geeignet sind als USFs.

Der größte Vorteil liegt darin, dass dynamisch generierten Shapes mithilfe ihres Namens die auszuführenden Prozeduren mitgegeben werden können. Für USFs geht das nur mit einer zusätzlichen Variablen, die man manuell füllen muss. Diesen Vorteil habe ich im vorliegenden Code genutzt. Außerdem sind sie optisch durchaus hübscher :v:

Schwieriger wird es, wenn es um die vielfältigen Features der USFs geht. SHPs können außer dem Click_Event erst einmal nichts. Das aber ziemlich gut. Mit dem kann man dann aber doch auch USFs aufrufen und viele andere VBA-Möglichkeiten nutzen.

Meine HDI-Welt hat sich dank thowes Tipp durchaus verändert. Danke dafür!

lg
Folgende Benutzer bedankten sich beim Autor d'r Bastler für den Beitrag:
thowe
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
xlKing
Beiträge: 37
Registriert: 30. Mai 2024, 19:42
Hat sich bedankt: 2 Mal
Danksagung erhalten: 35 Mal
Kontaktdaten:

Re: Der erste alphanumerische Wert

#7

Beitrag von xlKing »

Hallo heb,

Wie ich sehe arbeitest du immer noch mit Select und Selection. Die AddShape-Methode gibt das entsprechende Shape zurück. Du kannst hier also eigentlich auch mit With oder mit Set arbeiten. Was ich dir/euch aber eigentlich zeigen will, ist dass es eine Alternative zum Auslesen des Shape-Namens gibt. Anstatt den Buchstaben über den Shapenamen zu ermitteln kannst du ihn auch über einen Parameter übergeben. Damit bist du von Shapenamen und Shapebeschriftung unabhängig. Dazu einfach den bzw. die Parameter (bei Strings mit zusätzlichem Anführungszeichen) mit einem Leerzeichen hinter den Makronamen der OnAction-Eigenschaft schreiben und das Ganze mit in Apostrophe einschließen. Gib den folgenden Code in ein allgemeines Modul und teste mit Spaß.

Code: Alles auswählen

Sub Test()

For s = 1 To 3
  With ActiveSheet.Shapes.AddShape(msoShapeRectangle, Cells(1, s).Left, Cells(1, s).Top, Cells(1, s).Width, Cells(1, s).Height)
    .TextFrame.Characters.Text = "Bst " & s
    .OnAction = "'Buchstabe """ & Chr(64 + s) & """'"
  End With
Next s

End Sub

Sub Buchstabe(Bst As String)
  MsgBox Bst
End Sub
Abgesehen davon funktioniert dein Code super mit dem ersten Zeichen. Aber was machst du wenn z.B. nach den ersten 3 Zeichen gefiltert werden soll? z.B. Alle Namen die mit SCH beginnen? Ich wäre das Ganze ohne VBA oder nur mit ein bisschen VBA über den erweiterten Filter angegangen. Dazu in einem Leeren Blattmodul diesen Code eingeben und DatenErstellen ausführen. Dann in Celle A2 ein nach einem beliebigen Zeichen (hier M*, S* oder L*) filtern oder leeren um Alles zu sehen. Viel Spaß.

Code: Alles auswählen

Sub DatenErstellen()
  Cells(1, 1) = "Name"
  Cells(1, 2) = "Vorname"
  Namen = Array("Name", "Meier", "Schulze", "Lehmann", "Schmidt", "Müller")
  Namen = Application.Transpose(Namen)
  Range("A4:A9") = Namen
  Vornamen = Array("Vorname", "Paul", "Gerda", "Robert", "Stefanie", "Michael")
  Vornamen = Application.Transpose(Vornamen)
  Range("B4:B9").Value = Vornamen
  
  Cells(2, 1) = "M*"
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  On Error Resume Next
  If Not Intersect(Target, Range("A2:B2")) Is Nothing Then
    lastrow = UsedRange.Row + UsedRange.Rows.Count - 1
    Range("A4:A" & lastrow).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("A1:B2"), Unique:=False
  End If
End Sub
Gruß Mr. K.
Folgende Benutzer bedankten sich beim Autor xlKing für den Beitrag:
d'r Bastler
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Der erste alphanumerische Wert

#8

Beitrag von thowe »

Moin!

@ heb:
Schwieriger wird es, wenn es um die vielfältigen Features der USFs geht. SHPs können außer dem Click_Event erst einmal nichts.
.

Das ist korrekt, aber:

wenn sowieso mehrere Shapes (oder auch Controls) im Arbeitsblatt, eingefügt werden, verwendet man Classes. Hier kann man sich noch nicht zur Verfügung stehende Events bauen. Das gilt natürlich auch für Controls in UserForms. Hier ist der Vorteil das man Controls eingebunden via eigene Klassen die vorhandenen Events (zB TextBox1_DblClick()) in die Klasse (oder im Modul) einbauen, und das gilt dann - eben - für alle TextBoxen die auf Basis der Klasse existieren....

Zu Shapes am Arbeitsblatt könnte das so aussehen...

Klassenmodul: clsMyShapeButton

Code: Alles auswählen

Option Explicit
Private m_ShapeButton_Okay As Shape

Public Property Get ButtonShape() As Shape
    Set ButtonShape = m_ShapeButton_Okay
End Property

Public Property Let ButtonShape(ByVal pShape As Shape)
    Set m_ShapeButton = pShape
End Property

Public Property Set ButtonShape(ByVal pShape As Shape)
    Set m_ShapeButton_Okay = pShape
End Property

In irgendein Modul:

Code: Alles auswählen

Option Explicit
Private myShapeButton As clsMyShapeButton 
Sub ShapeButtons_Initialize()

    Dim myShapeItem As Shape
    Dim myShapeButton As New clsMyShapeButton 
    Dim i As Long 'Iterator
    
    Set myShapeItem = wshNavigation.Shapes("shpOkayGM1")
    'Calls Public Property Set ButtonShape
    Set myShapeButton.ButtonShape = myShapeItem
    
    MsgBox myShapeButton.ButtonShape.Name
    
End Sub

und schließlich [b]der Aufruf:[/b]

[code]
Sub TESTS_ShapeButtons()

	Call ShapeButtons_Initialize
	'Call kann wegfallen....

LG
[/code]
Folgende Benutzer bedankten sich beim Autor thowe für den Beitrag:
d'r Bastler
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Der erste alphanumerische Wert

#9

Beitrag von d'r Bastler »

Moin Mr.K

herzlichen Dank für Deinen aufschlussreichen Kommentar zu meinem Machwerk, dem ich erst einmal das Prädikat "Bastelei eines blutigen Shape-Anfängers" verleihen muss. Tatsächlich sind mir diese Gebilde alles andere als vertraut und so greife ich natürlich auf die Ergebnisse von Recherchen im Netz zurück. Wo immer ich kann (und das ist das Schlüsselwort), verzichte auf Select. Bei den Shapes ist es mir aber ohne dieses Fossil nicht gelungen, sie zu formatieren.

Zur Aufgabenstellung: Gesucht war genau das, was im Titel steht. Dein Einwand, was ist mit Schulze, Schubert und Schumann? ist natürlich lebensnah und berechtigt und ich hätte ihn bei Bedarf mit einer Variablen gelöst, die die Abfragelänge left entsprechend anpasst. Also kein wirklich großes Problem. Meine VBAstelei ist als Ergänzung zu einem Thread gedacht, in dem das Thema schon sehr gut mit Formeln gelöst wurde.

Das Interessanteste an Deinem Vorschlag sind - neben dem Verzicht auf Select- die Parameter für OnAction. Ich hatte gedacht, mit meiner Universal-Sub, die dann mit durch den Shape-Namen gesteuert wird, eine ganz gute Lösung gefunden zu haben. Aber ich erlebe nicht das erste Mal: Es geht immer irgendwie schlauer :)

Vielen Dank! und lg
Zuletzt geändert von d'r Bastler am 22. Sep 2024, 10:06, insgesamt 1-mal geändert.
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Der erste alphanumerische Wert

#10

Beitrag von d'r Bastler »

Moin thowe,

hol schon mal die Lesebrille ;) , denn den nächsten Satz schreibe ich schamhaft ganz klein Ich habe von Klassenprogrammierung keine Ahnung! Ich werde natürlich testen und versuchen zu verstehen. Aber mehr kann ich im Moment nicht versprechen... Was ich mir allerdings nicht vorstellen kann, dass man ohne riesen Aufwand per Klassenprogrammierung die Controls in USFs abbilden kann, wie z.B. Combo-/Listboxen, Frames und ToggleButtons. Aber vielleicht kannst Du mich da eines Besseren belehren. Bin neugierig

lg
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast