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
04.03.2024, 23:26 (Dieser Beitrag wurde zuletzt bearbeitet: 04.03.2024, 23:26 von holybego.)
(04.03.2024, 23: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 ?
05.03.2024, 08:58 (Dieser Beitrag wurde zuletzt bearbeitet: 05.03.2024, 08:58 von holybego.)
@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
(04.03.2024, 22: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.
Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:1 Nutzer sagt Danke an Gast für diesen Beitrag 28 • holybego
05.03.2024, 10:05 (Dieser Beitrag wurde zuletzt bearbeitet: 05.03.2024, 10:08 von holybego.)
(05.03.2024, 09: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, 10: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!
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.
Viele Grüße Klaus-Dieter Der Erfolg hat viele Väter, der Misserfolg ist ein Waisenkind Richard Cobden
(05.03.2024, 10: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.