Autor
|
Thema: Code als Makro oder Schaltfläche (1583 mal gelesen)
|
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 29. Nov. 2007 18:07 <-- editieren / zitieren --> Unities abgeben:
Wenn ich folgenden Code, der auf einer Befehlsschaltfläche liegt ausführe, bekomme ich beim Range( "A2") die Meldung: Laufzeitfehler '1004' -- Die Select-Methode des Range-Objektes konnte nicht ausgeführt werden Code: Private Sub ReadFile_Click() Sheets("InputData").Range("A2:T6500").ClearContents Workbooks.OpenText Filename:= _ "C:\grfor.txt", Origin:=932, StartRow:=1, DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=True, Comma:=False, Space:=False, Other:=False, TrailingMinusNumbers:=True Range("A2:T1884").Copy Windows("Merging.xls").Activate Sheets("InputData").Select Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False End Sub
Wenn ich denselben Code als Makro laufen lasse, funktioniert es . Wo liegt mein Fehler ? Axel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Grebe Mitglied
Beiträge: 536 Registriert: 16.12.2002
|
erstellt am: 29. Nov. 2007 18:27 <-- editieren / zitieren --> Unities abgeben: Nur für Axel.Strasser
Ich vermute mal, dass dann dein Arbeitsblatt nicht aktiv ist. Setz doch mal noch (wie beim Löschen auch) Sheets("InputData"). davor. Oder ganz am Anfang einmal Sheets("InputData").Select Mathias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 29. Nov. 2007 19:54 <-- editieren / zitieren --> Unities abgeben: Nur für Axel.Strasser
Hi Axel, versuche es mit folgendem Code Private Sub ReadFile_Click() With ThisWorkbook.Sheets("InputData") .Range("A2:T6500").ClearContents Workbooks.OpenText Filename:= _ "C:\grfor.txt", Origin:=932, StartRow:=1, DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=True, Comma:=False, Space:=False, Other:=False, TrailingMinusNumbers:=True Range("A2:T1884").Copy .Range("A2").PasteSpecial Paste:=xlPasteValues End With End Sub
------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 30. Nov. 2007 12:07 <-- editieren / zitieren --> Unities abgeben:
|
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 30. Nov. 2007 14:54 <-- editieren / zitieren --> Unities abgeben: Nur für Axel.Strasser
Auch Hallo, Im Klassenmodul einer Tabelle beziehen sich Range-Angaben auf Me (das ist die Tabelle die den Code enthält), nicht auf ActiveSheet. Und, nur in ActiveSheet kann/darf man einen Range selektieren. Wenn Du nun sowas im Klassenmodul der Tabelle1 tust: Code: Option ExplicitSub x() Worksheets(2).Activate Range("A1").Select End Sub
ergibt das einen Laufzeitfehler 1004, da:a) ActiveSheet nach dem Activate eben die Tabelle2 ist, nicht mehr die Tabelle1 und b) Range("A1") sich auf Me bezieht, d.h. in Tabelle1 liegt, keinesfalls in Tabelle2 !!! Verzichte generell auf Selects und/oder Activates, dann hast Du dieses Problem einfach nicht. CU, Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 30. Nov. 2007 15:33 <-- editieren / zitieren --> Unities abgeben: Nur für Axel.Strasser
Hi Axel, du hast nicht geschrieben, in welcher Arbeitsmappe sich der CommandButton befindet, deshalb habe ich angenommen, dass die Werte in die Arbeitsmappe mit dem Button geschrieben werden. Wenn dies jedoch eine andere Arbeitsmappe ist, dann musst du nur anstelle ThisWorkbook den Namen der Arbeitsmappe schreiben, in die kopiert werden soll - also With Workbooks("Die betreffende Arbeitsmappe.xls").Worksheets("InputData") Kopiert wird aus der geöffneten Text-Datei nach Tabelle "InputData" in der Arbeitsmappe "Die betreffende Arbeitsmappe.xls" die nicht den CommandButton enthält. Wie Bernd schon geschrieben hat - in VBA kann zu 99% auf Select und Ativate verzichtet werden. ------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 30. Nov. 2007 16:51 <-- editieren / zitieren --> Unities abgeben:
Danke für Eure Antworten, wieder was dazugelernt. Wenn ich jetzt aber meinen Code anschaue:
Code: Workbooks.OpenText Filename:=FilePath + Filename, Origin:=932, StartRow:=1, DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=True, Comma:=False, Space:=False, Other:=False, TrailingMinusNumbers:=True ActiveSheet.Range("A2:T1884").Copy Windows("Merging.xls").Activate Sheets("InputData").Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Sheets("MenuData").PivotTables("Menu_1").PivotCache.Refresh Workbooks(Filename).Close SaveChanges:=False
dann komme ich da aber nicht um das Activate rum oder wie müsste das dann aussehen oder gäbe es noch eine bessere Strategie die Textdatei in die bestehende Mappe einzulesen? Die Befehlsschaltfläche liegt in Merging.xls Noch eine Zusatzfrage: Durch das Kopieren sind ja Daten in der Zwischenablage und beim Schliessen der Datei wird gefragt, ob man diese Daten behalten will. Wie kann ich diese Abfrage mit "Nein" ausschalten ? Axel [Diese Nachricht wurde von Axel.Strasser am 30. Nov. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 30. Nov. 2007 18:48 <-- editieren / zitieren --> Unities abgeben: Nur für Axel.Strasser
Hi Axel, Frage: hast du meinen Code getestet? Wenn ich deinen Code richtig interpretiere: es wird in der Arbeitsmappe mit dem CommandButton die Tabelle "InputData" im Bereich A2:T6500 gelöscht, dann eine Textdatei geöffnet und nach Excel transferiert, der Bereich A2:T1884 dieser transferierten Datei kopiert und in die Tabelle "InputData" der Arbeitsmappe mit dem CommandButton kopiert und in A2 die Werte eingefügt - und genau das macht mein Code und alles ohne Select oder Activate. Zu deiner anderen Frage: Application.CutCopyMode = False ------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 30. Nov. 2007 22:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Karin, habe Deinen Code noch getestet, er war so nicht lauffähig, musste ihn noch ändern (ActiveSheet): Code: With Workbooks(XlsFileName).Sheets("InputData") .Range("A2:T65000").ClearContents Workbooks.OpenText Filename:=TxtFilePath + TxtFilename, _ Origin:=932, StartRow:=1, DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=True, Comma:=False, Space:=False, Other:=False, TrailingMinusNumbers:=True ActiveSheet.Range("A2:T1884").Copy .Range("A2").PasteSpecial Paste:=xlPasteValues End With Workbooks(XlsFileName).Sheets("MenuData").PivotTables("Menu_1").PivotCache.Refresh Application.CutCopyMode = False Workbooks(TxtFilename).Close 'SaveChanges:=False
Der Hinweis mit dem CutCopyMode hat mich noch weitergebracht, aber erst nachdem ich geschnallt habe, das der Befehl den Zwischenspeicher leer. Axel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Beverly Mitglied Dipl.-Geologe (Rentner)
Beiträge: 394 Registriert: 11.08.2007
|
erstellt am: 01. Dez. 2007 07:28 <-- editieren / zitieren --> Unities abgeben: Nur für Axel.Strasser
Hi Axel, da muss ich dir widersprechen - der Code läuft auch ohne "Activesheet" richtig, denn in dem Augenblick, wenn eine Datei geöffnet wird ist sie automatisch aktiv. Du musst nur beachten, dass in dieser Code-Zeile kein Punkt vor Range stehen darf. ------------------ Bis später, Karin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Axel.Strasser Ehrenmitglied V.I.P. h.c. Selbstständig im Bereich PLM/CAx
Beiträge: 4107 Registriert: 12.03.2001 Früher war vieles gut, und das wäre es heute immer noch, wenn man die Finger davon gelassen hätte!
|
erstellt am: 01. Dez. 2007 11:22 <-- editieren / zitieren --> Unities abgeben:
Karin, es tut mir leid aber es braucht bei mir das ActiveSheet, ohne das geht es nicht und wenn ich den Beitrag von Bernd oben lese, ist es klar: Zitat: Im Klassenmodul einer Tabelle beziehen sich Range-Angaben auf Me (das ist die Tabelle die den Code enthält), nicht auf ActiveSheet.
Axel Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bst Mitglied
Beiträge: 192 Registriert: 31.08.2004 .
|
erstellt am: 03. Dez. 2007 09:32 <-- editieren / zitieren --> Unities abgeben: Nur für Axel.Strasser
Morgen, Zitat: es tut mir leid aber es braucht bei mir das ActiveSheet ...
Das sehe ich auch so. Ohne dem ActiveSheet würde sich der Range auf Me beziehen, da der Code ja im Klassenmodul einer Tabelle steht. Übrigens, wenn Du nur die Werte 'umkopieren' möchtest könntest Du anstatt Copy und Paste und Application.CutCopyMode diese auch einfach zuweisen. Falls der Button in der Zieltabelle liegen sollte, z.B. so, wobei Du Me. auch weglassen könntest. Code: Me.Range("A2:T1884").Value = ActiveSheet.Range("A2:T1884").Value
Oder mit einem vorhergehenden With eben via: Code: .Range("A2:T1884").Value = ActiveSheet.Range("A2:T1884").Value
CU, Bernd Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|