Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
VBA Inhalt aus Textbox in Zelle schreibe
06.03.2020 10:47:23
MarC
Hallo zusammen,
ich komme gerade null weiter. Ich habe einen Button der ein UserForm öffnet. Auf dem UserForm gebe ich in der Textbox 1 das Produkt an und in der TextBox2 den Prozess. Wenn das Produkt mehr als einen Prozess durchläuft kann ich per Button weitere Textboxen hinzufügen. Problem ist es die Prozessnummer auf der Linken Seite stimmt nicht. Anstatt weiter zu zählen 2, 3 , 4 etc.. beginnt es bei mir bei 3, 4, 5 etc. Des Weiteren erhalte ich immer eine Fehlermeldung wenn die Daten in die gewünschten Zellen geschrieben werden sollen. Kann sich bitte jemand mein File anschauen ich komm da echt nicht weiter.
Gruß MarC
https://www.herber.de/bbs/user/135661.xlsm

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Inhalt aus Textbox in Zelle schreibe
06.03.2020 13:25:15
MCO
Hallo Marc!
Das kann ja auch nicht anders:
    For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.TextBox Then
e = e + 1
... bedeutet, dass alle elemente durchgegangen werden und bei Textbox zählt er einen hoch.
Da in der Userform schon zwei Textboxen drin stehen (Produkt u. Prozess 1) ist der Zähle schon bei 2 und damit der nächste bei 3.
Das ganze kannst du jetzt schön umschiffen, indem du entweder Variable vor dem hochzählen schon mit -1 (aktuell ist e = 0) belegst, oder indem du nach dem durchzählen der Textboxen einen Zähler zurückzählst.
e = e-1
(oder in der Benennung nicht e+1 schreibst, sondern nur e)
Alles in allem erscheint mir nicht alles so richtig sinnvoll, das wesentliche sollte aber so aussehen:

Private Sub New_Process_Click()
'=============================================================================================== _
'   1. Neuen Prozess hinzufügen.
'=============================================================================================== _
Dim e, links As Long, a As Long, abstand As Long
Proz_max = 40
Proz_spalt = 3
abstand = 15
e = -1
links = Number1.Left
For Each ctrl In Me.Controls
If TypeOf ctrl Is MSForms.TextBox Then
e = e + 1
a = WorksheetFunction.Max(ctrl.Top, a)
End If
Next ctrl
If e >= Proz_max Then MsgBox ("max. Anzahl Prozesse erreicht"): Exit Sub
a = a + 25
neues_feld e, links, a, abstand
End Sub
Sub neues_feld(e, links As Long, oben As Long, abstand As Long)
Set NewLabel = Raw_Data.Frame1.Controls.Add("Forms.Label.1", True)
With NewLabel
.Name = "Number" & e + 1
.ForeColor = &H0&
.Caption = e + 1
.Left = links
.Top = oben + abstand
.Width = 15
.Height = 18
End With
Set NewTextBox = Raw_Data.Frame1.Controls.Add("Forms.TextBox.1", Visible)
With NewTextBox
.Name = "Prozess" & e + 1
.Left = links + 24
.Top = oben + abstand - 3
.Width = 300
.Height = 18
.SetFocus
End With
Me.New_Process.Top = oben + abstand + 20
End Sub
Das mit dem Scrollen mußt du wieder anhängen / ergänzen...
Gruß, MCO
So einfach kann das sein :-)
Anzeige
AW: VBA Inhalt aus Textbox in Zelle schreibe
07.03.2020 16:04:51
MarC
Danke für deine Hilfe MCO und die Erklärung =)
AW: VBA Inhalt aus Textbox in Zelle schreibe
06.03.2020 15:18:45
fcs
Hallo MarC,
in der Datei gibt es verschiedene Problemstellen:
  • Name der Textboxen für die Prozesse
    Für den 1. Prozess hast du als Name der Textbox: Textbox1
    Wenn für weitere Prozesse Textboxen hinzugefügtwerden, dann ist der Name "Prozess" & Zählnummer
    Das verursacht dann das Problem beim Eintragen ins Tabellenblatt es gibt keine Textbox mit dem Namen "Prozess1"
    Die im Userform schon vorhanden Textbox für den 1. Prozell muss den Namen Prozess1 bekommen

  • Hochzählen der Nummer für die Prozesse
    Ich hab es jetzt so gelöst, dass die Textboxen, deren Name mit "Prozess" beginnt, gezählt werden und dann der Wert jeweils um 1 erhöht wird.

  • Eintragen ins Tabellenblatt
    Problem siehe oben.
    Ich hab es jetzt so gelöst:
    Die Startzeile wird auf 7 gesetzt.
    Dann wird der Name des Produkts eingetragen
    In einer For-next-Schleife werden die Textboxen gezählt, deren Name mit mit "Prozess" beginnt gezählt.
    In einer 2. Schleife werden dann die Nummern von 1 bis zur Anzahl abgearbeitet und die Textbox-Inhalte eingetragen

  • Ich hab auch die Anpassung von Framehöhe und Scrollposition geändert.
    In der Initialisierungs-Prozedur werden dynamisch festgelegt:
  • - Höhe der Userform = Höhe des Anwendungsfensters von Excel

  • - Top-Position der Schaltflächen Save und Cancel
  • - Höhe des Frams

  • - Liegt die Top-Postion der Schaltfläche "New Process" zu weit unten, dann der Frame vergrößert und die Scrollposition neu festgelegt.
    So werden die vorhandenen Textboxen nach oben aus dem Bild geschoben, neue Textbox wird unten angezeigt.

  • LG
    Franz
    https://www.herber.de/bbs/user/135670.xlsm
    Anzeige
    Eine Frage noch
    07.03.2020 17:11:49
    MarC
    Viel Dank euch allen. Ich habe sicher einige Fehler reingebracht durch mein hin und her probieren. Eine Frage habe ich dennoch. Wenn ich die ganze Inhalte am Tabellenblatt lösche und dann das Userform öffne und was eingebe beginnt das Makro immer in Spalte 3 und danach +2
    Es sollte aber in Spalte 2 beginnen und dann immer +2. Das muss man denn da ändern?
    AW: Eine Frage noch
    07.03.2020 18:19:15
    fcs
    Hallo MarC
    passe das Save-Makro wie folgt an.
    LG
    Franz
    Private Sub Save_Click()
    '   1. UserForm schlie?en.
    Dim temp As Long
    Dim Zeile As Long
    Dim m As Integer 'Anzahl Prozesse'
    Application.ScreenUpdating = False
    temp = MsgBox("Soll der neue Eintrag gespeichert werden?", vbYesNo)
    If temp = vbYes Then
    LastColumn = 0
    With Sheets("Raw Data")
    Zeile = 7
    'Einf?ge-Spalte berechnen
    LastColumn = .Cells(Zeile, .Columns.Count).End(xlToLeft).Column
    If LastColumn Blatt
    LastColumn = 2
    Else
    LastColumn = LastColumn + 2
    End If
    .Cells(Zeile, LastColumn).Value = Me.TextBox1.Value
    ' Anzahl Prozesse z?hlen
    m = 0
    For Each ctrl In Me.Controls
    If TypeOf ctrl Is MSForms.TextBox Then
    If Left(ctrl.Name, 7) = "Prozess" Then
    m = m + 1
    End If
    End If
    Next ctrl
    'Inhalt der Prozess-Textboxen in Tabelle eintragen
    For m = 1 To m
    Zeile = Zeile + 1
    .Cells(Zeile, LastColumn).Value = Me.Controls("Prozess" & CStr(m)).Text
    Next m
    End With
    Unload Me
    End If
    End Sub
    

    Anzeige

    481 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige