117553

Excel VBA Projekt Userform: Awesenheitsliste Mitarbeiter Problem: Dynamisch erstellte Textboxen speichern

Hallo zusammen!

bräuchte wieder eure hilfe ob unten gezeigte Struktur richtig ist oder ob ich was vergessen habe.

Ich möchte eine Anwesenheitsliste für Mitarbeiter auf Basis Excel 2010 VBA erstellen welche über eine Userform dargestellt wird


- Multipage Januar bis Dezember

innerhalb Multipage:
- Listenfeld für Mitarbeiter Namen
- Listenfeld für Kalendertage etc.
- dynamisch erstellte Textboxen (für jeden Tag / jeden MA)

  • diese müssten sich speichern und immer dargestellt sein ===> Problem



der Ansatz für die TextBoxen ist dieser

Sub ErstelleTextBox()
Dim i As Integer, ii As Integer, a As Integer
Dim oTXT As MSForms.TextBox
Dim sngLeft As Single, sngTop As Single

Const sW As Single = 70
Const sH As Single = 18
Const sTopErste As Single = 40
Const sLeftErste As Single = 2
Const sAbstand As Single = 2

'If UBound(oTXTClass) > -1 Then
For a = Me.Controls.Count - 1 To 0 Step -1
If Controls(a).Name Like "TempTextBox*" Then
Me.Controls.Remove Controls(a).Name
End If
Next a
a = 0
'End If

Erase oTXTClass

For ii = 1 To CInt(ComboBox2)
For i = 1 To CInt(ComboBox1)
Set oTXT = Controls.Add("Forms.TextBox.1", "TempTextBox" & a, True)

With oTXT

If ii = 1 And i = 1 Then
.Top = sTopErste: .Left = sLeftErste: .Width = sW: .Height = sH
Else
.Top = sngTop: .Left = sngLeft: .Width = sW: .Height = sH
End If

ReDim Preserve oTXTClass(a)
Set oTXTClass(a).TXT_Class = oTXT
a = a + 1

If i < ComboBox1 Then
sngTop = .Top + .Height + sAbstand
sngLeft = .Left
Else
sngTop = sTopErste
sngLeft = .Left + .Width + sAbstand
End If

End With
Next i
Next ii

If CInt(ComboBox1) > 11 Then
Me.ScrollBars = fmScrollBarsVertical
Me.ScrollHeight = oTXT.Top + oTXT.Height + sAbstand
Else
Me.ScrollBars = fmScrollBarsNone
End If

End Sub

Private Sub ComboBox1_Change()
If ComboBox1.ListIndex > -1 And ComboBox2.ListIndex > -1 Then ErstelleTextBox
End Sub

Private Sub ComboBox2_Change()
If ComboBox1.ListIndex > -1 And ComboBox2.ListIndex > -1 Then ErstelleTextBox
End Sub

Private Sub UserForm_Initialize()
Dim i As Integer
For i = 1 To 100
ComboBox1.AddItem i
If i < 7 Then ComboBox2.AddItem i
Next i
End Sub

Private Sub UserForm_Terminate()
Erase oTXTClass
End Sub
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 287594

Url: https://administrator.de/forum/excel-vba-projekt-userform-awesenheitsliste-mitarbeiter-problem-dynamisch-erstellte-textboxen-speichern-287594.html

Ausgedruckt am: 03.05.2025 um 03:05 Uhr

122990
Lösung 122990 05.11.2015 aktualisiert um 11:20:15 Uhr
Goto Top
Moin,
dynamisch erstellte Textboxen (für jeden Tag / jeden MA)
wenn du sie dynamisch erstellst, warum setzt du dann nicht die ControlSource-Eigenschaft der Textboxen ebenfalls "dynamisch" ?

Schon kurrios was man einer da mit Excel macht obwohl man schon massenweise "Eingabe-Kästchen" in Excel hat und Zellen die sich schützen lassen face-big-smile. Wäre wohl eher was für Access

Gruß grexit
117553
117553 05.11.2015 um 10:33:31 Uhr
Goto Top
da hast du schon recht face-smile

Access haben leider nicht alle Mitarbeiter Zugriff.
mit der Userform finde ich kann man das halt richtig schön gestalten und verwalten, wie immer nur diese Exceltabellen

aber Danke Trotzdem
mfg Markus
114757
Lösung 114757 05.11.2015 aktualisiert um 11:20:25 Uhr
Goto Top
Moin,
machs doch so wie @122990 geschrieben hat..
warum setzt du dann nicht die ControlSource-Eigenschaft der Textboxen ebenfalls "dynamisch" ?

Gruß jodel32
117553
117553 05.11.2015 aktualisiert um 10:58:22 Uhr
Goto Top
Super ja Danke euch beiden!
mach ich...

bin da halt leider noch nicht so gut drin....

mfg Markus
114757
114757 05.11.2015 aktualisiert um 11:00:02 Uhr
Goto Top
Zitat von @117553:

setzt du dann nicht die ControlSource-Eigenschaft der Textboxen ebenfalls "dynamisch" ?
kannst du mir da einen Tip geben, wie das geht?
Siehst du im oben verlinkten Excel-Sheet ...
117553
117553 05.11.2015 um 11:19:52 Uhr
Goto Top
Danke!
holli.zimmi
holli.zimmi 05.11.2015 um 12:48:17 Uhr
Goto Top
Hi,

Access haben leider nicht alle Mitarbeiter Zugriff.
mit der Userform finde ich kann man das halt richtig schön gestalten und verwalten, wie immer nur diese Exceltabellen

Wie wäre es dann mit MS Access Runtime:
https://www.microsoft.com/de-de/download/details.aspx?id=10910

Gruß

Holli
117553
117553 06.11.2015 um 10:05:16 Uhr
Goto Top
Danke Holli, das ist eine nette Idee aber bei uns in der Firma etwas schwierig... da hat der Key User keine Lust drauf....*naja*

klappt jetzt ganz gut dank der Bespiel Tabelle

mit dem Code

Dim c, r As Long
For r = 7 To 26
For c = 3 To 26
Dim oTxt As MSForms.TextBox
Set oTxt = Me.Controls.Add("Forms.TextBox.1", "txt" & r & c, True)
oTxt.Left = ((c - 1) * 30) + 209
oTxt.Top = ((r - 1) * 21) + 132
oTxt.Width = 30
''' oTxt.Height = 30
oTxt.ControlSource = ActiveSheet.Cells(r, c).Address
Next
Next

mein Problem ist, die Boxen werden auf der Form beim Initialisieren erstellt

Standartwerte (Option Button)
Gruppe 1 True 2 False 3 False
Januar True Februar False....


jetzt wollte ich bei klick auf Februar die Boxen löschen und neue generieren da diese Bezug auf andere Zellen brauchen....

aber bekomm es nicht umgesetzt, hat jemand einen Tip für mich? Wäre echt nett, Danke schonmal!!!

mfg markus
122990
Lösung 122990 06.11.2015 aktualisiert um 12:55:05 Uhr
Goto Top
Warum neu erstellen, setz doch einfach die ControlSource Eigenschaft neu. D.h. erstelle eine Schleife die alle Textboxen durchläuft und die ControlSource Eigenschaft auf die neuen Bezüge setzt.
for each control in Me.Controls
'...wenn Textbox dann ....  
Next
117553
117553 06.11.2015 um 12:55:31 Uhr
Goto Top
vielen Dank für eure Unterstützung!!!!
117553
117553 09.11.2015 um 08:19:44 Uhr
Goto Top
wenn ich jetzt bei jeder zweiten Reihe eine ander Hintergrundfarbe möchte, wie könnte ich das umsetzen?

__________________________________

For r = 7 To 25
For c = 3 To 26
Dim oTxt As MSForms.TextBox
Set oTxt = Me.Controls.Add("Forms.TextBox.1", "txt" & r & c, True)
oTxt.Left = ((c - 1) * 30) + 209
oTxt.Top = ((r - 1) * 15) + 160
oTxt.Width = 30
oTxt.Height = 15
oTxt.BackColor = RGB(255, 128, 0)
oTxt.ControlSource = ActiveSheet.Cells(r, c).Address


Next
Next

________________________________________________

so gilt sie ja für alle Boxen...
114757
114757 09.11.2015 aktualisiert um 09:03:45 Uhr
Goto Top
Na ja, ein bisschen nachgedacht und sein Schulwissen über gerade und ungerade Zahlen genutzt, wärst du auch selber auf die Lösung gekommen
In die Schleife mit eingebaut ...
if (r MOD 2) = 0 then
    oTxt.BackColor = RGB(255, 128, 0)
end if 

https://msdn.microsoft.com/de-de/library/se0w9esz.aspx
Gruß jodel32

p.s. wann ist hier jetzt Schluss ?
117553
117553 09.11.2015 um 09:27:07 Uhr
Goto Top
jetzt, DANKESCHÖN!