| | | Materialien für den 3D-Druck im Hochtemperaturbereich, eine Pressemitteilung
|
Autor
|
Thema: Excel VBA: Cells Z, S vs Range SZ bzw.Range S1Z1 S2Z2 vs SZ bzw. S1Z1 S2Z2 (190 / mal gelesen)
|
ArCADe-Spieler Mitglied Metallbautechniker
Beiträge: 382 Registriert: 05.12.2012 Win 10 64bit Office 2019
|
erstellt am: 09. Dez. 2024 14:40 <-- editieren / zitieren --> Unities abgeben:
Hallo Gemeinde, hallo Klaus, im Moment ist für mich ein Antworten im Original-Thread nicht möglich, da sich - wahrscheinlich auf Grund der "Sonderzeichen" ()[]: im Thread-Titel - immer eine sucuri-Website-Firewall einklinkt ... da wird wohl vermutet, ich wolle per Link irgendwelchen Schadcode ausführen ... keine wirkliche Ahnung davon ... also, auf Grund dessen habe ich diesen neuen Thread zum gleichen Thema ohne Sonderzeichen im Titel gestartet. Er schließt sich nahtlos an diesen letzten Post in diesem Thread an. Als Erstes noch einmal zum Thema "Office 365 aber Excel 2019": ein Missverständnis meinerseits, bei uns läuft das komplette Office unter jeweils einer Version ... die meisten Rechner mit 2019, die aktuell neu aufgesetzten mit 2021. Der Office365-Anteil bezieht sich ausschließlich auf Teams, SharePoint und das gemeinsam genutzte Adressbuch. Und als Zweites ein paar "neue" Erkenntnisse zur Verwendung der drei Schreibweisen: Beim Kopieren eines Zellbereichs aus einer anderen, geöffneten Mappe (per Makro, das aus der Zieldatei heraus gestartet wurde), funktioniert die folgende Schreibweise NICHT, sondern führt zu einem 1004-Fehler: Code: Workbooks("Quellmappe.xlsm").Worksheets("Quelltab").Range(Cells(1, 1), Cells(41, 7)).Copy Sheets("Zieltab").Cells(1, 1)
(und beim Einfügen dieses Code-Schnipsels fällt mir auf, dass aktuell die html dieser Beitrag-Erstellungs-Webseite zerschossen/beeinträchtigt scheint: die links von diesem Texteingabefenster platzierte Überschrift "Beitrag:" und die darunter platzierten Formatierungs-Links von "Fachbegriff" bis "Code" und auch die Inhalte der beiden darunter befindlichen Teilfenster "System-Info / Zusatztext" und "Optionen" sind (in-/)übereinander verschoben) Die folgende Schreibweise dagegen funktioniert: Code: Workbooks("Quellmappe.xlsm").Worksheets("Quelltab").Range("A1:F41").Copy Sheets("Zieltab").Cells(1, 1)
Grüße Gernot PS: der Doppelpunkt scheint es im alten Thread-Titel schon mal nicht gewesen zu sein ... im neuen Titel habe ich einen übersehen ... dann tippe ich mal auf die eckigen Klammern als Teil der kurzen Range-Schreibweise [Diese Nachricht wurde von ArCADe-Spieler am 09. Dez. 2024 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 400 Registriert: 11.08.2007
|
erstellt am: 12. Dez. 2024 10:28 <-- editieren / zitieren --> Unities abgeben: Nur für ArCADe-Spieler
Hi Gernot, bei deinem 1. Code muss auch für Cells(...) jeweils der Bezug zum Workbook/Worksheet gesetzt werden, denn Zellbezeichnungen ohne Bezug sind generell immer auf das aktive Tabellenblatt ausgerichtet und das ist in diesem Fall ein Widerspruch, da sich die Zellen ja in dem anderen Workbook/Worksheet befinden. So sollte es aber keinen Laufzeitfehler geben Code: With Workbooks("Quellmappe.xlsm").Worksheets("Quelltab") .Range(.Cells(1, 1), .Cells(41, 7)).Copy Sheets("Zieltab").Cells(1, 1) End With
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 400 Registriert: 11.08.2007 Win 10 Pro, Office 97 bis Office 2016
|
erstellt am: 12. Dez. 2024 10:34 <-- editieren / zitieren --> Unities abgeben: Nur für ArCADe-Spieler
Hi Gernot, bei deinem 1. Code muss auch für Cells(...) jeweils der Bezug zum Workbook/Worksheet gesetzt werden, denn Zellbezeichnungen ohne Bezug sind generell immer auf das aktive Tabellenblatt ausgerichtet und das ist in diesem Fall ein Widerspruch, da sich die Zellen ja in dem anderen Workbook/Worksheet befinden. So sollte es aber keinen Laufzeitfehler geben Code: With Workbooks("Quellmappe.xlsm").Worksheets("Quelltab") .Range(.Cells(1, 1), .Cells(41, 7)).Copy Sheets("Zieltab").Cells(1, 1) End With
Bis später, Karin PS: ich hatte diesen Beitrag bereits 1 mal abgeschickt, aber er wird nicht angezeigt und löschen kann ich ihn auch nicht mehr. Entscghuldigung, falls er 2 mal vorhanden ist [Diese Nachricht wurde von Beverly am 12. Dez. 2024 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ArCADe-Spieler Mitglied Metallbautechniker
Beiträge: 382 Registriert: 05.12.2012 Win 10 64bit Office 2019
|
erstellt am: 12. Dez. 2024 12:52 <-- editieren / zitieren --> Unities abgeben:
Hallo Beverly Karin, vielen Dank für Deinen Hinweis. Leider komme ich nur sehr sporadisch dazu, an diesem Projekt weiter zu programmieren (der "ganz normale Wahnsinn" als Techniker/Konstrukteur wirft mir da immer wieder - und besonders gern so kurz vor dem Jahresende - sehr gekonnt Steine in den Weg ), und habe ihn daher bis jetzt noch nicht ausprobieren können. ABER: da ich tatsächlich noch das Kopieren von "errechneten" Zellbereichen an "errechnete" Einfügepositionen vor mir habe, ist mir Dein Tip 10 Unities und gute Wünsche für die kommenden Feiertage wert ... sowas in Range("SZ")-Schreibweise sowohl für die Spalten als auch für die Zeilen hinzufrickeln hätte schon seine ganz eigenen Tücken. Grüße Gernot [Edit1] Name korrigiert [Edit2] und nachdem ich jetzt Deine beiden Posts mehrmals gelesen und verdaut habe: für den Bezug von Cells ist der Punkt davor notwendig, und könnte ich dann den Zieltab weglassen? etwa so:
Code: With Workbooks("Quellmappe.xlsm").Worksheets("Quelltab") .Range(.Cells(1, 1), .Cells(41, 7)).Copy Cells(1, 1) End With
oder würde vielleicht sogar das hier funktionieren?:
Code: Workbooks("Quellmappe.xlsm").Worksheets("Quelltab").Range(.Cells(1, 1), .Cells(41, 7)).Copy Cells(1, 1)
[Diese Nachricht wurde von ArCADe-Spieler am 12. Dez. 2024 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2823 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 13. Dez. 2024 13:37 <-- editieren / zitieren --> Unities abgeben: Nur für ArCADe-Spieler
Hallo Gernot, Wie Karin schon richtig geschrieben hat, brauchen die Zellen Zuordnungsobjekte, weshalb sie dies in die WITH-Anweisung gepackt hat. Das erste Beispiel (ohne Zieltabelle) kann funktionieren wenn die Zieltabelle das aktive Tabellenblatt ist Dein Versuch mit Code: Workbooks("Quellmappe.xlsm").Worksheets("Quelltab").Range(.Cells(1, 1), .Cells(41, 7)).Copy Cells(1, 1)
Wird nicht funktionieren da .Cells keinen Bezug hat. Ohne With Anweisung wäre das eine sehr lange Zeile:
Code:
Workbooks("Quellmappe.xlsm").Worksheets("Quelltab").Range(_ Workbooks("Quellmappe.xlsm").Worksheets("Quelltab").Cells(1, 1), _ Workbooks("Quellmappe.xlsm").Worksheets("Quelltab").Cells(41, 7))_ .Copy Cells(1, 1)
Aber teste doch einfach mal selbst Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 400 Registriert: 11.08.2007
|
erstellt am: 13. Dez. 2024 14:03 <-- editieren / zitieren --> Unities abgeben: Nur für ArCADe-Spieler
Hi Gernot, Hi Klaus, die Codezeile Code: Workbooks("Quellmappe.xlsm").Worksheets("Quelltab").Range(.Cells(1, 1), .Cells(41, 7)).Copy Cells(1, 1)
wird NIE funktionieren sondern einen Fehler auslösen, weil die Punkte vor Cells IMMER einen Bezug haben MÜSSEN, was man mittels einer With-Anweisung realisiert (wie in meinem vorhergehenden Beitrag ausgeführt). Ohne Punkt vor Cells, also on dieser Form Code: Workbooks("Quellmappe.xlsm").Worksheets("Quelltab").Range(Cells(1, 1), Cells(41, 7)).Copy Cells(1, 1)
löst der Code zwar keinen Fehler aus, würde aber den Bereich vom gerade aktiven Tabellenblatt kopieren, aber auch NUR dann, wenn die angesprochene Arbeitsmappe - also "Quellmappe.xlsm" - die aktive ist. Ist eine andere Arbeitsmappe die aktive, dann löst der Code ebenfalls einen Fehler aus.
Bis später, Karin [Diese Nachricht wurde von Beverly am 13. Dez. 2024 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2823 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 13. Dez. 2024 15:15 <-- editieren / zitieren --> Unities abgeben: Nur für ArCADe-Spieler
Hallo Gernot, Was ich ganz gerne mache bei Tabellen in verschiedenen Arbeitsblättern, ich definiere mir Stellvertretervariablen: Code:
Dim xWS_Q As Worksheet Set xWS_Q = Workbooks("Quellmappe.xlsm").Worksheets("Quelltab") Dim xWS_Z As Worksheet Set xWS_Z = ActiveWorkbook.Sheets("Zieltab") ' und somit fürs kopieren: xWS_Q.Range(xWS_Q.Cells(1, 1), xWS_Q.Cells(41, 7)).Copy xWS_Z.Cells(1, 1)
Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ArCADe-Spieler Mitglied Metallbautechniker
Beiträge: 382 Registriert: 05.12.2012 Win 10 64bit Office 2019
|
erstellt am: 16. Dez. 2024 12:56 <-- editieren / zitieren --> Unities abgeben:
Hallo Ihr zwei, vielen Dank für die umfangreichen Erläuterungen (daher 10 Unities auch an Dich, Klaus). Da geht es ganz offensichtlich um ganz grundlegende Grundlagen von Excel VBA ... die ich bislang noch nicht erlernt habe. Ich habe mir zwar vor Längerem Michael Koflers "Excel programmieren 2016" gekauft und auch angefangen, es zu lesen, aber leider wird dort kaum auf solche grundlegenden Sachen eingegangen ... sie werden wohl als bereits bekannt vorausgesetzt, wenn sich jemand an "die höheren Weihen" heranwagt. Ich hatte mich hier zwar schon zweimal für einen Volkshochschulkurs zu den Grundlagen von Excel VBA eingeschrieben, die sind aber beide mangels Teilnehmern nicht durchgeführt worden. Falls Ihr also Tips für gute, wirklich Grundlagen-Literatur zum Thema habt: nur her damit ... es frustriert mich selbst, wenn ich an solchen Basics scheitere. Wie bereits geschrieben, komme ich aktuell leider nicht dazu, irgendetwas auszuprobieren - auch diese Antwort klimpere ich nur schnell in der Mittagspause in die Tastatur. Euch schöne Feiertage Gernot [Edit1] was mir gerade eben erst so richtig bewusst wird: anscheinend funktioniert der Bezug auf das vorher angesteuerte Tabellenblatt (Quell-Sheet in der Quell-Mappe) bei der Range("S1Z1:S2Z2")-Schreibweise direkt, ohne die - mir sehr sperrig erscheinende - Herstellung einer Zuweisung per With-Konstrukt bei der Variante Range(.Cells(Z1,S1), .Cells(Z2,S2)) ... hm, das spricht für mich wieder mehr für die Verwendung der ersten Schreibweise ... auch, weil ich tatsächlich doch nur die jeweiligen Zeilen "errechnen" muss und die Spalten fix zugeordnet sind ... sollte sich ja mit Range("S1" & ZeilenRechenwert1 & ":S2" & ZeilenRechenwert2) doch deutlich einfacher realisieren lassen, als befürchtet [Diese Nachricht wurde von ArCADe-Spieler am 16. Dez. 2024 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 400 Registriert: 11.08.2007
|
erstellt am: 16. Dez. 2024 14:55 <-- editieren / zitieren --> Unities abgeben: Nur für ArCADe-Spieler
Hi Gernot, Zitat: Original erstellt von ArCADe-Spieler:[Edit1] was mir gerade eben erst so richtig bewusst wird: anscheinend funktioniert der Bezug auf das vorher angesteuerte Tabellenblatt (Quell-Sheet in der Quell-Mappe) bei der Range("S1Z1:S2Z2")-Schreibweise direkt, ohne die - mir sehr sperrig erscheinende - Herstellung einer Zuweisung per With-Konstrukt bei der Variante Range(.Cells(Z1,S1), .Cells(Z2,S2)) ... hm, das spricht für mich wieder mehr für die Verwendung der ersten Schreibweise ... auch, weil ich tatsächlich doch nur die jeweiligen Zeilen "errechnen" muss und die Spalten fix zugeordnet sind ... sollte sich ja mit Range("S1" & ZeilenRechenwert1 & ":S2" & ZeilenRechenwert2) doch deutlich einfacher realisieren lassen, als befürchtet
Das siehst du nicht ganz richtig: diese Schreibweise ist für dich als weniger versierter Anwender sicher einfacher 1. zu schreiben und 2. auch nachzuvollziehen/zu verstehen und sie ist auch keineswegs falsch, hat aber auch so ihre Nachteile, wenn du mit variablen Zeilen und insbesondere variablen Spalten agierst. Dabei musst du den Code nämlich zuvor dahingehend ergänzen, dass du zuerst die numerisch ermittelte Spaltennummer in den betreffenden Spaltenbuchstaben übersetzen musst - das vergisst du nämlich, wenn du einfach Range(Spaltenbuchstabe1Zeilennumer1:Spaltenbuchstabe2Zeilennumer2) siehst. Diese Übersetzung ist bei der Schreibweise Cells(Zeilennummer, Spaltennummer) ganz und gar nicht erfoderlich, weil alle Angaben - sowohl für Spalte als auch Zeile - numerisch sind. Anschließend muss Excel intern wiederum die Schreibweise Range(Spaltenbuchstabe1Zeilennummer1:Spaltenbuchstabe2Zeilennummer2) intern in die Schreibweise Range(Cells(Zeilennumer1, Spaltennummer1), Cells(Zeilennummer2, Spaltennumer2)) übersetzen. Sicher macht diese Umrechnung bei kurzen Codes kaum einen zeitlichen Unterschied, bei größeren Projekten dagegen, kann sich das durchaus zeitlich negativ auswirken. Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ArCADe-Spieler Mitglied Metallbautechniker
Beiträge: 382 Registriert: 05.12.2012 Win 10 64bit Office 2019
|
erstellt am: 18. Dez. 2024 12:22 <-- editieren / zitieren --> Unities abgeben:
Hallo Karin, ach ja, stimmt, da war ja was ... der Grund, diesen bzw. den Vorgänger-Thread überhaupt zu starten, waren ja genau die bis zum Stillstand bzw. sogar Absturz von Excel immer länger gewordenen Abarbeitungszeiten der Makros genau wegen der drei verschiedenen Schreibweisen für Zellzugriffe bzw. Range-Beschreibungen Also muss ich mich wohl doch mit der With-Methode "anfreunden" ... nur dass mir die irgendwie unhandlich vorkommt und daher nicht wirklich "gefällt" Irgend welche Literatur-Tips zum Thema VBA-Grundlagen ... also wirklich die Basics? Schöne Feiertage und guten Rutsch, "sehe" Euch im Januar wieder Gernot Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2823 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 18. Dez. 2024 12:58 <-- editieren / zitieren --> Unities abgeben: Nur für ArCADe-Spieler
Zitat: Original erstellt von ArCADe-Spieler: Da geht es ganz offensichtlich um ganz grundlegende Grundlagen von Excel VBA ... die ich bislang noch nicht erlernt habe. ...Falls Ihr also Tips für gute, wirklich Grundlagen-Literatur zum Thema habt: nur her damit ... es frustriert mich selbst, wenn ich an solchen Basics scheitere.
Hallo Gernot, Nicht verzweifeln, wir haben alle mal angefangen, auch wenn es bei mir schon über 40 Jahre her war (Basic auf Commodore 32). Damals gabe es noch kein Internet oder Foren (die kamen erst so ab ca. 1990, naja eigentlich 1980, Usenet, aber da hatten nur ausgewählte Personen Zugang). Damals gab es noch sehr ausführliche Bücher mitgeliefert, die das Einarbeiten vereinfacht haben. Zugegeben, heute ist das deutlich umfangreicher. Da muß man sich erst mit den ganzen Objektmodellen (egal ob bei Excel oder Autocad) beschäftigen aber man hat auch die Möglichkeit über das Internet schnell Hilfe zu bekommen. Aber ich empfehle meinen Mitarbeitern immer sich einfach mal die Ersten Schritte durchzulesen, die gibt es bei Microsoft oder auch bei Autocad (leider nur in Englisch). Literatur zum Kaufen gibt es maßenweise, vom Kofler stehen auch zwei Bücher im Regal (Access Datenbankprogrammierung). Aber ehrlich, ganz durchgearbeitet habe ich die nie. Einzelne Kapitel mal zum nachlesen wie es sein könnte - ja, der Rest dann try-and-error oder F1 (Hilfe). Also nicht verzweifeln. Und zur Not hast Du ja das Forum hier Schöne Feiertage Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 400 Registriert: 11.08.2007
|
erstellt am: 18. Dez. 2024 13:04 <-- editieren / zitieren --> Unities abgeben: Nur für ArCADe-Spieler
Hi Gernot, mit Literatur kann ich dir leider nicht dienen - mein Wissen stammt in erster Linie aus den verschiedenen Excel-Foren, indem ich dort selbst Fragen gestellt, aber auch Beispiele anderer Fragesteller versucht habe zu verstehen und nachzubauen. Was die With-Anweisungen betrifft, so ist sie an und für sich gar nicht so schwer, man muss nur das Prinzip verstehen, wie die Objekte in Excel aufgebaut sind - und zwar hierarchisch in verschiedenen Ebenen, wobei zuerst die oberste Hierarchie/Ebene logischerweise als 1. angesprochen wird und danach die jeweils nächste tiefere, wobei ALLE untergeordneten Ebenen durch das Voransetzen eines Punktes (.) an die jerweils übergeordnete Ebene gebunden werden. Ans Ende jeder Ebene einer With-Anweisung gehört dann noch die Zeile End With, damit Excel weiß, das sich alles danach nicht mehr auf den Teil nach der Zeile With... bezieht. Wenn man dazu noch den Cdeo strukturiert schreibt, kann man auch optisch besser nachvollziehen wo eine Ebene der with-Anweisung beginnt und wo sie endet. Hier mal ein simples prinzipielles Beispiel mit 2 Ebenen: Code: 'Anfang der With-Anweisung - 1. Ebene With Workbooks("Arbeitsmappe.xlsm") '<== alles bezogen auf die genannte Arbeitamappe ' Anfang der With-Anweisung 2. Eben With .Worksheets("Tabelle1") '<== alles bezogen auf Tabelle1 in ganz oben genannten Arbeitsmappe .Range("A2") = Date '<== in A2 im o.g. Tabellenblatt der ganz oben genannten Arbeitsmappe das aktuelle Datum eintragen ' Ende der With Anweisung 2. Ebene End With ' Ende der With-Anweisung 1. Ebene End With
Vielleicht hilft dir das ja schon ein wenig beim Verstehen. Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|