Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Während der Laufzeit in der Datenblattansicht mit VBA Spalten umbenennen

Begonnen von Doming, Februar 18, 2026, 08:59:33

⏪ vorheriges - nächstes ⏩

Doming

Hallo,

ich habe ein Formular für das Eintragen von Arbeitsstati für verschiedene Abteilungen.
Bisher hatte jede Abteilung ein eigenes Formular, in dem die für die Abteilungen relevanten Felder in der Datenblattansicht angezeigt werden.
Diese unzähligen Formulare möchte ich jetzt durch eines für alle ersetzen.
Dazu habe ich ein Hauptformular mit einer Buttonleiste (Optionsgruppe) und ein Unterformular in der Datenblattansicht.
Je nachdem, welche Abteilung (Key) angewählt wird, baut sich das Unterformular neu auf.
Es gibt eine Tabelle1 mit allen Steuerelementen und deren Bezeichnungen.
Es gibt eine Tabelle2 mit dem Layout, d.h. welches Feld aus Tabelle1 wird angezeigt, in welcher Reihenfolge und die zuletzt eingestellte Breite.
In der abfr_Layout werden die beiden Tabellen zusammengeführt, also Breite, Reihenfolge mit den Namen und Bezeichnungen.

Set rsLay = cDB.OpenRecordset("SELECT * " _
                                & "FROM abfr_Layout " _
                                & "WHERE FSForm = " & Key _
                                & " AND FSUser = " & UserID _
                                & " ORDER BY Reihenfolge")
    If rsLay.EOF Then
        MsgBox "Ich finde das Formular " & Key & " nicht"
        GoTo Ende
    Else
        rsLay.MoveLast
        SpaltZahl = rsLay.RecordCount
        rsLay.MoveFirst
        For Each ctl In Forms.frm_HaFo.RahmenFP.Controls
            If ctl.ControlType = acTextBox Then
                a = a + 1
                rsLay.FindFirst "StElement = '" & ctl.Name & "'"

   '             Debug.Print a, rsLay!Reihenfolge, rsLay!Stelement, ctl.Name, rsLay.NoMatch

                If rsLay.NoMatch _
                 Or rsLay!Breite = 0 _
                 Or rsLay!Sichtbar = 0 _
                 Or rsLay!Sichtbar = 3 _
                Then
                    ctl.ColumnHidden = True
                    ctl.ColumnOrder = SpaltZahl
                Else
                    ctl.ColumnHidden = False
                    ctl.ColumnWidth = rsLay!Breite
                    ctl.ColumnOrder = rsLay!Reihenfolge
                End If
            End If
        Next
    End If
Das funktioniert soweit.

Nun möchte ich die Spalte beim Aufbau aber auch noch umbenennen. Ein ctl.Caption = "blah" ergibt den Fehler Objekt unterstützt diese Eigenschaft oder Methode nicht


Könnt Ihr mir da weiterhelfen?

Gruß
 Doming

AHeyne

Ich denke, dass es das ist, was du benötigst:

ctl.Properties("DatasheetCaption") = "blah"

Knobbi38

Hallo Doming,

leider zeigst du nicht, wie ctl definiert ist, denn grundsätzlich funktioniert der Zugriff über die Controls-Auflistung und eine Zuweisung an die Caption Eigenschaft ebenfalls.

Wenn du tatsächlich ein Formular mit verschiedenen Ansichten darstellen möchtest, lässt sich das mit Klassen umsetzen. Du solltest vielleicht mal einen Blick auf das MVP-Entwurfsmuster (OOP) werfen.  Suche nach den Begriffen ,,Model View Presenter", dann wirst du einige Hinweise finden, da dieses Muster sehr gebräuchlich ist. Vielleicht nicht gerade in Access, aber einige Anregungen kannst du übernehmen.

Gruß Knobbi38
 


Bitsqueezer

Hallo,

wenn kein "Option Explicit" verwendet wurde, ist ctl ein Variant. Wenn es deklariert wurde, sollte es als "Access.Control" deklariert werden, der generische Controltyp (die Basisklasse). IntelliSense zeigt Dir dann nur die Eigenschaften, die von allen Controls genutzt werden können. Wenn Du es expliziter und compilersicherer möchtest, kannst Du nach dem Test auf den Controltyp eine "ctl_Textbox As Access.TextBox" Deklaration verwenden und mit "Set ctl_Textbox = ctl" die spezifische Textbox-Klasse verwenden, so daß Dir alle Eigenschaften der Textbox in IntelliSense angezeigt werden und der Compiler prüfen kann, ob die Eigenschaft, die Du im Code hast, existiert. Dieser hätte Dir dann "Caption" bereits angemeckert, was er bei generischem "ctl" nicht kann, da die Eigenschaft nicht bei allen Controls existieren.

Eine Textbox hat keine Caption, nur ein Label Control.

Die DatasheetCaption ist für Datasheet-Spaltenbeschriftung, kann unabhängig von Caption gesetzt werden und kann auch direkt verwendet werden, man benötigt nicht die Properties Collection.

Statt ControlType zu testen, kannst Du auch eine If-Sonderform verwenden:
If ctl Is Access.TextBox Then
Das ist nicht schneller oder besser, aber meist lesbarer.

Gruß

Christian

Doming

Hallo und danke für die Antworten,

der Deklarationsteil sieht so aus
Dim a As Long
 Dim frm As String
 Dim ctl As Control
 Dim ctlNm As String
 Dim cDB As DAO.Database
 Dim rsLay As DAO.Recordset

Auf Caption bin ich gekommen, weil ich beim Einlesen der Steuerelement-Tabelle in einer Schleife die Textboxen ausgelesen und über ctl.Control(0).Caption das dazugehörige Label-Element angesprochen habe.

ctl.Properties("DatasheetCaption") = "blah" werde ich nachher mal ausprobieren, vielen Dank

Gruß
Doming

Knobbi38

Hallo,

noch ein kleiner Hinweis:

eine .DatasheetCaption Eigenschaft habe ich im Objektmodell nicht gefunden, aber über die Properties-Auflistung läßt sie sich ansprechen (#1).
Es gilt jedoch zu beachten, dass eine Zuweisung an diese Property eine höhere Priorität besitzt, als eine direkte Zuweisung an die Caption Eigenschaft des zugeordneten Labels für die Spalte.

In der For Each Schleife in dem Beispielcode, werden alle Textboxen angesprochen. Für eine Textbox kann über die Textbox.Controls-Auflistung auf das zugehörige Label zugegriffen werden, was in der Datenblattansicht dem Label im Header entspricht:
ctl.Controls(0).Caption = "Spaltenüberschrift"
Knobbi38

Bitsqueezer

Hallo Ulrich,

Du hast recht, ich hatte das wohl verwechselt mit den "Datasheet..."-Properties, die im Formular selbst zu finden sind, auf die man direkt zugreifen kann.

Gruß

Christian