Autor
|
Thema: Aufgezeichnetes Makro wiederholen (3573 mal gelesen)
|
Bonkers Mitglied Techn. Angestellter
Beiträge: 553 Registriert: 26.01.2005 Intel(R) Xeon (R) E5-1620 v3 3.50GHz 16 GB RAM WIN 7 Prof. 64 Bit - SP1 NVIDIA Quadro K2200 Inventor 2015 SP2.2 Vault Workgroup 2015
|
erstellt am: 13. Jan. 2017 07:55 <-- editieren / zitieren --> Unities abgeben:
Hallo! Ich möchte mir Formulare zu mehreren Personen erstellen lassen. Meine Datei hat folgenden Aufbau: - Im Blatt Daten stehen die Daten alles Personen - Im nächsten Blatt habe ich das Formular erstellt. Die Ausweisnummer ist meine Ausgangszelle für die weiteren Werte im Formular. Mein aufgezeichnetes Makro macht nun folgendes: - Es kopiert das erste Formular (ans Ende stellen) - Kopiert nun aus dem Arbeitsblatt Daten den Wert der nächsten Zelle (nächste Auseisnummer, hier A3) in das neue Formular, wichtig hierbei dass soll mit Inhalt einfügen (nur Formeln) gemacht werden - Als nächtes soll die Benennung des Arbeitsblattes auf den Namen der Person geändert werden - Also in die Zeile mit dem Namen im Formular springen und diesen bei der Balattbenennung einfügen Dieses soll nun so lange wiederholt werden, bis in Daten-Arbeitsblatt in der Spalte A kein Eintrag mehr gefunden wird. Vielleicht kann mir von euch jemand helfen?!!? Habe dazu eine vereinfachte Datei erstellt.
Vielen Dank an euch!
Mario ------------------ Fg Mario 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: 2624 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 13. Jan. 2017 13:17 <-- editieren / zitieren --> Unities abgeben: Nur für Bonkers
Hallo Mario, Habe Dein Modul etwas verändert, Dein Code ist auskommentiert noch vorhanden Code:
Sub Formulare_erstellen() ' ' Formulare_erstellen Makro ' Erstellt für alle Personen ein Formular ' ' ' Sheets("Person 1").Select ' Sheets("Person 1").Copy After:=Sheets(2) ' Sheets("Daten").Select ' Selection.Copy ' Sheets("Person 1 (2)").Select ' Range("C7").Select ' Ausweis Nummer ' Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False ' Range("A4").Select ' Application.CutCopyMode = False ' Selection.Copy ' Sheets("Person 1 (2)").Select ' Sheets("Person 1 (2)").Name = "Person 2" ' Application.CutCopyMode = False ' ' ab hier der neue Code: ' Dim wBK As Workbook Dim wbD As Worksheet Dim wbS As Worksheet Dim wbN As Worksheet Dim tS As Integer, tZ As Integer ' Laufvariable Dim sBN As String ' Blattname ' tS = 1 ' Spalte A tZ = 3 ' Start der zusätzlichen Daten, Reihe 3 Set wBK = ThisWorkbook Set wbD = wBK.Sheets("Daten") Set wbS = wBK.Sheets("Person 1") ' Durchlaufen der zu bearbeitenden Zeilen Do While Not IsEmpty(wbD.Cells(tZ, tS)) ' Neues Blatt erzeugen und Inhalt kopieren wBK.Sheets("Person 1").Copy After:=Worksheets(Worksheets.Count) ' hinter letztes Blatt anfügen Set wbN = ActiveSheet ' neues Blatt zuordnen ' Zuordnen der Ausweisnummer aus Datenblatt ' wbN.Range("C7") = wbD.Cells(tZ, 1) ' Wert von Daten!A(aktuelle Zeile) als Wert übernehmen wbN.Range("C7") = "=Daten!A" & Trim(Str(tZ)) ' Wert von Daten!A(aktuelle Zeile) als Formel übernehmen ' Name des Blattes ändern sBN = wbN.Cells(4, 1).Value ' Name aus A4 übernehmen wbN.Name = sBN ' Name aus A4 übernehmen ' => hier müßte sichergestellt sein dass es keine Personen mit gleichem Namen gibt tZ = tZ + 1 ' nächster Ausweis LoopEnd Sub
Grüße Klaus
[Diese Nachricht wurde von KlaK am 13. Jan. 2017 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: 2624 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 14. Jan. 2017 12:38 <-- editieren / zitieren --> Unities abgeben: Nur für Bonkers
Vielleicht noch ein genereller Hinweis: Das Aufzeichnen lassen in Makros ist ein gutes Hilfsmittel für so kleine Makros, danach kommt aber die eigentliche "Arbeit": Nach Möglichkeit feste Blattbezüge durch variable Blattbezüge ersetzen (Worksheet) Die meisten "Select" kann man durch direkte Zuweisungen ersetzen damit läuft das Programm auch ruhiger (weniger sichtbare Blattwechsel) und schneller ab (aus Deinen 12 Anweisungen wurden 4). Grüße Klaus PS: Muß mal nachsuchen, in irgendeinem Thread gab es mal eine Zusammenstellung welche Anweisungen sinnvoll sind und welche man ersetzen sollte. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bonkers Mitglied Techn. Angestellter
Beiträge: 553 Registriert: 26.01.2005 Intel(R) Xeon (R) E5-1620 v3 3.50GHz 16 GB RAM WIN 7 Prof. 64 Bit - SP1 NVIDIA Quadro K2200 Inventor 2015 SP2.2 Vault Workgroup 2015
|
erstellt am: 16. Jan. 2017 06:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, puhh, das sieht ja ganz anders aus als ich es mir gedacht habe. Meine Vorstellung war in etwa, so und nun wieder hole diese Schritte, bis zur Zeile in der keine Werte mehr vorhanden sind. Ich muss das dann noch ein wenig auf meine Tabelle ummünzen, denke aber das werde ich dann hin bekommen. Bin leider nur mal kurz dazu gekommen und noch nicht fertig geworden! Ja, du hast vollkommen recht optimoeren ist das A und O! Vielen Dank an dich, das du dich der Sache angenommen hast und mit behilflich bist! Bis Dann!!!! Mario ------------------ Fg Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 16. Jan. 2017 07:17 <-- editieren / zitieren --> Unities abgeben: Nur für Bonkers
|
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 16. Jan. 2017 10:18 <-- editieren / zitieren --> Unities abgeben: Nur für Bonkers
Hallo Mario, Zitat: Original erstellt von Bonkers: ...puhh, das sieht ja ganz anders aus als ich es mir gedacht habe. Meine Vorstellung war in etwa, so und nun wieder hole diese Schritte, bis zur Zeile in der keine Werte mehr vorhanden sind.
Das wird ja in der do .. loop - Schleife gemacht, nur dass Dein starrer Ausdruck Sheets("Person 1 (2)") durch eine Variable ersetzt wurde und man es Excel überlässt die letzte Tabelle zu finden. Alternativ hätte man auch zunächst die letzte Zeile ermitteln können und dann eine Lösung über eine for-next Schleife: For tZ = 3 to (letzte Zeile) ... next tZ Man muß nur die letzte gefüllte Zelle finden. Ich mache das ganz gerne über die IsEmpty-Funktion, theoretisch kann man da auch Excel befragen lassen ( set letzteZeile = ActiveSheet.Range("A2").End(xlDown).Row ) aber wenn da leere Zellen dazwischen sind wird das ignoriert. Zitat: Original erstellt von Bonkers: Ich muss das dann noch ein wenig auf meine Tabelle ummünzen, denke aber das werde ich dann hin bekommen. Bin leider nur mal kurz dazu gekommen und noch nicht fertig geworden!
Kleiner Tip dazu: Wenn Du nicht gleich mit einer "echten" Tabelle (Person 1) arbeitest sondern mit einer "Vorlagen"-Tabelle und die Funktion ab Zeile 2 laufen lässt wäre das universeller. Genauso mache ich es gerne den Bereich des Suchverweises auf die ganze Spalte zu beziehen (=SVERWEIS($C$7;Daten!$A:$D;3;FALSCH) ). Zeilenergänzungen in der Datentabelle sind dann bereits abgedeckt. @Runkelruebe: Danke, war zwar nicht das was ich meinte aber auch ein guter Hinweis Grüße Klaus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 16. Jan. 2017 10:34 <-- editieren / zitieren --> Unities abgeben: Nur für Bonkers
>> Man muß nur die letzte gefüllte Zelle finden. Ich mache das ganz gerne über die IsEmpty-Funktion, theoretisch kann man da auch Excel befragen lassen ( set letzteZeile = ActiveSheet.Range("A2").End(xlDown).Row ) aber wenn da leere Zellen dazwischen sind wird das ignoriert.Auch dazu hätte ich die ein oder andere Zeile beizutragen >> [VBA] Letzte Spalte / Letzte Zeile << ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... 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: 2624 Registriert: 02.05.2006 Office 2010; Office365 Visual Basic
|
erstellt am: 16. Jan. 2017 11:35 <-- editieren / zitieren --> Unities abgeben: Nur für Bonkers
Aber auch bei: Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row besteht das Problem, wenn A8 leer ist und A9 wieder einen Wert hat wird als letzte Zeile 9 ausgegeben. Somit müßte noch im Code überprüft werden ob in der aktuellen Zeile wirklich ein Wert eingetragen ist und wenn nicht gleich auf die nächste Zeile gesprungen wird. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 16. Jan. 2017 13:44 <-- editieren / zitieren --> Unities abgeben: Nur für Bonkers
>> Aber auch bei: Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row besteht das Problem, wenn A8 leer ist und A9 wieder einen Wert hat wird als letzte Zeile 9 ausgegeben.Ja, natürlich. Es wird die letzte benutzte Zeile des sheets gesucht und auch gefunden. Das sehe ich also nicht als Problem an, sondern als das gewünschte Ergebnis, wenn man von letzter Zeile spricht. Du würdest ebenfalls die 9 bekommen, wenn Du xlUp statt down nimmst und von unten los läufst. Ich habe mir den Code/die Anfrage des TO nicht näher angeschaut, sondern schreibe ganz allgemein und denke, mit den links kann sich der geneigte Progger das dann selbst erarbeiten Speziell bei online-excel kann man viiiel lesen und lernen ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bonkers Mitglied Techn. Angestellter
Beiträge: 553 Registriert: 26.01.2005 Intel(R) Xeon (R) E5-1620 v3 3.50GHz 16 GB RAM WIN 7 Prof. 64 Bit - SP1 NVIDIA Quadro K2200 Inventor 2015 SP2.2 Vault Workgroup 2015
|
erstellt am: 17. Jan. 2017 06:29 <-- editieren / zitieren --> Unities abgeben:
Hallo Klaus, ich habs gestern noch umgeschrieben auf meine Original-Datei. Nach ein paar Anfangsschwierigkeiten hab ich es dann geschafft und es funktioniert wunderbar. Vielen Dank noch mal an dich!!!! @runkelrübe: Danke auch für den Link zu Excel-Online werde mir das ansehen! Kennt ihr beiden auch noch eine empfehlenswertes Einsteiger-Buch zur VBA Programmierung? Ich weiß da gibt es sehr viele dafon zu finden. Daas ganze heir war mein erster Einstieg in diese Thematik, also sind meine Kenntnisse darüber dementsprechend gering. Oder wäre für die Grundkenntisse ein Kurs-Besuch eher zu empfelen und dann über ein Buch das weiter aufbauen? Wie habt ihr das damals begonnen?!?!?! Danke euch!!! Mario
------------------ Fg Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Moderator Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 MS-Office 365 ProPlus x86 WIN7(x64)
|
erstellt am: 17. Jan. 2017 07:35 <-- editieren / zitieren --> Unities abgeben: Nur für Bonkers
Moin Mario, >> Wie habt ihr das damals begonnen?!?!?! Meine Anfänge kannste hier im Forum nachlesen Ein Buch hab ich mir wohl auch mal gekauft, bin aber nie über die ersten 50 Seiten hinweg gekommen Learning by doing. Ich brauche immer konkrete Ziele, die ich dann versuche, umzusetzen und im Laufe der Zeit lernt man dann immer neue Dinge kennen. Natürlich ist es grausam, sich die ersten eigenen Schnippsel nach Jahren wieder anzuschauen Aha-Erlebnisse waren bei mir das Lokalfenster und auch das Direktfenster (Debug.Print) in der VBA-Umgebung. Das erklärt allerdings auch, dass ich es nie wirklich weit bringen werde, denn die Grundlagen der Objekt-/Klassenprogrammierung fehlen. Naja, für den Hausgebrauch langt's Ein user hier bei cad.de hat eine sehr passende Signatur:
Zitat: Hast Du kein Problem? Dann such Dir eins. Und löse es.
Soll sagen: Foren mitlesen und immer versuchen, mitzumachen, und sei es nur im stillen Kämmerlein. Selbst erarbeitet bleibt einfach besser haften. Es gibt zahlreiche Tutorials im www zum Thema VBA für Excel, google kennt sie (fast) alle Wer zusätzlich des Englischen mächtig ist, hat nahezu unbegrenzte Möglichkeiten. Die Grundlagen VBA sind gleich, ob es für Excel, Word oder AutoCAD ist, es ist das Objektmodell, das sich dann unterscheidet. Im Bereich acad habe ich damals z.B. das Tutorial von Franz Ertl für hilfreich empfunden, der hat sowas auch für Excel. online-excel kennst Du ja jetzt schon und dann einfach üben, üben, üben. Aber jeder lernt anders. Man munkelt, die Jugend heutzutage lernt nicht mehr mit Texten, sondern läßt sich gern von Videos berieseln. Für manche ist ein Kurs hilfreich, der kann Wege verkürzen, aber Empfehlungen habe ich diesbezüglich keine. Viel Spaß und viel Erfolg! ------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bonkers Mitglied Techn. Angestellter
Beiträge: 553 Registriert: 26.01.2005 Intel(R) Xeon (R) E5-1620 v3 3.50GHz 16 GB RAM WIN 7 Prof. 64 Bit - SP1 NVIDIA Quadro K2200 Inventor 2015 SP2.2 Vault Workgroup 2015
|
erstellt am: 17. Jan. 2017 08:13 <-- editieren / zitieren --> Unities abgeben:
Hallo runkelruebe, vielen Dank für deine Ausführung! Werde deine Vorschläge sicherlich beherzigen. Zwar wird bei mir der Schwerpunkt eher bei Inventor leigen, aber wie du schon gesrieben hast sind die Grundlagen gleich. Excel haben wir natürlich auch im Einsatz, kann aber sein dass dies mit der Stücklistenautomation auch zunehmen wird! Bis dann, Danke! ------------------ Fg Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 17. Jan. 2017 08:27 <-- editieren / zitieren --> Unities abgeben: Nur für Bonkers
[VOR deinem letzten Posting geschriebene Antwort] Unabhängig von persönlichen Geschichten, welche im Normalfall keine von Programmierern sind, sondern einfach nur Benutzer die es schaffen zu Lösungszielen der eigener Aufgaben zu gelangen. Gehe in den nächsten Supermarkt, Kaufhaus, Buchhandlung oder online-Anbieter, kaufe ein VBA-Basic EXCEL Buch passend zu deiner Version, arbeite es durch. Dabei ist es völlig schnuppe was das Produkt der Aufgaben darstellt, es geht um die Basic VBA-Funktionen und das Excel-Objektmodell kennen zu lernen. UND die von RR angesprochene Programmierumgebung, die IDE, welche einem das Leben(mit ExcelVBA) so viel leichter macht.
Du mußt lesen und verstehen lernen, wenn der Punkt irgendwann gekommen ist, dann die das Netz der goldene Topf. Dir sich die Fachvokabeln Excel und VBA bekannt, die Suche und die Filterung der Treffer gelingt richtig gut, die einzelnen Codes können "direk" gelesen und verstanden werden. [Nach deinem letzten Posting geschriebene Antwort] Du möchtest auch für Inventor Programmieren und kannst keine der Programmiersprachen für die Programme? Dann ist das ein guter Zeitpunkt sich zu entscheiden: VBA und VB.NET, ich würde dies enscheiden nach "Was für Ziele hat man", jedoch kannst du das vermutlich selbst nicht einschätzen. http://inventorfaq.blogspot.de/2013/02/inventor-selbst-programmieren.html http://inventor.cad.de/i_vba/tutorials.html
/--/ Abbruch, keine Zeit mehr, sorry EDIT:Wieder zurück
Fange mit VBA und Excel an, die beiden passen gut zusammen und sind allerbestens dokumentiert (Duch MS, Buch und Internet), selbst auf deutsch gibt es mehr als man jemals lesen kann in einem Leben. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD [Diese Nachricht wurde von cadffm am 17. Jan. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bonkers Mitglied Techn. Angestellter
Beiträge: 553 Registriert: 26.01.2005 Intel(R) Xeon (R) E5-1620 v3 3.50GHz 16 GB RAM WIN 7 Prof. 64 Bit - SP1 NVIDIA Quadro K2200 Inventor 2015 SP2.2 Vault Workgroup 2015
|
erstellt am: 17. Jan. 2017 09:27 <-- editieren / zitieren --> Unities abgeben:
Hallo Cadfem, ja die Frage stellt sich mir tatsächlich was hier besser ist. VBA oder VB.net. Wie wir die Umsetzung machen werden ist noch nicht entschieden, ist aber ein anderes Thema. Sowit ich es jetzt verstanden habe ist ilogic im Inventor wie VBA und Programmierung über API mit VB.net. Aber Excel kann man immer brauchen und ein wenig VB... wird mir nicht schaden! Danke dir! ------------------ Fg Mario Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 21533 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 17. Jan. 2017 09:49 <-- editieren / zitieren --> Unities abgeben: Nur für Bonkers
Inventor hat wie Excel auch eine VBA-Schnittstelle, man kann daher auch mit VBA in Inventor eingreifen. Jede Schnittstelle hat ihre eigenen Grenzen und Möglichkeiten, tendenziell ist in .Net mehr möglich wie in vbA, aber oftmals wird dieses "mehr" überhaupt nicht benötigt - zumindest nicht in Excel. Man könnte unzählige Tips geben, aber eigentlich reicht einer aus: FANG AN! Irgendwann in den nächsten Jahren hast du soweit den Durchblick selbst entscheiden zu können ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD [Diese Nachricht wurde von cadffm am 17. Jan. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|