Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

FRage zu Schleife

Betrifft: FRage zu Schleife von: Schneider
Geschrieben am: 10.08.2008 10:38:57

Hallo,

nachdem mir letztesmal hier gut geholfen wurde hätte ich nun noch zwei weitere Fragen.

Ich habe eine Userform mit mehreren Textboxen. Dise sollen die Werte aus eine Arbeitsmappe darstellen und dann auch editierbar sein. Die Werte in der Arbeitsmappe haben einen Zuordnungswert in Spalte B (z.B KDNR für Kundennummer) der Wert steht in Spalte A. Da dies im Prinziep für jede Textbox der gleiche Code ist müsste daraus ja eine Schleife machbar sein, aber die bekomm ich leider nicht zum laufen

Die zweite Frage bezieht sich auf eine textbox für Zahlen. hierbei soll die Eingabe eines 1000er Punktes (also zb. 10.562) führen das er die Zahl weiter schreibt. Dafür verwende ich das CLng, dann kann man aber nicht mehr den Wert aus der textbox herauslöschen und es ist nicht möglich einen Wert mit Komma einzugeben.

Hier ein verkürztes Beispiel

https://www.herber.de/bbs/user/54484.xls

Option Explicit
Public i

Private Sub UserForm_initialize()
Dim i As Long
'Ende suchen

    Ende = 1
    Do While Cells(Ende, 2) <> ""
        Ende = Ende + 1
    Loop
    

'Felder befüllen

    For i = 1 To Ende
        With Sheets("Daten")
            If .Cells(i, 2).Value = "KDNR" Then
            Me.TextBox1 = .Cells(i, 1).Value
            Exit For
            End If
        End With
    Next
    
    For i = 1 To Ende
        With Sheets("Daten")
            If .Cells(i, 2).Value = "PRNAME" Then
            Me.TextBox2 = .Cells(i, 1).Value
            Exit For
            End If
        End With
    Next
End Sub



Private Sub TextBox1_Change()
    For i = 1 To Ende
        If Sheets("Daten").Cells(i, 2).Value = "KDNR" Then
           Cells(i, 1).Value = CInt(TextBox1.Text)
         Exit For
        End If
    Next
End Sub



Private Sub TextBox2_Change()
    For i = 1 To Ende
        If Sheets("Daten").Cells(i, 2).Value = "PRNAME" Then
           Cells(i, 1).Value = TextBox2.Text
         Exit For
        End If
    Next
End Sub



Schonmal im vorraus danke für eure Hilfe
Gruß
Max

  

Betrifft: AW: FRage zu Schleife von: Daniel
Geschrieben am: 10.08.2008 11:46:43

Hallo

mal ne Frage, ist die Suchschleife zum Befüllen der Textbox wirklich erforderlich, dh können die Einträge für KDNR und PRNAME in verschiedenen Zeilen stehen, so daß tatsächlich gesucht werden muss?
Nun, wenn dem so ist, dann hat Excel dafür eine Suchfunktion, die man verwenden kann und muss nicht selber was programmieren.
der Code zum Befüllen sieht dann so aus:

Private Sub UserForm_initialize()
Dim Zelle As Long

With Sheets("Daten").Columns(2)
    Set Zelle = .Find(what:="KDNR", lookat:=xlWhole, LookIn:=xlValues)
    TextBox1.Text = Zelle.Offset(0, -1).Value
    
    Set Zelle = .Find(what:="PRNAME", lookat:=xlWhole, LookIn:=xlValues)
    TextBox1.Text = Zelle.Offset(0, -2).Value
End With

End Sub



Das Zurückschreiben der Werte würde ich dann änhlich gestalten, aber dafür nicht das CHANGE, sondern das EXIT-Event nehmen. Das hat zur Folge, daß der Wert erst dann zurückgeschrieben wird, wenn die Eingabe abgeschlossen ist und nicht bei jedem Tastenklick.

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Zelle As Range
Set Zelle = Sheets("Daten").Columns(2).Find(what:="KDNR", lookat:=xlWhole, LookIn:=xlValues)
Zelle.Offset(0, -1).Value = CLng(TextBox1.Text)
End Sub


Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim Zelle As Range
Set Zelle = Sheets("Daten").Columns(2).Find(what:="PRNAME", lookat:=xlWhole, LookIn:=xlValues)
Zelle.Offset(0, -1).Value = TextBox2.Text
End Sub



zur Textbox mit Zahl:
im code Verwendest zu, entgegen deiner Angabe CINT und nich CLNG.
besser ist CLNG, da CINT nur bis c.a. 32.000 definiert ist und grössere Zahlen nicht verarbeitet werden können.
Trotzdem sind beides Ganzzahl-Datentypen, dh. Nachkommastellen werden gerundet und entfallen.
wenn du Dezimalzahlen brauchst dann musst du die Umwandlungstypen CSNG oder CDBL verwenden.
falls du infos brauchst, einfach im Quellcode den Cursor draufsetzen und F1 drücken.

Gruß, Daniel


  

Betrifft: AW: FRage zu Schleife von: Schneider
Geschrieben am: 10.08.2008 18:01:33

ok danke.


hast du vll noch ne idee für eine gesamt schleife. also um die textboxen herum, so das ich nicht jede texbox einzeln ansprechen muss?


  

Betrifft: AW: FRage zu Schleife von: Daniel
Geschrieben am: 10.08.2008 20:04:51

Hi

ne Methode wäre diese, allerdings musst du dazu die Textboxen immer gleich benennen und mit ner Zählnummer versehen (also im Prinzip so, wie Excel das automatisch macht, aber eine Sprechende Textboxenbenennung ist dann nicht mehr möglich.)

für die einzelnen EXTIT- oder andere Events der Textboxen ist keine Schleife möglich, die müssen für jede Textbox seperat angelegt werden.
Eventuell kann man da was vereinfachen, indem man im Eventmakro ein anderes Makro mit den ent sprechenden Parametern aufruft, somit kann man den Code auch etwas kürzen.

im Ganzen sieht der Code mit diesen Optimierungen dann so aus:

Option Explicit
Dim Suchtext(1 To 2) As String
'-------------------------------------------------
Private Sub UserForm_initialize()
Dim Zelle As Range
Dim i As Long
Suchtext(1) = "KDNR"
Suchtext(2) = "PRNAME"
For i = 1 To 2
    Set Zelle = Sheets("Daten").Columns(2).Find(what:=Suchtext(i), lookat:=xlWhole, LookIn:= _
xlValues)
    Me.Controls("Textbox" & i).text = Zelle.Offset(0, -1).Value
Next
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call Textboxen_zurückschreiben(1)
End Sub


Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Call Textboxen_zurückschreiben(2)
End Sub

'-----------------------------------------------------------------------

Private Sub Textboxen_zurückschreiben(TB_Nr As Integer)
Dim Zelle As Range
Set Zelle = Sheets("Daten").Columns(2).Find(what:=Suchtext(TB_Nr), lookat:=xlWhole, LookIn:= _
xlValues)
Zelle.Offset(0, -1).Value = Me.Controls("TextBox" & TB_Nr).text
End Sub





Gruß, Daniel


 

Beiträge aus den Excel-Beispielen zum Thema "FRage zu Schleife"