Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1544to1548
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Falsche Werte bei MergeArea

Falsche Werte bei MergeArea
01.03.2017 14:25:05
Ingo
Hallo zusammen,
ich beiße mir gerade die Zähne an einem Problem aus und hoffe, dass ihr mir weiter helfen könnt. Diverse Dinge konnte ich hier im Forum bereits recherchieren, aber hier komme ich echt nicht mehr weiter.
Worum gehts?
Ich habe eine Tabell mit mehreren Überschriften in der ersten Zeile. Die Überschriften fassen jeweils eine Anzahl von bis zu 12 Spalte zusammen.
Unter diesen Überschriften ist eine zweite Zeile mit "Unterüberschriften" unter denen die jeweiligen Datenin das Tabellenblatt eingegeben werden sollen (zur Eingabe verwende ich ein Formular). Die Überschrift ist als verbundene Zellen über den Bereich der jeweiligen Unterüberschriften. Ich hoffe das ich das verständlich rüber gebracht habe.
Da die Begriffe unter den Überschriften in der Regel gleich sind (nicht alle) möchte ich die Anzahl der Spalten, die unter jeder Überschrift sind in eine Variable schreiben. Probiert habe ich das mit folgendem hier im Forum auch benannten Code:
.MergeArea.Cells.Count
Das Problem:
Das funktioniert soweit auch gut für die ersten 6 verbundenen Zellen ("Kundendaten" bis " "Heute+4HJ"). Danach liefert er mir leider für die jeweilige ...count-Variable (var_heute5_count und folgende) nur noch eine 1 (anstelle der erwarteten 12, siehe auch Kommentare im Code). Hat jemand von euch einen wertvollen Tipp?
Vielen Dank für eure Hilf schon mal vorab!
VG, Ingo
Hier der Code:

Function func_insert_data_to_customer_tab()
Dim ws                  As Worksheet
Dim zelle
Dim var_feldname        As String
Dim var_customer_from   As Integer
Dim var_customer_count  As Integer
Dim var_heute_from      As Integer
Dim var_heute_count     As Integer
Dim var_heute1_from      As Integer
Dim var_heute1_count     As Integer
Dim var_heute2_from      As Integer
Dim var_heute2_count     As Integer
Dim var_heute3_from      As Integer
Dim var_heute3_count     As Integer
Dim var_heute4_from      As Integer
Dim var_heute4_count     As Integer
Dim var_heute5_from      As Integer
Dim var_heute5_count     As Integer
Dim var_heute6_from      As Integer
Dim var_heute6_count     As Integer
Dim var_heute7_from      As Integer
Dim var_heute7_count     As Integer
Dim var_heute8_from      As Integer
Dim var_heute8_count     As Integer
Dim iRow                As Integer
Dim iColumns            As Integer
Set ws = Worksheets("Detail_Kunde")
ws.Select
iColumns = .Cells(con_Suchzeile, .Columns.Count).End(xlToLeft).Column  ' gibt die   _
_
_
Anzahl der in Zeile 2 beschriebenen Spalten zurück
iColumns = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column  ' gibt die Anzahl    _
_
_
der in Zeile 2 beschriebenen Spalten zurück
For Each zelle In Range("A1:DM1")
var_feldname = zelle.Value
Select Case var_feldname
Case ""
Case "Kundendaten"	' Zelle A1 und 7 zusammengefasste Spalten --> Ausgabe OK
var_customer_from = zelle.Column
var_customer_count = zelle(con_ueberschrift, var_customer_from). _
MergeArea.Cells.Count
Case "Heute"	' Zelle H1 und 12 zusammengefasste Spalten --> Ausgabe OK
var_heute_from = zelle.Column
var_heute_count = zelle(con_ueberschrift, var_heute_from).MergeArea. _
Cells.Count
Case "Heute+1HJ"	' Zelle T1 und 12 zusammengefasste Spalten --> Ausgabe OK
var_heute1_from = zelle.Column
var_heute1_count = zelle(con_ueberschrift, var_heute1_from).MergeArea.   _
_
_
Cells.Count
Case "Heute+2HJ"	' Zelle AF1 und 12 zusammengefasste Spalten --> Ausgabe OK
var_heute2_from = zelle.Column
var_heute2_count = zelle(con_ueberschrift, var_heute2_from).MergeArea.   _
_
_
Cells.Count
Case "Heute+3HJ"	' Zelle AR1 und 12 zusammengefasste Spalten --> Ausgabe OK
var_heute3_from = zelle.Column
var_heute3_count = zelle(con_ueberschrift, var_heute3_from).MergeArea.   _
_
_
Cells.Count
Case "Heute+4HJ"	' Zelle BD1 und 12 zusammengefasste Spalten --> Ausgabe OK
var_heute4_from = zelle.Column
var_heute4_count = zelle(con_ueberschrift, var_heute4_from).MergeArea.   _
_
_
Cells.Count
Case "Heute+5HJ"	' Zelle BP1 und 12 zusammengefasste Spalten --> MergeArea   _
_
_
ergibt 1!
var_heute5_from = zelle.Column
var_heute5_count = zelle(con_ueberschrift, var_heute5_from).MergeArea.   _
_
_
Cells.Count
Case "Heute+6HJ"	' Zelle CB1 und 12 zusammengefasste Spalten --> MergeArea   _
_
_
ergibt 1!
var_heute6_from = zelle.Column
var_heute6_count = zelle(con_ueberschrift, var_heute6_from).MergeArea.   _
_
_
Cells.Count
Case "Heute+7HJ"	' Zelle CN1 und 12 zusammengefasste Spalten --> MergeArea   _
_
_
ergibt 1!
var_heute7_from = zelle.Column
var_heute7_count = zelle(con_ueberschrift, var_heute7_from).MergeArea.   _
_
_
Cells.Count
Case "Heute+8HJ"	' Zelle CZ1 und 12 zusammengefasste Spalten --> MergeArea   _
_
_
ergibt 1!
var_heute8_from = zelle.Column
var_heute8_count = zelle(con_ueberschrift, var_heute8_from).MergeArea.   _
_
_
Cells.Count
End Select
Next zelle
End 



		

28
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Beispieldatei?
01.03.2017 15:00:07
Michael
Hi,
das ist ohne Datei schlecht zu beantworten.
Lade bitte mal eine (anonymisierte) mit der exakten Struktur hoch.
Ansonsten heißt das Ding func_insert_data_to_customer_tab, ich sehe aber weder, daß irgendwo was eingefügt wird, noch einen Grund, eine "Function" zu verwenden, weil nirgends ein Wert zurückgegeben wird: da tut es eine "Sub" auch.
Schöne Grüße,
Michael
AW: Falsche Werte bei MergeArea
01.03.2017 15:01:49
MatthiasG
Hallo Ingo,
wozu hast du die Zellen denn verbunden?
Das gibt meistens Probleme mit VBA.
Kennst du diese Möglichkeit: Format Zellen, Ausrichtung, Horizontal: über Auswahl zentrieren?
Gruß Matthias
Anzeige
AW: Falsche Werte bei MergeArea
01.03.2017 15:10:59
MatthiasG
Hallo Ingo,
mit nichtverbundenen Zellen und der Zentrierung "über Auswahl" erhältst du die Über-Überschriften so:
(Testcode ins Tabellenblatt):

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim ueberschrift As String
ueberschrift = Cells(1, Target.Column)
If ueberschrift = "" Then ueberschrift = Cells(1, Target.Column).End(xlToLeft).Value
MsgBox ueberschrift
End Sub

Gruß Matthias
AW: Falsche Werte bei MergeArea
01.03.2017 16:20:19
Ingo
Ahh Ok, vielen Dank, Matthias.
In Deinem Bsp. bekomme ich die den Inhalt der Überschrift angezeigt, aber nicht die Anzahl der unter ihr vorhandenen Spalten. In Deinem Beispiel (C1:G1) wäre das Ergebnis, welches ich benötige 5. Das ist das, was ich bei mir in die *_count Variablen rein schreibe (die Anzahl der unter der Überschrift vorhandenen Sub-Unterschriften). Die Variablen werde später noch verwendet (definiert die Anzahl von Schleifendurchläufen). Vielleicht geht das noch einfacher, aber ich habe es erst einmal so aufgesetzt.
Und gleich noch eine doofe Frage (sorry, ich stecke halt noch in den Anfängen):
Auch habe ich mit dem Schlüsselwort "ByVal" noch nicht gearbeitet. Was ist der Zweck (in Verbindung mit target as range)?
Anzeige
AW: Falsche Werte bei MergeArea
01.03.2017 17:36:03
MatthiasG
Hallo Ingo,
das ByVal und ByRef ist die Methode der Argumentübergabe bei Funktionen und Prozeduren:
http://www.vb-tec.de/byvalref.htm
Die Prozedurkopf erscheint (mit dem "ByVal") so automatisch, wenn man sich das Ereignis "zusammenklickt":
https://www.youtube.com/watch?v=z88EX_1Dj2s
(etwa ab 1:40)
Aber zum Thema:
Ich habe dir mal eine Beispielmappe erstellt:
https://www.herber.de/bbs/user/111870.xlsm
Die Ober-Überschriften ist Zeile 1 sind alle mit "über Auswahl zentrieren" formatiert. Das kann man in einem Rutsch machen, man muss die Spaltenblöcke nicht separat formatieren.
Die Ober-Überschrift schreibt man anschließend in die erste Spalte, für die sie gelten soll. Zentriert wird dann bis zur nächsten beschriebenen Zelle.
Gruß Matthias
Anzeige
AW: Falsche Werte bei MergeArea
01.03.2017 21:25:17
Ingo
Hallo Matthias,
ich wollte mich nur noch einmal zur späten Stunde melden. Ich bin leider noch nicht dazu gekommen, mir Deine Informationen genauer anzuschauen. Mache ich morgen - versprochen! :-) Ich habe zu Deiner Info gerade noch meine Excel-Datei in meinem Austausch mit Michael hoch geladen. würde mich freuen, wenn Du da auch mal einen Blick drauf werfen könntest.
Vielen Dank und einen angenehmen Abend!
Ingo
AW: Falsche Werte bei MergeArea
01.03.2017 21:38:41
Ingo
Hallo Matthias,
bin wohl schon müde :-(
Statt nur drauf hin zu weisen, hätte ich Dir gleich auch den Link beifügen können. Das hole ich hiermit nach ;-)

Die Datei https://www.herber.de/bbs/user/111882.xlsm wurde aus Datenschutzgründen gelöscht


Nochmals einen angenehmen Abend
Ingo
Anzeige
AW: Falsche Werte bei MergeArea
01.03.2017 15:19:56
Ingo
Hallo Matthias,
zuerst einmal vielen Dank für die schnelle Antwort.
Der Grund warum ich das so gemacht habe ist dass ich auf diese Art und Weise eine dynamische Tabelle gestalten kann. Soll heißen: wenn ich später eine Spalte einfüge, muss ich im Code nichts ändern, da die Anzahl der Spalten über die AreaMerge ausgegeben wird diese dann als Parameter für die weitere Verarbeitung verwendet wird - so zumindest bislang meine Annahme. Für die ersten mind. 67 Spalten läuft es ja gut.
Die von Dir vorgeschlagene Möglichkeit via
Format Zellen, Ausrichtung, Horizontal: über Auswahl zentrieren
kenne ich nicht. Was genau wird damit gemacht? Passt das zu dem, was ich mir vorgestellt habe?
VG
Ingo
Anzeige
AW: Falsche Werte bei MergeArea
01.03.2017 15:35:14
MatthiasG
Hallo Ingo,
Was genau wird damit gemacht? Passt das zu dem, was ich mir vorgestellt habe?
Schreibe in ein leeres Blatt z.B. in C1 eine Überschrift.
Markiere dann C1:G1
Drücke Strg+1 (Zelle formatieren) stelle die horizontale Ausrichtung auf "über Auswahl zentrieren".
Das schaut halt aus wie verbunden, nur dass die Zellauswahl so ist wie nichtverbunden. Wenn es Überschriften sind, sollte sowieso keiner was verändern dürfen (Blattschutz).
Da die Begriffe unter den Überschriften in der Regel gleich sind (nicht alle) möchte ich die Anzahl der Spalten, die unter jeder Überschrift sind in eine Variable schreiben.
Wozu schreibst du das in eine Variable? Das ist ja kein Selbstzweck. Weiter oben habe ich dir gezeigt, wie du aus der ermittelten Spalte die Über-Überschrift ermitteln kannst. Ist das der Sinn der Übung, oder reden wir grade aneinander vorbei?
Gruß Matthias
Anzeige
Es ist nicht sinnvoll, alle Variablen als ...
01.03.2017 17:53:54
Luc:-?
Integer zu deklarieren, Ingo,
schon gar nicht solche für Zeilen- und SpaltenNrn! Hierfür verwendet man normalerweise Long.
Wenn deine richtige Methode ein falsches Ergebnis liefert, ist der ZellBezug vermutlich falsch. Das solltest du in schrittweiser PgmAbarbeitung überprüfen!
Gruß, Luc :-?
Besser informiert mit …
AW: Es ist nicht sinnvoll, alle Variablen als ...
01.03.2017 21:41:38
Ingo
Guten Abend Luc,
vielen Dank für Deine Antwort. Grundsätzlich hast Du mit Long ja recht, nur ich erwarte eigentlich nicht so große Zahlen, dass ich den Wertebereich von Integer ausschöpfen würde. Dennoch hatte ich den Gedanken auch schon und kann daher die Deklaration als Ursache ausschließen. Wie schon gesagt wird die Überschrift und auch die entsprechende verbundene Zelle korrekt erkannt. Die Berechnung der darunter liegenden Spalten funktioniert leider nicht korrekt. Interessanter Weise auch erst ab "var_heute5_count". Vorher stimmen alle Werte. Ich habe meine Excel-Datei mal hoch geladen:

Die Datei https://www.herber.de/bbs/user/111882.xlsm wurde aus Datenschutzgründen gelöscht


Ich wünsche Dir einen angenehmen Abend
VG
Ingo
Anzeige
AW: Luc hat aber Recht mit der Deklaration...
02.03.2017 07:13:34
MatthiasG
...als Long, Ingo.
Auch wenn du meinst, das kommt nicht vor: Manchmal braucht man z.B. einen Ausdruck wie
Cells(Rows.Count,1).End(xlup).Row

(um die erste freie Zelle zu ermitteln).
Und das wäre ja blöd, wenn du bei so etwas auf einen Überlauf stoßen würdest.
Es ist ja nicht so, dass man wie beim C64 damals unbedingt Speicher sparen müsste...
Bereich markieren, Strg+H, suchen nach Integer, Ersetzen durch Long.
Gruß Matthias
AW: Luc hat aber Recht mit der Deklaration...
02.03.2017 08:36:42
Ingo
Guten Morgen Mathias, Luc, Piet, Michael,
ich habe jetzt noch einmal alles mit Long deklariert. Der Fehler tritt genau an der gleichen Stelle auf. Danke auch für den Tipp bezüglich Visio Viewer. Es ist sehr wahrscheinlich, dass die Excel Mappe später noch mind. ein weiterer Kollege verwenden wird. Seine Rechnerumgebung kenne ich nicht. Daher ist es sinnvoll gleich solche "Tretminen" bereits vorab zu eliminieren.
Den Ausdruck
Cells(Rows.Count, 1).End(xlup).Row
verwende ich in der Tat um den letzten Eintrag zu finden und dann eine neue Zeile einzufügen. Vielen Dank für den Tipp, da wäre ich wahrscheinlich auf das nächste Problem gelaufen. Aber das ist erst der nächste Schritt.
Hatte einer von euch mal die Zeit um sich meine Datei mal anzuschauen? Tritt der Fehler bei euch auch auf?
VG und nochmals besten Dank für euren Support!
Ingo
Anzeige
AW: Luc hat aber Recht mit der Deklaration...
02.03.2017 08:38:24
MatthiasG
Hallo Ingo,
Tritt der Fehler bei euch auch auf?
Welcher Fehler?
Gruß Matthias
AW: Luc hat aber Recht mit der Deklaration...
02.03.2017 09:07:15
Ingo
Hallo Matthias,
Du irritierst mich. Jetzt sag bitte nicht, dass bei dir die Variablen in der Case-Anweisung im Code des Moduls mod_insert_data korrekte Werte haben?! Also alle *_Count Variablen beginnend mit var_heute5_count haben bei mir den Wert 1. Korrekt und von mir erwartet wäre der Wert 12. Die *_Count Variablen zuvor (also die, die innerhalb der Case Kontrollstruktur vor var_heute5_count) liefern die korrekten Werte zurück. Was verursacht diesen Bruch? Der Code ist doch identisch!
VG
Ingo
Anzeige
MS deklariert auch so, mitunter sogar als ...
02.03.2017 21:04:02
Luc:-?
Double. Man sollte As Integer eigentlich nur deklarieren, wenn man den Definitionsbereich auch tatsächlich einschränken will, nicht aber, wenn man meint, kommt nicht vor! Allerdings müsste man bei starken Einschränkungen wie MS auf Enumerationen zurück­greifen und deren WerteVorrat dann auch noch pgmmäßig absichern.
Übrigens ist es für Zeilen-/SpaltenNrn und großen Datenmengen angeraten, statt Long LongPtr zu verwenden. Dieser „DatenTyp“ wird auf einem 32Bit-System als Long und auf 64Bit-Systemen als LongLong interpretiert*. Damit wäre man bei Umstellungen immer auf der sicheren Seite.
* Mal in der VBE-Hilfe nachlesen!
Luc :-?
ich nochmal
01.03.2017 19:19:56
Michael
Hi,
die große Frage ist, was Du mit den ermittelten Werten überhaupt anfangen möchtest.
Ich vermute, Du suchst zu gegebenen Wertepaaren (also Überschrift 1. Zeile und Überschrift 2. Zeile) die dazugehörige Nummer der Spalte.
Diese Nummer läßt sich relativ einfach ermitteln (Button "Simpel"); falls Du die Tabelle aber mit x Werten befüllen möchtest, bietet sich der Umweg über die komplizierte Funktion an (Button "Array").
Hier wird in der Zeile alles, was die Überschriften betrifft, in das Array Ueber eingelesen...
Ueber = einlesen("Tabelle1")

... wobei Du hier den Namen des gewünschten Tabellenblatts mit angibst.
Das funktioniert mit nur EINER Suche (wie gesagt, Button "Array"), aber auch mit einer Schleife über einen Bereich (hier ein paar Wertepaare in S7:T10 mit dem Button "über Bereich".
Die ganzen ins Array Ueber eingelesenen Daten kann man auch "strukturiert" ausgeben (Button "Gesamtstruktur"), wobei ich hier (endlich) auch die jeweilige Spaltenanzahl mit ausgebe.
Die drei Buttons "Array", "über Bereich" und "Gesamtstruktur" beinhalten einige Beispiele, wie Du auf die Ergebnisse in Ueber zugreifen kannst...
Die Datei: https://www.herber.de/bbs/user/111877.xlsm
Schöne Grüße,
Michael
AW: ich nochmal
01.03.2017 21:12:13
Ingo
Hallo Michael,
vielen lieben Dank für Deine Antwort(en). Mein Excel-File habe ich mittlerweile auch so weit, dass ich sie hochladen könnte ;-)
Allerdings hast Du mit den von mir gemachten Angaben dem Grunde nach die Tabelle exakt nachgebildet, so dass ich fast annehmen würde, dass du sie nicht mehr benötigst?! Super!
Die Eingabe erfolgt bei mir über ein Formular - kein Problem. Ich meine herausgelesen zu haben, dass Du die Unterüberschriften quasi selber definierst? Dem wäre nicht so. Die Überschriften - sowohl in Zeile 1 als auch in Zeile 2 sind erst einmal fest. Es könnte sein, dass sie später noch ergänzt werden, warum ich das Ganze etwas dynamisch haben möchte.
Ziel des Ganzen ist, dass ich über ein Formular einen neuen Kunden mit diversen Daten und einem Forecast (Spalten Heute+1HJ ... Heute+8HJ) anlegen möchte. Die Daten werden in die entsprechenden Spalten geschrieben. Mein Problem ist nur, dass mein Code soweit läuft, aber halt nicht komplett.
Ich lege doch mal meine Datei bei :-) Vielleicht fällt dir etwas auf / ein, woran es liegen könnte. Bitte werf mal einen Blick auf meine Case-Anweisung im Code des Moduls mod_insert_data. Die Fkt. wird aus der dem Formular UF_new_customer aufgerufen und wird durch button_click getriggert (Button: Tabellenblatt "customer"). Das Problem beginnt in der Case-Anweisung ab var_heute5_count. Da bekomme ich eine 1 zurück und nicht die erwartete 12.
Ich bin bei weitem noch nicht fertig...
Deinen Code schaue ich mir morgen noch einmal im Detail an. Ich hab heute keinen Nerv mehr - bin seit 7:00 Uhr dran und bin nach wie vor der Ansicht, dass es eigentlich laufen sollte. Allerdings habe ich bereits von MatthiasG eine Info erhalten, dass verbundene Zellen in VBA Probleme bereiten, was ich mir durchaus vorstellen kann.
Hab einen schönen Abend und nochmals vielen Dank für Dein Engagement!!! :-)
Hier die Datei:

Die Datei https://www.herber.de/bbs/user/111882.xlsm wurde aus Datenschutzgründen gelöscht


VG
Ingo
AW: ich nochmal
01.03.2017 22:51:02
Piet
Hallo Ingo
es ist normalerweise nicht mein Thread, aber aus Interesse habe ich mir deine letzte AW angesehen und die Beispieldatei heruntergeladen. Beim Öffnen bekam ich sofort eine Error Meldung genau bei dieser Zeile:
DateSerial(Year(Date), Month(Date), Day(Date)) -- ersetze alle DateSerial durch diesen Code:
DateSerial(Year(Now), Month(Now), Day(Now))
Würde mich freuen wenn das Programm von Michael danach einwandfrei klappt.
mfg Piet
AW: ich nochmal
02.03.2017 07:21:24
MatthiasG
Hallo Piet,
Date funktioniert aber eigentlich schon, nur bei der Beispielmappe nicht.
Da ist ein Verweis kaputt, nämlich
NICHT VORHANDEN: Microsoft Visio Viewer 12.0 Type Library
Den Haken davor wegmachen, dann klappt's auch wieder mit Date :-)
Und Ingo hat den Fehler wahrscheinlich nicht, weil er Visio Viewer installiert hat.
Gruß Matthias
Michaels Antwort von sieht gut aus
02.03.2017 12:08:01
sieht
Hallo Michael, @all
ich habe mir Deine Lösung gerade mal etwas genauer angeschaut. Zumindest die Funktion zur Ausgabe der Spaltenzahl sieht sehr gut aus. Hier sind aber diverse Dinge drin, mit denen ich noch nicht ganz klar komme und die ich mir erst einmal noch anlesen muss (z. B. Aufbau von Arrays etc.). Ich schaue mal, ob ich das in mein Tool irgendwie rein bekomme ;-)
wozu ist das Pipe ("|")? Ist das lediglich zum Trennen um die einzelnen Überschriften getrennt in das Array einzulesen? Oder hat es noch eine andere Funktion?
VG
Ingo
AW: Michaels Antwort von sieht gut aus
02.03.2017 12:28:45
sieht
Hi Ingo,
ich habe heute leider keine Zeit, Deine Datei anzusehen - erst morgen wieder.
Zu meiner Datei: ich habe halt zum Teste "irgendwas" als Überschriften in Zeile 1+2 reingeschrieben - Du mußt halt nur mal reinkopieren, was Du als Unterüberschriften hast...
Das Makro ist relativ aufwendig: eigentlich mußt Du es gar nicht im Detail verstehen, sondern nur zusehen, daß Du mit dem "gelieferten" Ausgabe-Array zurechtkommst: dafür hast Du ja drei Beispiele.
Einen zugänglichen Text zu Arrays findest Du hier:
http://www.online-excel.de/excel/singsel_vba.php?f=152
Ich habe übrigens bei Variablen die Kurzschreibweise verwendet: & = as Long, $ = as String, Näheres findest Du hier:
http://de.wikibooks.org/wiki/VBA_in_Excel/_Variablen_und_Arrays
Schöne Grüße, bis morgen,
Michael
AW: Michaels Antwort von sieht gut aus
02.03.2017 13:46:46
sieht
Super und vielen Dank Michael, das hilft mir sehr weiter :-)
So ganz einfach mit dem rein kopieren ist es aber nicht getan, da ich zur Eingabe ein Formular verwende. Aber grundsätzlich sollte es funktionieren, wenn ich die Funktionen da rein kopiere und die Eingabewerte entsprechend übergebe. Ich habe nur noch keinen Ansatz wie ich das machen möchte. Grundsätzlich hatte ich es so gedacht, dass die relevanten Felder beim Klick auf den Button "Create new Customer" (Button im Formular) alle eingegebenen Daten in das Tabellenblatt "Detail_Kunde" übernommen werden. Und hier kommt genau mein Problem mit den Arrays zum tragen, da ich noch nicht genau weiß, wie ich es ansprechen muss.
Ich lasse den Beitrag noch bis morgen offen.
VG und nochmals besten Dank für Deine Unterstützung!
Ingo
PS: Mit dem kopieren hat natürlich geklappt :-)
Ausfall wegen Krankheit
03.03.2017 10:35:29
Ingo
Hallo zusammen,
ich werde heute nicht zum Antworten auf eure Beiträge kommen. Das hat nichts mit stieselig oder Missachtung der Forenbeiträge zu tun, sondern vielmehr damit, dass es mich gestern total ausgeknockt hat. Ich bitte daher sehr um euer Verständnis.
@Michael: mir ist da noch etwas bei Deinem Code aufgefallen: VBA ist doch Ereignisgetrieben. Also würde ich irgendwo einen Button_click Aufruf erwarten?! Wie ist das bei Dir gelöst, also das Einlesen der Werte nach dem Klick auf einen der 4 Buttons?!
VG
Ingo
AW: Ausfall wegen Krankheit
03.03.2017 15:12:56
Michael
Hi,
erst Mal wünsche ich gute Genesung! Ich hatte dieses Jahr auch schon öfter zu kämpfen...
Also, das ist alles so eine Sache; wo ich in Deiner Datei hingreife, schreit es nach Optimierung, z.B. läßt sich...
Function func_calc_date(Offset)
Dim var_lab_heute As Date
Dim var_lab_6_month As Date
Dim var_lab_12_month As Date
Dim var_lab_18_month As Date
Dim var_lab_24_month As Date
Dim var_lab_30_month As Date
Dim var_lab_36_month As Date
Dim var_lab_42_month As Date
Dim var_lab_48_month As Date
If Offset = 0 Then
var_lab_heute = DateSerial(Year(Date), Month(Date), Day(Date))
func_calc_date = var_lab_heute
ElseIf Offset = 6 Then
var_lab_6_month = DateSerial(Year(Date), Month(Date) + 6, Day(Date))
func_calc_date = var_lab_6_month
ElseIf Offset = 12 Then
var_lab_12_month = DateSerial(Year(Date), Month(Date) + 12, Day(Date))
func_calc_date = var_lab_12_month
ElseIf Offset = 18 Then
var_lab_18_month = DateSerial(Year(Date), Month(Date) + 18, Day(Date))
func_calc_date = var_lab_18_month
ElseIf Offset = 24 Then
var_lab_24_month = DateSerial(Year(Date), Month(Date) + 24, Day(Date))
func_calc_date = var_lab_24_month
ElseIf Offset = 30 Then
var_lab_30_month = DateSerial(Year(Date), Month(Date) + 30, Day(Date))
func_calc_date = var_lab_30_month
ElseIf Offset = 36 Then
var_lab_36_month = DateSerial(Year(Date), Month(Date) + 36, Day(Date))
func_calc_date = var_lab_36_month
ElseIf Offset = 42 Then
var_lab_42_month = DateSerial(Year(Date), Month(Date) + 42, Day(Date))
func_calc_date = var_lab_42_month
ElseIf Offset = 48 Then
var_lab_48_month = DateSerial(Year(Date), Month(Date) + 48, Day(Date))
func_calc_date = var_lab_48_month
End If
End Function
...eindampfen auf ...
Function func_calc_date(Offset)
func_calc_date = DateSerial(Year(Date), Month(Date) + Offset, Day(Date))
End Function

... und analog
Function func_calc_label(var_offset)
func_calc_label = func_calc_lab_month(DateSerial(Year(Date), Month(Date), Day(Date)))
End Function        '--> func_calc_label

Das nur nebenbei.
Ich habe das "Struktur" (quasi zur Ansicht, wie man Werte ausliest) in Deine Datei gesteckt sowie skizziert, wie man Werte sinnvoll aus TextBoxen entnimmt: in einer Schleife (hier das Kernstück):
Function func_insert_data_to_customer_tab(wie&) ' ***
Dim i&, j&
Dim Ueber, KuZ          ' KuZ = Kundenzeile; als Array mit der Breite von Ausgabe(1), 1 Zeile  _
hoch
Dim neuZ&, KuNr         ' unterste, leere Zeile, Kundennummer as variant
Dim rueckWerte&(1 To 2) ' falls zwei Rückgabewerte erwünscht
MsgBox "Betriebsart: " & wie & " = 0 oder 1, kann hier dann verarbeitet werden." ' ***
Ueber = einlesen("Detail_Kunde")
ReDim KuZ(1 To 1, 1 To UBound(Ueber(1), 2))
With Sheets("Detail_Kunde")
neuZ = .Range("A" & .Rows.Count).End(xlUp).Row + 1
KuNr = .Range("A" & neuZ - 1)
End With
rueckWerte(1) = neuZ
If IsNumeric(KuNr) Then KuNr = KuNr + 1 Else KuNr = minKuNr
' Ab hier mit Daten bestücken
KuZ(1, 1) = KuNr: rueckWerte(2) = KuNr
KuZ(1, 2) = UF_new_customer.cmb_status_new
KuZ(1, 4) = UF_new_customer.txt_kd_lang
' Schleife ************************************************
j = 8   ' hier dann jeweils der Anfang des neuen 12er-Blocks
For i = 0 To 24 Step 6  ' habe nur die ersten paar bis 24 umbenannt
KuZ(1, j) = UF_new_customer.Controls("TB_real_" & i).Value
j = j + 1
Next
Sheets("Detail_Kunde").Range("A" & neuZ).Resize(1, UBound(KuZ, 2)) = KuZ
func_insert_data_to_customer_tab = rueckWerte
End Function

KuZ ist die komplette Ausgabezeile für einen Kunden als Array, wobei die "TB_real " & i die grünen (von mir derart umbenannten) TextBoxen aus dem grünen Bereich der UF sind: gib dort mal was ein und schreibe einen neuen Kunden.
Gerade auf Deinen "Presets" hast Du die TextBoxen wild durcheinander nummeriert: so schreibst Du Dir einen Wolf bei den Zuweisungen, das geht besser nach folgendem Schema:
TB_1_1 (TextBox Zeile 1, Spalte 1) bis
TB_8_9 (TextBox Zeile 8, Spalte 9)
Dann kannst Du wie oben je eine Zeile oder Spalte auslesen und direkt in das Array KuZ übernehmen, also etwa:
Dim zeile&
zeile = 3
j = 20   ' hier dann jeweils der Anfang des neuen 12er-Blocks
For i = 1 To 9
KuZ(1, j) = UF_new_customer.Controls("TB_" & zeile & "_" & i).Value
j = j + 1
Next

respektive
Dim spalte&
spalte = 4
j = 20   ' hier dann jeweils der Anfang des neuen 12er-Blocks
For i = 1 To 8
KuZ(1, j) = UF_new_customer.Controls("TB_" & i & "_" & spalte).Value
j = j + 1
Next

Hier noch die geänderte Datei: https://www.herber.de/bbs/user/111930.xlsm
Schöne Grüße,
Michael
Nachtrag
04.03.2017 12:11:53
Michael
Hallo Ingo,
ich bitte meine Kritik in Sachen Optimierung nicht persönlich zu nehmen: für "Basiskenntnisse in VBA" schlägst Du Dich ganz gut. Und ja: ich habe auch schon etlichen "suboptimalen" Code geschrieben.
Man wächst halt rein, wenn man sich viel damit beschäftigt.
Den Code sehr kurz zu schreiben (wo möglich und in Fällen wie oben) hat zwei Vorteile:
a) das Blättern im Skript ist übersichtlicher und
b) das Skript läuft schneller und ist wegen der Kürze weniger fehleranfällig (im Forum finden sich hin und wieder Anfragen wegen Fehlermeldungen im Sinne von "zu wenig Speicher", und wenn das auftritt, ist oft zu "umständlicher" Code verantwortlich).
Also, laß Dir den Spaß nicht verderben!
Alles Gute,
Michael
AW: Nachtrag
04.03.2017 18:54:17
Ingo
Guten Abend Michael,
erst einmal ein gaaanz dickes Dankeschön für die Wahnsinns Zeit, die Du hier für mein Problem investierst. Und auch vielen Dank für die guten Wünsche zur Genesung. Ich befinde mich langsam auf dem Weg der Besserung. Die letzten 2 Tage hatte ich allerdings bis 39,5 und habe mich entsprechend gefühlt.
Zu Deinem Nachtrag: ich nehme Deine Ratschläge auf GAR KEINEN FALL persönlich. Im Gegenteil. Ich bin Dir total dankbar für Deine Tipps. Ich weiß das echt zu schätzen! Insbesondere weil es auch nicht mal eben in 2 Minuten nieder geschrieben ist, sondern Du Dir echt Gedanken gemacht hast.
Das ist echte Werbung nicht zuletzt auch für dieses Forum. Letzteres gilt natürlich auch für die anderen aus meiner Sicht sehr kompetenten Beiträge zu meinem Problem.
VG und einen schönen Abend noch
Ingo
na, dann bin ich ja beruhigt
07.03.2017 13:31:30
Michael
Hallo Ingo,
danke für Deine Zeilen.
Ich wünsche weiterhin frohes Schaffen,
Michael

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige