Clever-Excel-Forum

Normale Version: VBA Daten in mehrere Tabellenblätter speichern
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich benutze eine Vorlage um Daten aus einem Eingabeformular zu speichern. Im Original wird es allerdings in 1 Tabellenblatt gespeichert und ich möchte nun aber 2 Tabellenblätter ansprechen. Mein Weg einfach auszuprobieren, jeweils 2mal Tabellenblätter anzusprechen, hat irgendwie nicht funktioniert. Kann mir bitte einer helfen, wie es funktionieren kann?

Mein falscher Weg:

Sub KundenChange_EingabeDB()

'Tabelle einlesen
Dim tbl_1 As ListObjects
Set tbl_1 = tb_Personen.ListObjects(1)

Dim tbl_2 As ListObjects
Set tbl_2 = tb_Leistungen.ListObjects(1)

Dim Zeile As Long

'Kunde anlegen oder bearbeiten
If tb_Eingabeformular.Shapes.Range(Array("txt_Anlegen", "img_Anlegen")).Visible = True Then
'Kunde anlegen

'Zeile hinzufügen
tbl_1.ListRows.Add
tbl_2.ListRows.Add

'Zeile in Variable speichern
Zeile = tbl_1.DataBodyRange.Rows.Count
Zeile = tbl_2.DataBodyRange.Rows.Count


'Kunde bearbeiten
Else

End If

'Datenbank befüllen

usw...
Hallo,

eine Beispieldatei wäre hilfreicher, als dein (nicht funktionierender) Quelltext.
(04.03.2024, 22:00)Klaus-Dieter schrieb: [ -> ]Hallo,

eine Beispieldatei wäre hilfreicher, als dein (nicht funktionierender) Quelltext.



Und wenn Du in den Entwicklermodus gehst, wären es die Blätter Eingabeformular, tb_Personen und tb_Leistungen.
Das entsprechende Makro ist das KundenChange_EingabeDB. In anderen Makros habe ich es sicher auch falsch gemacht, ich müsste einmal wissen, welchen Weg ich gehen muss. Kannst Du mir da helfen ?

Datei entfernt... Danke fürs Nachsehen.
@Klaus-Dieter:

Nun hab ich festgestellt, dass Personen anlegen und Personen bearbeiten erstmal funktioniert wie angegeben. Also das Eingabeformular wird aufgerufen und es ist eine neue ID drin (anlegen) und bei bearbeiten werden die Daten aus beiden Blättern wie gewünscht übernommen, wenn man ein Feld der tb_Personen anklickt und auf bearbeiten geht. Das ist ein toller Erfolg , finde ich :)

Das Problem ist also das abspeichern. "KundenChange_EingabeDB()" , um es weiter einzugrenzen.

Im Anhang jetzt nur die relevanten Tabellenblätter. PersonenChange habe ich nun rausgenommen, hier ist es:

Sub KundenChange_EingabeDB()


'Tabelle einlesen
Dim tbl_1 As ListObjects
Dim tbl_2 As ListObjects

Set tbl_1 = tb_Personen.ListObjects(1)
Set tbl_2 = tb_Leistungen.ListObjects(1)

Dim Zeile As Long


'Kunde anlegen oder bearbeiten
If tb_Eingabeformular.Shapes.Range(Array("txt_Anlegen", "img_Anlegen")).Visible = True Then
'Kunde anlegen

'Zeile hinzufügen
tbl_1.ListRows.Add


'Zeile in Variable speichern
Zeile = tbl_1.DataBodyRange.Rows.Count



'Kunde bearbeiten
Else

End If

'Datenbank befüllen
With tb_Eingabeformular
tbl_1.DataBodyRange(Zeile, 1).Value = .Range("E12").Value
tbl_2.DataBodyRange(Zeile, 1).Value = .Range("E12").Value
tbl_1.DataBodyRange(Zeile, 2).Value = .Range("E16").Value
tbl_2.DataBodyRange(Zeile, 4).Value = .Range("E20").Value
tbl_2.DataBodyRange(Zeile, 10).Value = .Range("E22").Value
tbl_1.DataBodyRange(Zeile, 3).Value = .Range("H16").Value
tbl_2.DataBodyRange(Zeile, 5).Value = .Range("H20").Value
tbl_2.DataBodyRange(Zeile, 11).Value = .Range("H22").Value
tbl_1.DataBodyRange(Zeile, 4).Value = .Range("K16").Value
tbl_2.DataBodyRange(Zeile, 6).Value = .Range("K20").Value
tbl_2.DataBodyRange(Zeile, 12).Value = .Range("K22").Value
tbl_1.DataBodyRange(Zeile, 5).Value = .Range("N16").Value
tbl_2.DataBodyRange(Zeile, 7).Value = .Range("N20").Value
tbl_2.DataBodyRange(Zeile, 13).Value = .Range("N22").Value
tbl_1.DataBodyRange(Zeile, 6).Value = .Range("Q16").Value
tbl_2.DataBodyRange(Zeile, 8).Value = .Range("Q20").Value
tbl_2.DataBodyRange(Zeile, 14).Value = .Range("Q22").Value
tbl_1.DataBodyRange(Zeile, 7).Value = .Range("T16").Value
tbl_2.DataBodyRange(Zeile, 9).Value = .Range("T20").Value
tbl_2.DataBodyRange(Zeile, 15).Value = .Range("T22").Value
tbl_1.DataBodyRange(Zeile, 8).Value = Date


End With

'navigieren zu Tabellenblatt Datenbank
tb_Personen.Select
ActiveWindow.ScrollRow = tbl_1.DataBodyRange(Zeile, 1).Row
tbl_1.DataBodyRange(Zeile, 1).Select




End Sub
(04.03.2024, 21:52)holybego schrieb: [ -> ]hat irgendwie nicht funktioniert.
Bitte beschreibe: Wie zeigt sich "nicht funktionieren"? Gibt es Fehlermeldungen? Wo, welche Zeile, welche Nummer, welche Beschreibung?
Das ist das Minimum, was du liefern solltest. 

Als erstes fliegt mir erwartungsgemäß die falsche Deklaration um die Ohren:
Code:
Dim tbl_1 As ListObjects
Dim tbl_2 As ListObjects


ListObjects ist eine Sammlung aller Listobjects. Du willst aber ein einzelnes Listobject haben, das allein sprachlich nachvollziehbar im Singular stehen muss:
Code:
Dim tbl_1 As ListObject
Dim tbl_2 As ListObject

Folgende Zeile liefert auch WAHR, wenn eine der beides Shapes unsichtbar, die andere sichtbar ist: Dann liefert Visible msoTriStateMixed, dem der Wert -2 zugeordnet ist - was von VBA als "WAHR" (<>0 ) interpretiert wird:
Code:
If tb_Eingabeformular.Shapes.Range(Array("txt_Anlegen", "img_Anlegen")).Visible = True Then
Es wird also keinesfalls geprüft, ob beide Shapes gleichzeitig sichtbar sind. Ob das nun dein Problem ist, kann ich nicht beurteilen - vielleicht ist es ja genau so gewollt...

Weiter habe ich nicht geschaut - denn die Beschreibung lässt nicht zu, zielgerichtet zu helfen. Und auf Verdacht jede Codezeile zu kommentieren sprengt den Rahmen.
(05.03.2024, 08:43)EarlFred schrieb: [ -> ]Bitte beschreibe: Wie zeigt sich "nicht funktionieren"? Gibt es Fehlermeldungen? Wo, welche Zeile, welche Nummer, welche Beschreibung?
Das ist das Minimum, was du liefern solltest. 

Als erstes fliegt mir erwartungsgemäß die falsche Deklaration um die Ohren:
Code:
Dim tbl_1 As ListObjects
Dim tbl_2 As ListObjects


ListObjects ist eine Sammlung aller Listobjects. Du willst aber ein einzelnes Listobject haben, das allein sprachlich nachvollziehbar im Singular stehen muss:
Code:
Dim tbl_1 As ListObject
Dim tbl_2 As ListObject

Weiter habe ich nicht geschaut - denn die Beschreibung lässt nicht zu, zielgerichtet zu helfen.

Laufzeitfehler 13 kam da. ListObject hat Abhilfe geschaffen. 1000 Dank! 
Das speichern klappt.


Das Bearbeiten führt aber nun dazu, dass die Tabellenüberschrift zerschossen wird. Er speichert also , wenn bearbeitet wurde das Geänderte im Tabellenkopf
und ersetzt die Spaltenüberschriften. Er findet also da nicht die richtige Stelle.


P.S: Also das mit dem Header, dass bei Anlegen und Bearbeiten das richtige angezeigt wird, funktioniert:

Code:
If tb_Eingabeformular.Shapes.Range(Array("txt_Anlegen", "img_Anlegen")).Visible = True Then
Zu meinem Hinweis zu den Shapes: Du sollst verstehen, unter welchen Bedingungen der Code WAHR interpretiert und entsprechend programmieren. Wie die Prüfung korrekt lauten muss, ist deine Sache, die Bedingungen kennst du ja nun.

Zum Problem mit dem Header: Wann füllst du denn die Variable Zeile? Was passiert, wenn die Bedingung nicht erfüllt ist? Welchen Wert hat dann Zeile? Welchen Einfluss hat das auf den weiteren Verlauf?

Einfach mal selbst drüber nachdenken. Eingerückter Code hilft immens, solche Fehler im Programmablauf zu finden.
(05.03.2024, 09:18)EarlFred schrieb: [ -> ]Zu meinem Hinweis zu den Shapes: Du sollst verstehen, unter welchen Bedingungen der Code WAHR interpretiert und entsprechend programmieren. Wie die Prüfung korrekt lauten muss, ist deine Sache, die Bedingungen kennst du ja nun.

Zum Problem mit dem Header: Wann füllst du denn die Variable Zeile? Was passiert, wenn die Bedingung nicht erfüllt ist? Welchen Wert hat dann Zeile? Welchen Einfluss hat das auf den weiteren Verlauf?

Einfach mal selbst drüber nachdenken. Lesbar formatierter Code hilft übrigens immens, solchen Bockmist zu sehen.

Hey EarlFred,

danke Dir für deine Rückmeldung. Tatsächlich verstehe ich aktuell fast nur Bahnhof. Ich weiß, dass durch diese Shapes Zeile gesagt wird, wann Bearbeiten und wann Anlegen angezeigt werden soll. In den anderen Makros werden ja beide Varianten abgefragt. Das ist wohl im PersonenChange nicht mehr nötig, so verstehe ich es. Ob das Sinn macht, keine Ahnung. Du siehst, ich benötige Leichte Sprache als Ansprache...

Wegen der Variable Zeile: Ich meine verstanden zu haben, dass damit die letzte Zeile genommen werden soll.

Selbst drüber nachdenken ? Also ich bin echt stolz bis hierher gekommen zu sein und finde es aber manchmal interessant, dass man hier in diesem Forum öfters ein bisschen schroff angegangen wird, wenn man kein Fachmann ist und vielleicht dumme Fragen hat oder dumme Fehler macht. Also bei meiner ersten Frage hast du mir super geholfen, richtig cool, Danke! Dann hab ich dich nicht verstanden und mein Problem, dass die Überschrift nun zerschossen wird, da bräuchte ich im Moment Unterstützung, jedenfalls dahingehend, wo der Fehler sein könnte und was jemand, der mir dabei helfen möchte, wissen muss... in leichter Sprache wenn irgendwie möglich! Vielen herzlichen Dank für die Unterstützung!
Hallo  holybego,

leider liest sich der Beitrag sehr schlecht, was auch dem Umstand geschuldet ist, dass du in fast jeder Antwort mit Vollzitaten antwortest. Das bläht den Beitrag unnötig auf und macht ihn dadurch unübersichtlich. Wie ich hoffe, siehst du diese Antwort nicht auch als "schroff" an, so ist das nicht gemeint. Es ist einfach so, dass es nervt, wenn man den Kern der Frage(n) erst mühsam aus den verschiedenen Antworten herausfiltern muss. Siehe dazu auch meine PN.
(05.03.2024, 09:38)holybego schrieb: [ -> ]Tatsächlich verstehe ich aktuell fast nur Bahnhof. 

Selbst drüber nachdenken ? Also ich bin echt stolz bis hierher gekommen zu sein und finde es aber manchmal interessant, dass man hier in diesem Forum öfters ein bisschen schroff angegangen wird
Schroff angegangen werden? Ernsthaft? 

Du willst Programmierer sein - da muss man erwarten dürfen, dass du selber denkst, das ist Grundvoraussetzung! Wenn die Aufforderung, dir deinen eigenen Code (mit meinen Hinweisen) mal genau anzuschauen für dich schon an Beleidigung grenzt, dann liegst du falsch!
Selbstredend darf ich als Helfer erwarten, dass du den Code zumindest rudimentär verstehst - andernfalls teile von Beginn an klar mit, dass der Code nicht von dir ist oder du Hilfe auf einem anderen Niveau erwartest, als der Code vermuten lässt. Und wenn du Hinweise nicht genau verstehst, dann frage präzise nach. Das ist das, was ich von dir erwarte. 

Du verwechselst zudem Hilfestellung ("Hilfe zur Selbsthilfe") mit Grundlagenschulung. Letzteres ist etwas anderes, als ICH bereit bin zu geben, weil es mich mehr Zeit kostet, als ich für einen Menschen, den ich nicht einmal kenne, opfern will. Denk mal dran, was du verlangst...

Zum Thema, dann bin ich raus bei dir und deinen Problemen. wenn ich mich für meine Hilfestellungen auch noch rechtfertigen muss:

Die Struktur deines Codes sieht im Moment so aus:
Code:
Option Explicit

Sub Code()
Dim Zeile As Long


If BedingungErfüllt Then '(1)
   Zeile = EinWertDerErmitteltWird (<>0)
End If

'Es ist egal, ob die Bedingung (1) erfüllt wird oder nicht, der Code arbeitet hinterher einfach weiter
'Wenn die Bedingung (1) nicht erfüllt wurde, ist "Zeile" logischerweise 0, da ihr ja in diesem Fall kein anderer Wert zugewiesen wurde!
Bereich(Zeile, 1) = Wert
End Sub
Nochmal: ZEILE wird nirgends gefüllt, wenn die Bedingung nicht erfüllt wurde, ist also immer noch 0, also der Vorgabewert dieses Variablentyps. 

Weiter: 
Range(1,1) ist die erste Zelle (oben links) des Bereichs. Also die erste Zeile. 
Range(0,1) ist eine Zeile weniger - also die Zeile DAVOR. Das ist bei dir dann die Überschrift. 

Also: Nix Bahnhof. Ausprobieren. Hinschauen. Verstehen! 
Den Willen dazu und sich selbst Wissen anzueignen, muss man mitbringen. Das kostet Zeit.