117553
Goto Top

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

Content-Key: 287594

Url: https://administrator.de/contentid/287594

Printed on: April 26, 2024 at 03:04 o'clock

Mitglied: 122990
Solution 122990 Nov 05, 2015 updated at 10:20:15 (UTC)
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
Mitglied: 117553
117553 Nov 05, 2015 at 09:33:31 (UTC)
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
Mitglied: 114757
Solution 114757 Nov 05, 2015 updated at 10:20:25 (UTC)
Goto Top
Moin,
machs doch so wie @122990 geschrieben hat..
warum setzt du dann nicht die ControlSource-Eigenschaft der Textboxen ebenfalls "dynamisch" ?

Gruß jodel32
Mitglied: 117553
117553 Nov 05, 2015 updated at 09:58:22 (UTC)
Goto Top
Super ja Danke euch beiden!
mach ich...

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

mfg Markus
Mitglied: 114757
114757 Nov 05, 2015 updated at 10:00:02 (UTC)
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 ...
Mitglied: 117553
117553 Nov 05, 2015 at 10:19:52 (UTC)
Goto Top
Danke!
Member: holli.zimmi
holli.zimmi Nov 05, 2015 at 11:48:17 (UTC)
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
Mitglied: 117553
117553 Nov 06, 2015 at 09:05:16 (UTC)
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
Mitglied: 122990
Solution 122990 Nov 06, 2015 updated at 11:55:05 (UTC)
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
Mitglied: 117553
117553 Nov 06, 2015 at 11:55:31 (UTC)
Goto Top
vielen Dank für eure Unterstützung!!!!
Mitglied: 117553
117553 Nov 09, 2015 at 07:19:44 (UTC)
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...
Mitglied: 114757
114757 Nov 09, 2015 updated at 08:03:45 (UTC)
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 ?
Mitglied: 117553
117553 Nov 09, 2015 at 08:27:07 (UTC)
Goto Top
jetzt, DANKESCHÖN!