Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Label
BildScreenshot zu Label Label-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema ListBox
BildScreenshot zu ListBox ListBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema TextBox
BildScreenshot zu TextBox TextBox-Seite mit Beispielarbeitsmappe aufrufen

Textbox in Userform überschreibt Formel

Betrifft: Textbox in Userform überschreibt Formel von: Luca Mettler
Geschrieben am: 13.10.2020 14:03:54

Hallo zusammen,

ich programmiere aktuell eine UserForm mit der ich neue Projekte anlegen und bestehende bearbeiten möchte.
Teil dieser Daten sind Meilensteine bzw. Phasen (Projektklärung, Konstruktion, Beschaffung, Montage etc.) die sich abhängig von einem Startdatum und der per Dropdown Menu ausgewählten zu bauenden Maschine berechnen. Die dazu gehörigen Informationen wie lang die einzelnen Phasen dauern sind im Namensmanager hinterlegt und werden über die INDIREKT Funktion abgerufen.
Da die Datei aufgrund der Menge an Daten unübersichtlich und vor allem in der Diskussion mit mehreren Teilnehmern schwer zu nutzen ist habe ich die UserForm angelegt, um alle Informationen auf einen Blick zu haben und diese auch einfach bearbeiten zu können. Generell funktioniert die UserForm gut leider aber werden beim Speichern die Formeln überschrieben.
Anbei einmal meine Speicherroutine:

'Speichern Schaltfläche Ereignisroutine

Private Sub CommandButton3_Click()
    Dim lZeile As Long
  
     'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
     If ListBox1.ListIndex = -1 Then Exit Sub
    
     'Wir müssen prüfen, ob die ID Spalte auch gefüllt ist!!
     If Trim(CStr(TextBox1.Text)) = "" Then
         'Meldung ausgeben
         MsgBox "Sie müssen mindestens einen Namen eingeben!", vbCritical + vbOKOnly, "FEHLER!"
         'Abbrechen der Speicherroutine
         Exit Sub
     End If
     'Ausbauoption: Prüfen, ob die ID in Tabelle1 Spalte 2 schon vorhanden ist!
    
     'Zum Speichern benötigen wir die Zeilennummer des ausgewählten Datensatzes
     lZeile = 8 'Start in Zeile 8, darüber lediglich Überschriften etc.
     'Schleife solange etwas in der zweiten Spalte in Tabelle 1 drin steht
     Do While Trim(CStr(Tabelle1.Cells(lZeile, 2).Value)) <> ""
    
         'Datensatz ID Spalte mit selektiertem Eintrag der ListBox vergleichen
         If ListBox1.Text = Trim(CStr(Tabelle1.Cells(lZeile, 2).Value)) Then
            
             'Eintrag gefunden, TextBoxen in die Zellen schreiben
             Tabelle1.Cells(lZeile, 2).Value = Trim(CStr(TextBox1.Text))
             Tabelle1.Cells(lZeile, 3).Value = TextBox2.Text
             Tabelle1.Cells(lZeile, 7).Value = TextBox3.Text
             Tabelle1.Cells(lZeile, 5).Value = TextBox4.Text
             Tabelle1.Cells(lZeile, 6).Value = TextBox5.Text
             Tabelle1.Cells(lZeile, 8).Value = TextBox6.Text
             Tabelle1.Cells(lZeile, 9).Value = TextBox7.Text
             Tabelle1.Cells(lZeile, 10).Value = TextBox8.Text
             Tabelle1.Cells(lZeile, 11).Value = TextBox9.Text
             Tabelle1.Cells(lZeile, 12).Value = TextBox10.Text
             Tabelle1.Cells(lZeile, 13).Value = Format(TextBox11.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 14).Value = Format(TextBox12.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 15).Value = Format(TextBox13.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 16).Value = Format(TextBox14.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 17).Value = Format(TextBox15.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 18).Value = Format(TextBox16.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 19).Value = Format(TextBox17.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 20).Value = Format(TextBox18.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 21).Value = Format(TextBox19.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 22).Value = Format(TextBox20.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 23).Value = Format(TextBox21.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 24).Value = Format(TextBox22.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 25).Value = Format(TextBox23.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 26).Value = Format(TextBox24.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 27).Value = Format(TextBox25.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 32).Value = Format(TextBox26.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 33).Value = Format(TextBox27.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 34).Value = Format(TextBox28.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 35).Value = Format(TextBox29.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 28).Value = Format(TextBox30.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 29).Value = Format(TextBox31.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 30).Value = Format(TextBox32.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 31).Value = Format(TextBox33.Value, "dd.mm.yyyy")
             Tabelle1.Cells(lZeile, 36).Value = TextBox34.Text
             
             'Die ListBox muss nun neu geladen werden
             'allerdings nur, wenn sich die Projektnummer (ID) geändert hat
             If ListBox1.Text <> Trim(CStr(TextBox1.Text)) Then
                 Call UserForm_Initialize
                 If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
             End If
            
             Exit Do 'Vorzeitiges Ende, da der Datensatz schon gefunden ist
            
         End If
    
         lZeile = lZeile + 1 'Nächste Zeile bearbeiten
     Loop
    
End Sub
Gibt es eine Möglichkeit das überschriben der Formeln zu verhindern?
Vielen Dank schon einmal im Voraus!
Viele Grüße
Luca

Betrifft: AW: Textbox in Userform überschreibt Formel
von: Daniel
Geschrieben am: 13.10.2020 14:09:59

Hi
du weist doch, in welchen Zellen Formeln stehen und in welchen nicht.
Zellen mit Formeln dürfen nicht überschrieben werden, also einfach die Programmzeilen, in denen das passiert, löschen.
Wenn in den TextBoxen formelergbenisse angezeigt werden, dann kann man die in der Userform sowieso nicht ändern.
Gruß Daniel

Betrifft: AW: Textbox in Userform überschreibt Formel
von: Luca Mettler
Geschrieben am: 13.10.2020 14:42:49

Hi Daniel,
vielen Dank für deine Antwort!
Das stimmt natürlich, vielleicht hätte ich dazu sagen sollen, dass die Daten vorerst immer erstmal auf diesen Formeln bestehen. Aber es kommt auch vor, dass sich Projektphasen verschieben. Diese Verschiebungen würde ich dann gerne über die UserForm anpassen bzw. ein Datum manuell einfügen

Betrifft: AW: Textbox in Userform überschreibt Formel
von: Daniel
Geschrieben am: 13.10.2020 15:01:20

kommt jetzt darauf an.
als erstes solltest du überprüfen, ob TextBoxinhalt und Zellwert unterschiedlich sind (Text/Zahl beachten!) und nur dann zurückschreiben, wenn die Werte sich unterscheiden.
dann wäre die Frage, ob wirklich die Formeln überschrieben werden sollen ober ob es nicht sinnvoller wäre, dann auf die Hintergrundtabelle aus der die Daten kommen, zuzugreifen und dort die Änderungen einzupflegen.
Ist natürlich dann aufwendiger, die richtige Stelle zu finden.
Gruß Daniel