Autor
|
Thema: UsedRangeTest bricht vorzeitig ab, warum? (1111 / mal gelesen)
|
CAD-Freakle Mitglied CAD
Beiträge: 189 Registriert: 05.10.2015
|
erstellt am: 25. Feb. 2017 17:51 <-- editieren / zitieren --> Unities abgeben:
Hallo an Alle, zur Zeit versuche ich mich in VBA einzulesen. Jetzt wollte ich die "Replace-Funktion" ausprobieren. Zuerst habe ich die Daten in A1:C5 geschrieben,siehe JPG. Dann habe ich das Listing geschrieben siehe TXT. Bei der Ausgabe fehlen jetzt die letzten beiden Zellen C14 und C15, siehe JPG. Warum? Wo ist der Fehler? Danke an alle Helfenden. ------------------ -------------------------- Freundliche Grüsse CAD-Freakle INV Prof. 2015 SP2 (Student) _-_-_-_-_-_-_-_-_-_-_-_-_- Sodele, Jetzetle, ab gehts -_-_-_-_-_-_-_-_-_-_-_-_-_ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Ehrenmitglied V.I.P. h.c. IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 27. Feb. 2017 08:02 <-- editieren / zitieren --> Unities abgeben: Nur für CAD-Freakle
Hallo CAD-Freakle, also bei mir kommt die Ausgabe etwas anders heraus, siehe Bild - bei mir wird keine 5. Zeile geschrieben, was ich nach dem Code auch absolut logisch finde. Also entweder hast du andere Ausgangsdaten oder einen anderen Code für deine Routine. Es wäre vielleicht einfacher zum nachvollziehen, wenn du a) eine Excel-Mappe mit den Testcodes und Testdaten anhängst, damit sich das der geneigte Helfer nicht selber machen muss und du b) erklärst, was du erreichen möchtest, sonst kann ich zumindest schwer sagen, ob und wenn ja wo ein Fehler in der Logik ist. Wie gesagt, im Moment kommt meiner Ansicht nach genaus das raus, was die Programmlogik vorgibt. Ich versteh zwar nicht so ganz warum du die ersten vier Zeilen 10 Zeilen darunter noch mal schreiben und darin was ersetzen möchtest, aber das sagt die Prozedur und das tut es, zumindest bei mir. Wenn deine Ausgabe wirklich anders ist Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Freakle Mitglied CAD
Beiträge: 189 Registriert: 05.10.2015
|
erstellt am: 27. Feb. 2017 09:30 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, Danke für deine Antwort. Zitat: - bei mir wird keine 5. Zeile geschrieben, was ich nach dem Code auch absolut logisch finde.
Naja, Du hast in "If ze < ObergrenzeZe And sp <= ObergrenzeSp Then" das Gleichheitszeichen herausgenommen. Zitat: a) eine Excel-Mappe mit den Testcodes und Testdaten anhängst, damit sich das der geneigte Helfer nicht selber machen muss.
Hab's nochmal neu gemacht, siehe Datei im Anhang Zitat: b) erklärst, was du erreichen möchtest, sonst kann ich zumindest schwer sagen, ob und wenn ja wo ein Fehler in der Logik ist.
Was ich erreichen möchte: Die im ersten Beitrag gezeigten Daten sind nur Beispieldaten, um zu sehen ob und wie es überhaupt geht. Im angehängt JPG (Beispieldaten_20170227.jpg) habe ich eine Tabelle mit Profilen, diese möchte ich auseinanderklammüsern um die Daten einzeln zu verwenden. Die Datei Bespieldaten_20170227.JPG ist wiederum nur ein kleiner Ausschnitt von mehreren Tabellen. Zitat: Wenn deine Ausgabe wirklich anders ist ?
Ich habe deine Excel genommen und mit meinen Beispieldaten getestet. Es kommt wieder ein unvollständiges Ergebnis heraus. Warum? Wo liegt der Fehler? Wenn ich in den VBA-Editor gehe sehe ich kein Modul von Dir, Warum? ------------------ -------------------------- Freundliche Grüsse CAD-Freakle INV Prof. 2015 SP2 (Student) _-_-_-_-_-_-_-_-_-_-_-_-_- Sodele, Jetzetle, ab gehts -_-_-_-_-_-_-_-_-_-_-_-_-_ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Ehrenmitglied V.I.P. h.c. IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 27. Feb. 2017 10:39 <-- editieren / zitieren --> Unities abgeben: Nur für CAD-Freakle
Hallo CDA-Freakle, Zitat: Original erstellt von CAD-Freakle: Naja, Du hast in "If ze < ObergrenzeZe And sp <= ObergrenzeSp Then" das Gleichheitszeichen herausgenommen
Nee, eigentlich nicht, ich hab per Copy-Paste denm Code genommen, den du oben als Text angehangen hast. Aber egal ;) Zitat: Original erstellt von CAD-Freakle: Wenn ich in den VBA-Editor gehe sehe ich kein Modul von Dir, Warum?
Ist nicht als Modul drin, sondern direkt als Code am Tabellenblatt. Zitat: Original erstellt von CAD-Freakle: Ich habe deine Excel genommen und mit meinen Beispieldaten getestet. Es kommt wieder ein unvollständiges Ergebnis heraus. Warum? Wo liegt der Fehler?
Okidoki, ich hab jetzt mit deiner angehängten Tabelle probiert (die vom Code her jetzt auch etwas anders ist mit OR), da bekomm ich erst mal dasselbe Ergebnis wie du. Nachdem ich mir den Code jetzt etwas genauer angeschaut habe denke ich habe ich den Fehler in deiner Logik auch gefunden: Code: For Each Element In ZellenInhalt() If ze < ObergrenzeZe Or ze = ObergrenzeZe Then 'And sp <= ObergrenzeSp ZellenInhalt(ze, sp) = Replace(ZellenInhalt(ze, sp), "/", "---\/---") Cells(ceze, sp) = ZellenInhalt(ze, sp) ze = ze + 1 ceze = ceze + 1 ElseIf sp >= ObergrenzeSp Then 'ze >= ObergrenzeZe And Exit Sub Else If ze >= ObergrenzeZe Then ze = 1 sp = sp + 1 ceSp = ceSp + 1 ceze = ze + 10 End If End IfNext
Du läufst deine For each ... Next Schleife im Beispiel 15x durch, eben für jedes Element (so benannst du das) der 5x3 Matrix einmal. Aber du benutzt Element gar nicht, sondern holst die Inhalte aus einem Feld, was du dir vorher aus dem bereich selber vorgehalten hast. Jetzt ist es so, dass du nach deiner Logik, wenn du in der 6. Zeile angekommen bist (im Else-Zweig) den zeilenzähler zurücksetzt und in die nächste Spalte springst, aber keine Ausgabe für diesen Schleifendurchlauf machst! Da du diesen Bereich zweimal durchläufst (also zweimal zur näcshten Spalte springen musst) fehlen dir logischerweise 2 "Ergebnisse". Ich würde versuchen das etwas einfacher zu machen, ungefähr so:
Code:
Dim spalte As Integer Dim ze_read As Integer Dim ze_write_offset As IntegerDim ObergrenzeZe As Integer Dim ObergrenzeSp As Integer Dim Element ze_read = 1 spalte = 1 ze_write_offset = 10 ObergrenzeZe = UBound(ZellenInhalt, (1)) ObergrenzeSp = UBound(ZellenInhalt, (2)) For Each Element In ZellenInhalt() ' das aktuelle Element umwurschteln und unten hinschreiben Cells(ze_write_offset + ze_read, spalte) = Replace(Element, "/", "---\/---") ' nächste Zeile ze_read = ze_read + 1 ' falls "unten" angekommen Zeile und Spalte zum nächsten schreiben anpassen If ze_read > ObergrenzeZe Then ze_read = 1 spalte = spalte + 1 End If Next
End Sub
Auf diese Art läufst du eben alle deine Elemente durch, schreibst das jeweils an die gerade angepeilte Zelle und passt nur die "Zielzelle" für den nächsten Durchlauf an, wenn du unten abgekommen bist. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HenryV Mitglied Konstrukteur, Engineering
Beiträge: 778 Registriert: 18.05.2005 SolidWorks 2020 x64 SP3.0 Dell Precision 5820 Intel Xeon W-2125 4x4GHz NVIDIA Quadro P2000 5GB 32GB RAM 2x Dell U2412M, 24" TFT Windows 10 Enterprise x64 21H1 Microsoft Office 365 ProPlus Microsoft Visual Studio Enterprise 2022
|
erstellt am: 27. Feb. 2017 10:51 <-- editieren / zitieren --> Unities abgeben: Nur für CAD-Freakle
Hallo CAD-Freakle Das Problem liegt in deiner ForEach-Schlaufe. Du arbeitest nicht mit dem "Element" weiter, sonder mit dem generierst ein weiteres aus dem "ZellenInhalt"-Array. Entweder schreibst du dein Code mit zwei verschachtelten ForNext-Schlaufen um, oder verwendest dein "Element" in der ForEach-Schlaufe. Zweiteres würde z.B. so aussehen Code: Public Sub UsedRangeTest() Dim Auswahl As Range Dim Element As Range Worksheets("Tabelle1").Activate Set Auswahl = ActiveSheet.UsedRange For Each Element In Auswahl Element.Offset(10, 0).Value = Replace(Element.Value, "/", "---\/---") Next End Sub
Gruss Andreas ------------------ 21 ist nur die halbe Antwort. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Freakle Mitglied CAD
Beiträge: 189 Registriert: 05.10.2015
|
erstellt am: 28. Feb. 2017 06:51 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, Hallo Stefan, erstmal Danke Euch beiden. So nebenbei, VBA ist schon eine recht störrische Materie. Mir fällt da sofort das grau Tier mit den langen Ohren ein. So, jetzt zum Thema: Da mich meine eigenen Variablennamen überrannt haben, habe ich nochmal von vorne angefangen. Außerdem habe ich nochmal "Endlosschleife an: gesucht und gelesen, next gesucht". Mein Code funktioniert jetzt auch, wie ich mir das vorstelle. Siehe Anhang. Über weitere Anregungen und Kritik freue ich mich. ------------------ -------------------------- Freundliche Grüsse CAD-Freakle INV Prof. 2015 SP2 (Student) _-_-_-_-_-_-_-_-_-_-_-_-_- Sodele, Jetzetle, ab gehts -_-_-_-_-_-_-_-_-_-_-_-_-_ Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|