Thema Datum  Von Nutzer Rating
Antwort
28.01.2015 13:23:29 Ben
NotSolved
Blau UserForm, Text und Zahlen eintragen
28.01.2015 13:27:17 Gast82396
NotSolved
28.01.2015 14:38:31 Gast50882
NotSolved
28.01.2015 15:37:28 Ben
NotSolved
28.01.2015 21:16:11 Gast65483
NotSolved
29.01.2015 07:35:28 Ben
Solved
29.01.2015 11:29:55 Gast12656
NotSolved

Ansicht des Beitrags:
Von:
Gast82396
Datum:
28.01.2015 13:27:17
Views:
1232
Rating: Antwort:
  Ja
Thema:
UserForm, Text und Zahlen eintragen

Sorry für die Unübersicht.... Im Internetexplorer wurden mir die Editor Buttons nicht angezeigt

Hier ordentlicher:

 

clsControls:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
Option Explicit
 
Private WithEvents objCmd As MSForms.CommandButton
Private WithEvents objTxt As MSForms.TextBox
Private WithEvents objChk As MSForms.CheckBox
Private WithEvents objOpt As MSForms.OptionButton
Private WithEvents objLst As MSForms.ListBox
Private WithEvents objCmb As MSForms.ComboBox
Private WithEvents objSpn As MSForms.SpinButton
Private WithEvents objScr As MSForms.ScrollBar
    
Public Function SetObject(objCntrl As MSForms.Control) As Object
   Set SetObject = Nothing
   If TypeOf objCntrl Is MSForms.CommandButton Then
      Set objCmd = objCntrl
      Set SetObject = Me
      ElseIf TypeOf objCntrl Is MSForms.TextBox Then
      Set objTxt = objCntrl
      Set SetObject = Me
      ElseIf TypeOf objCntrl Is MSForms.CheckBox Then
      Set objChk = objCntrl
      Set SetObject = Me
      ElseIf TypeOf objCntrl Is MSForms.OptionButton Then
      Set objOpt = objCntrl
      Set SetObject = Me
      ElseIf TypeOf objCntrl Is MSForms.ListBox Then
      Set objLst = objCntrl
      Set SetObject = Me
      ElseIf TypeOf objCntrl Is MSForms.ComboBox Then
      Set objCmb = objCntrl
      Set SetObject = Me
      ElseIf TypeOf objCntrl Is MSForms.ScrollBar Then
      Set objScr = objCntrl
      Set SetObject = Me
   End If
End Function
    
 
Private Sub objCmd_Click()
Dim objCntrl As MSForms.Control
Dim rng As Range
Dim intAnswer As Integer
Select Case objCmd.Tag  'Auswertung der ButtonClicks je nach Button-Tag
   Case "entry", "entryClose"
      If objUFrm.Controls("txt1") = "" Then
         If MsgBox("Die Laufende Nummer fehlt!" & Space(25) & vbLf & vbLf & _
                  "Soll der Eintrag neu angelegt werden?", 36, "Frage") <> 6 Then Exit Sub
         objUFrm.Controls("txt1") = CStr(Application.Max(wksData.Range("A:A")) + 1)
      End If
       
      Set rng = wksData.Range("A:A").Find(objUFrm.Controls("txt1").Text)
      If Not rng Is Nothing Then
         For Each objCntrl In objUFrm.Controls
            If TypeOf objCntrl Is MSForms.TextBox Then
               If objCntrl.Locked Then
                  wksData.Cells(2, CDbl(objCntrl.Tag)).Copy wksData.Cells(rng.Row, CDbl(objCntrl.Tag))
                  objCntrl.Text = wksData.Cells(rng.Row, CDbl(objCntrl.Tag)).Text
               Else
                  If IsNumeric(objCntrl.Text) Then
                     wksData.Cells(rng.Row, CDbl(objCntrl.Tag)) = IIf(IsDate(objCntrl.Text), _
                                          CDate(objCntrl.Text), CDbl(objCntrl.Text))
                  Else
                     
                  End If
               End If
            End If
         Next
      Else
         Set rng = wksData.Cells(wksData.Cells(65536, 1).End(xlUp).Row + 1, 1)
         For Each objCntrl In objUFrm.Controls
            If TypeOf objCntrl Is MSForms.TextBox Then
               If objCntrl.Locked Then
                  wksData.Cells(2, CDbl(objCntrl.Tag)).Copy wksData.Cells(rng.Row, CDbl(objCntrl.Tag))
                  objCntrl.Text = wksData.Cells(rng.Row, CDbl(objCntrl.Tag)).Text
               Else
                  If IsNumeric(objCntrl.Text) Then
                     wksData.Cells(rng.Row, CDbl(objCntrl.Tag)) = IIf(IsDate(objCntrl.Text), _
                                          CDate(objCntrl.Text), CDbl(objCntrl.Text))
                  Else
                     wksData.Cells(rng.Row, CDbl(objCntrl.Tag)) = objCntrl.Text
                  End If
               End If
            End If
         Next
      End If
       
      wksData.Range(wksData.Cells(1, 1), wksData.Cells(wksData.Cells(65536, 1).End(xlUp).Row, _
         wksData.Cells(1, 256).End(xlToLeft).Column)).Sort _
            Key1:=wksData.Range("A2"), _
            Order1:=xlAscending, _
            Header:=xlGuess, _
            OrderCustom:=1, _
            MatchCase:=False, _
            Orientation:=xlTopToBottom
             
      objUFrm.Controls("spin1").Min = Application.Max(wksData.Range("A:A")) + 1
       
      If objCmd.Tag = "entryClose" Then Unload objUFrm
       
writeInfo
 
   Case "new"
         For Each objCntrl In objUFrm.Controls
            If TypeOf objCntrl Is MSForms.TextBox Then
               If objCntrl.Tag = "1" Then
                  objCntrl.Text = CStr(Application.Max(wksData.Range("A:A")) + 1)
               Else
                  objCntrl.Text = ""
               End If
            End If
         Next
         objUFrm.Controls("txt2").SetFocus
          
writeInfo
          
   Case "delete"
      If IsError(Application.Match(CDbl(objUFrm.Controls("txt1").Text), wksData.Range("A:A"), 0)) Then Exit Sub
      intAnswer = MsgBox("Einträge auch in der Tabelle löschen?" & Space(55) & vbLf & vbLf & _
                  vbTab & "[ Ja ]" & vbTab & vbTab & "Formular + Tabelle löschen" & vbLf & _
                  vbTab & "[ Nein ]" & vbTab & vbTab & "Nur Formular löschen" & vbLf & _
                  vbTab & "[Abbrechen]" & vbTab & "Abbrechen" & vbLf, 547, "Löschen")
         If intAnswer = 2 Then Exit Sub
         For Each objCntrl In objUFrm.Controls
            If TypeOf objCntrl Is MSForms.TextBox Then
               If objCntrl.Tag <> "1" Then
                  objCntrl.Text = ""
               End If
            End If
         Next
         objUFrm.Controls("txt2").SetFocus
         If intAnswer = 6 Then
            Set rng = wksData.Range("A:A").Find(objUFrm.Controls("txt1").Text)
            If Not rng Is Nothing Then
               wksData.Rows(rng.Row).Delete
            End If
         End If
          
writeInfo
          
   Case "close"
      Unload objUFrm
   Case Else
End Select
End Sub
 
Private Sub objScr_Change()
Dim rng As Range
Dim objCntrl As MSForms.Control
 
objScr.Min = Application.Max(wksData.Range("A:A")) + 1
 
objUFrm.Controls("txt1").Text = objScr.Value
 
Set rng = wksData.Range("A:A").Find(objScr.Value)
 
If Not rng Is Nothing Then
   For Each objCntrl In objUFrm.Controls
      If TypeOf objCntrl Is MSForms.TextBox Then
         If objCntrl.Tag <> "1" Then objCntrl.Text = wksData.Cells(rng.Row, CDbl(objCntrl.Tag)).Text
      End If
   Next
Else
   For Each objCntrl In objUFrm.Controls
      If TypeOf objCntrl Is MSForms.TextBox Then
         If objCntrl.Tag <> "1" Then objCntrl.Text = ""
      End If
   Next
End If
 
 
writeInfo
 
End Sub
 
Private Sub objTxt_Change()
If objTxt.Name = "txt1" And objTxt <> "" Then
   If CDbl(Val(objTxt)) > Application.Max(wksData.Range("A:A")) + 1 Then objTxt.Text = Application.Max(wksData.Range("A:A")) + 1
   objUFrm.Controls("spin1").Value = Val(objTxt)
End If
End Sub
 
Private Sub objTxt_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If objTxt.Name = "txt1" Then
   Select Case KeyAscii
      Case 48 To 59
      Case Else
         KeyAscii = 0
   End Select
End If
End Sub
 
 
 
 
UserForm1:
 
 
Option Explicit
Const cntWidth As Double = 135      'Konstante der Steuerelement-Breite
Dim arrControls() As clsControls    'Verweis auf das Klassenmodul
 
 
 
Private Sub UserForm_Activate()
Dim rng As Range
Dim lngTop As Long, lngLeft As Long, maxTop As Long, maxLeft As Long, intCount As Integer
Dim lblNew As MSForms.Label, txtNew As MSForms.TextBox, cmdNew As MSForms.CommandButton
Dim frmNew As MSForms.Frame, scrNew As MSForms.ScrollBar
Dim n As Integer
 
n = -1                              'Zähler für Steuerelemente-Array
lngTop = 15                         'Ausrichtung "oben" für Steuerelemente
lngLeft = 5                         'Ausrichtung "links" für Steuerelemente
Me.Height = Application.Height - 300  'UF-Höhe anpassen
Me.Width = Application.Width - 650       'UF-Breite anpassen
Me.StartUpPosition = 0              'Startverhalten
Me.Top = Application.Top + 40          'Ausrichtung "oben"
Me.Left = Application.Left + 600        'Ausrichtung "links"
maxTop = Me.Height - 108            'Hilfsvariable zur Steuerelement-Ausrichtung
 
 
Set frmNew = Me.Controls.Add("Forms.Frame.1")   'Rahmen hinzufügen
 
With frmNew                                     'Rahmen formatieren
   .Name = "Frame1"
   .Top = 5
   .Left = 5
   .Width = Me.Width - 15
   .Height = maxTop
   .TabStop = False
   .SpecialEffect = fmSpecialEffectSunken
    
   
    
   Set lblNew = .Controls.Add("Forms.Label.1"'Label zur Anzeige der Datensatznummer
   With lblNew
      .Caption = ""
      .Name = "lblinfo"
      .Top = lngTop
      .Left = lngLeft + cntWidth + 6
      .WordWrap = False
      .Font.Size = 11
      .Enabled = False
      .AutoSize = True
   End With
    
   lngTop = lngTop + 24
    
   For Each rng In wksData.Rows(1).Cells     'Zellen in Zeile 1 durchlaufen
      If rng <> "" And rng.PrefixCharacter <> "'" Then
      'Wenn Zelle mit Überschrift und ohne Prefix ('), dann
         intCount = intCount + 1
         Set lblNew = .Controls.Add("Forms.Label.1")     'Label hinzufügen
         Set txtNew = .Controls.Add("Forms.TextBox.1")   'Textbox hinzufügen
         With lblNew                                     'Label formatieren
            .Name = "lbl" & CStr(intCount)
            .Top = lngTop
            .Left = lngLeft
            .Width = cntWidth
            .WordWrap = True
            .Caption = rng.Text & ":"
            .TextAlign = fmTextAlignRight
            .ForeColor = &H404040
         End With
    
         With txtNew                                     'Textbox formatieren
            .Top = lngTop
            .Left = lngLeft + cntWidth + 3
            .Width = cntWidth
            maxLeft = .Left + .Width
            .Text = rng.Offset(Val(Me.Tag), 0).Text
            .Tag = rng.Column
            .Name = "txt" & CStr(intCount)
            .Locked = rng.Offset(1, 0).HasFormula
            .BackColor = IIf(.Locked, &H8000000F, &HFFFFFF)
            .TabStop = Not .Locked
            If .Tag = "1" Then
               If .Text = "" Then .Text = Application.Max(wksData.Range("A:A")) + 1
               .Width = .Width - 15
               Set scrNew = Me.Controls("Frame1").Add("Forms.ScrollBar.1") 'Zu erster Textbox SpinButton hinzufügen
               With scrNew                                                 'SpinButton formatieren
                  .Name = "spin1"
                  .Orientation = fmOrientationVertical
                  .Min = Application.Max(wksData.Range("A:A")) + 1
                  .Max = 1
                  .Value = Val(txtNew.Text)
                  .Height = txtNew.Height
                  .Width = 15
                  .Top = txtNew.Top
                  .Left = txtNew.Left + txtNew.Width
                  .ForeColor = &H80000015
                  .TabStop = False
               End With
    
    
               n = n + 1
               ReDim Preserve arrControls(n)          'SpinButton in der Klasse registrieren
               Set arrControls(n) = New clsControls
               arrControls(n).SetObject scrNew
    
            End If
         End With
    
         n = n + 1
         ReDim Preserve arrControls(n)                'Textbox in der Klasse registrieren
         Set arrControls(n) = New clsControls
         arrControls(n).SetObject txtNew
    
         lngTop = lngTop + 24
    
         If lngTop > maxTop - 36 Then                 'Je nach Höhe des UF Steuerelement-Ausrichtung anpassen
            lngTop = 39
            lngLeft = lngLeft + cntWidth * 2 + 18
         End If
      End If
   Next     'Umkehrpunkt der Schleife
    
   If maxLeft + 10 > .Width Then                      'Bei Bedarf Scrollbar zum Rahmen hinzufügen
      .ScrollBars = fmScrollBarsHorizontal
      .ScrollWidth = maxLeft + 24
   End If
 
End With
 
lngTop = maxTop + 18
 
lngLeft = 15
 
'Ab hier werden die CommandButtons hinzugefügt
Set cmdNew = Me.Controls.Add("Forms.CommandButton.1")
 
With cmdNew
   .Caption = "Eintragen"
   .ForeColor = &H9900&
   .Name = "cmdEntry"
   .Top = lngTop
   .Left = lngLeft
   .Width = 110
   .Height = 22
   .Tag = "entry"
   .TakeFocusOnClick = False
   .TabStop = False
End With
 
   n = n + 1
   ReDim Preserve arrControls(n)
   Set arrControls(n) = New clsControls
   arrControls(n).SetObject cmdNew
 
Set cmdNew = Me.Controls.Add("Forms.CommandButton.1")
 
With cmdNew
   .Caption = "Eintragen & Schliessen"
   .ForeColor = &H9900&
   .Top = lngTop + 30
   .Left = lngLeft
   .Width = 110
   .Height = 22
   .Tag = "entryClose"
   .TakeFocusOnClick = False
   .TabStop = False
End With
 
   n = n + 1
   ReDim Preserve arrControls(n)
   Set arrControls(n) = New clsControls
   arrControls(n).SetObject cmdNew
 
Set cmdNew = Me.Controls.Add("Forms.CommandButton.1")
 
With cmdNew
   .Caption = "Neu"
   .ForeColor = &HFF0000
   .Top = lngTop
   .Left = lngLeft + 120
   .Width = 110
   .Height = 22
   .Tag = "new"
   .TakeFocusOnClick = False
   .TabStop = False
End With
 
   n = n + 1
   ReDim Preserve arrControls(n)
   Set arrControls(n) = New clsControls
   arrControls(n).SetObject cmdNew
 
Set cmdNew = Me.Controls.Add("Forms.CommandButton.1")
 
With cmdNew
   .Caption = "Löschen"
   .ForeColor = &HFF
   .Top = lngTop + 30
   .Left = lngLeft + 120
   .Width = 110
   .Height = 22
   .Tag = "delete"
   .TakeFocusOnClick = False
   .TabStop = False
End With
 
   n = n + 1
   ReDim Preserve arrControls(n)
   Set arrControls(n) = New clsControls
   arrControls(n).SetObject cmdNew
 
Set cmdNew = Me.Controls.Add("Forms.CommandButton.1")
 
With cmdNew
   .Caption = "Schliessen"
   .Top = lngTop + 30
   .Left = lngLeft + 250
   .Width = 110
   .Height = 22
   .Tag = "close"
   .TakeFocusOnClick = False
   .TabStop = False
End With
 
   n = n + 1
   ReDim Preserve arrControls(n)
   Set arrControls(n) = New clsControls
   arrControls(n).SetObject cmdNew
 
writeInfo
 
   Me.Controls("txt2").SetFocus
 
End Sub
 
Private Sub UserForm_Initialize()
'Objektvariablen des UF und der Tabelle zuweisen
Set objUFrm = Me
Set wksData = ActiveSheet
End Sub
 
Private Sub UserForm_Terminate()
'Objektvariablen leeren
Set objUFrm = Nothing
Set wksData = Nothing
End Sub

 


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
28.01.2015 13:23:29 Ben
NotSolved
Blau UserForm, Text und Zahlen eintragen
28.01.2015 13:27:17 Gast82396
NotSolved
28.01.2015 14:38:31 Gast50882
NotSolved
28.01.2015 15:37:28 Ben
NotSolved
28.01.2015 21:16:11 Gast65483
NotSolved
29.01.2015 07:35:28 Ben
Solved
29.01.2015 11:29:55 Gast12656
NotSolved