Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1632to1636
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

vba Code kompatibel 2010

vba Code kompatibel 2010
05.07.2018 13:54:20
Nic365
Hallo, ich habe folgenden Code mit Excel 365 verfasst. Bei mir läuft alles einwandfrei. Ich habe ihn ebenfalls mit Excel 2007 ausgetestet. Er läuft dort ebenfalls ohne Probleme. Jetzt sagt mein Kollege, dass er mit Excel 2010 zwar die dort angegebene Datei ganz normal öffnet, allerdings stoppt er bei der folgenden Zeile und zeigt den Laufzeitfehler 9 an (Index außerhalb des gültigen Bereiches) :
zeilenende = Workbooks("Art").Sheets("Art").Cells(Rows.Count, 2).End(xlUp).Row
Da ja die Datei bei mir ohne Probleme läuft auf zwei unterschiedlichen Versionen, kann es ja nichts mit der Bezeichnung zu tun haben (die Bezeichnung des Tabellenblattes ist Art und stimmt dabei mit dem Code überein). Gibt es bei diesem Code irgendetwas was vielleicht mit Excel 2010 nicht kompatibel ist ? Oder irgendwelche andere Programmeinstellungen oder sonstiges, welche zu beachten sind und weswegen es nicht läuft?
Vielen Dank und viele Grüße Nic365
Sub Art()
Dim zeilenende As Integer
'öffnen Datei im entsprechenden Laufwerk
Workbooks.Open "E:\Art.xlsx"
'Festlegen von letzter Zeile in Spalte B
zeilenende = Workbooks("Art").Sheets("Art").Cells(Rows.Count, 2).End(xlUp).Row
'löschen von bereits bestehendem Imput
Workbooks("Übersicht").Sheets("Art").Range("C5:C300").ClearContents
Workbooks("Übersicht").Sheets("Art").Range("E5:E300").ClearContents
'Import Inhalt von Art-Datei und Übertrag in Übersicht
Workbooks("Art").Sheets("Art").Range("B3:B" & zeilenende).Copy
Workbooks("Übersicht").Sheets("Art").Range("C5").PasteSpecial
'Import Inhalt von Art-Datei und Übertrag in Übersicht
Workbooks("Art").Sheets("Art").Range("C3:C" & zeilenende).Copy
Workbooks("Übersicht").Sheets("Art").Range("E5").PasteSpecial
'Anlegen eines Tabellenblattes mit Name "Hilfstabelle"
Workbooks("Art").Sheets.Add
ActiveSheet.Name = "Hilfstabelle"
'Neue Art werden aus der Übersicht kopiert und in die Hilfstabelle übertragen
Workbooks("Übersicht").Sheets("Art").Range("K5:M100").Copy
Workbooks("Art").Sheets("Hilfstabelle").Cells(1, 1).PasteSpecial Paste:=xlPasteValues,  _
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'löschen von Fehlern und Leerzeilen
Workbooks("Art").Sheets("Hilfstabelle").Rows("1:1").AutoFilter
ActiveSheet.Range("$A$1:$C$82").AutoFilter Field:=1, Criteria1:="=#NV", _
Operator:=xlOr, Criteria2:="="
Cells.Delete Shift:=xlUp
Range("A1").Select
'abschließende Meldung, dass Daten fertig zur Weiterbearbeitung sind
MsgBox "Die Daten sind verarbeitet."
Workbooks("Übersicht").Sheets("Cockpit").Activate
End Sub

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: vba Code kompatibel 2010
05.07.2018 14:29:01
PeterK
Hallo
Bei mir (Excel2013) muss Workbooks("Art.xlsx") stehen
AW: vba Code kompatibel 2010
05.07.2018 14:40:41
mmat
PeterK hat wahrscheinlich recht, aber so schreibt man das ja auch nicht :-)
Mit dem folgenden wird der Fehler vermieden:
Sub Art()
Dim zeilenende As Integer, WbArt as Workbook
'öffnen Datei im entsprechenden Laufwerk
set WbArt = Workbooks.Open ("E:\Art.xlsx")
'Festlegen von letzter Zeile in Spalte B
zeilenende = WbArt.Sheets("Art").Cells(Rows.Count, 2).End(xlUp).Row
... usw.

AW: vba Code kompatibel 2010
05.07.2018 14:42:41
Daniel
HI
normalerweise enthält der Workbookname immer die Dateierweiterung Workbooks("Art.xlsx"), sobald die Datei das erste mal gespeichert wurde.
es ist seltsam, dass die bei dir fehlt und der Code in dieser Form gelaufen sein soll.
wenn, dann liegts an einer Betriebssstemeinstellung bei dir.
probier mal, obs läuft wenn du in den Workbooks die Dateierweiterung mit hinzunimmst.
wenns dann bei dir nicht mehr geht, gibt's folgenden Workaround über Variablen:
zu beginn:
dim wbArt as workbook
dim wbÜb as Workbook
dim wb as workbook
Workbooks.Open "E:\Art.xlsx"
for each wb in application.Workbooks
if wb.name like "Art*" then set wbArt = wb
if wb.name like "Übersicht*" then set wbÜb = wb
Next

oder einfacher, wenn sich das Makro in der Datei "Übersicht" befindet:

dim wbArt as workbook
dim wbÜb as Workbook
set wbArt = Workbooks.Open("E:\Art.xlsx")
set wbÜB = thisworkbook

im folgenden verwendest du dann die Variablen anstelle von Workbooks(...)
...
zeilenende = wbArt.Sheets("Art").Cells(Rows.Count, 2).End(xlUp).Row
'löschen von bereits bestehendem Imput
wbÜb.Sheets("Art").Range("C5:C300").ClearContents
...

Gruß Daniel
Anzeige
AW: vba Code kompatibel 2010
05.07.2018 15:13:13
Nic365
Schon mal vielen Dank !!! Ich teste es gleich mal aus und gebe Feedback
@PeterK @mmat @Daniel
05.07.2018 15:13:42
EtoPHG
Meine Herren,
Das hat nix mit der Excelversion zu tun!
Das ist allein von der File-Explorer Einstellung Dateierweiterungen abhängig!
Gruess Hansueli
Daran habe ich auch sofort gedacht! ;-) Gruß owT
05.07.2018 19:31:47
Luc:-?
:-?
Danke Luc
05.07.2018 20:21:04
Daniel
für deinen überaus wichtigen und informativen Beitrag.
Ich denke erst mit diesem deinem Beitrag ist das Problem abschließend gelöst.
Gruß Daniel
Bitte sehr, gleichfalls (7.7.18 14:04:17)! :-] owT
08.07.2018 14:46:14
Luc:-?
:-?
unvollständige Referenzierung
05.07.2018 15:10:15
EtoPHG
Hallo,
2 mögliche Fehlerquellen:
Die Codezeile
zeilenende = Workbooks("Art").Sheets("Art").Cells(Rows.Count, 2).End(xlUp).Row
enthält eine Falltüre! Wird diese Codezeile ausgeführt, wenn nicht ein Tabellenblatt vom Typ xlWorksheet aktiv ist (z.B. ein Diagrammblatt), wird Rows.Count zum genannten Fehler führen. Vollständig müsste es heissen:
zeilenende = Workbooks("Art").Sheets("Art").Cells(Workbooks("Art").Sheets("Art").Rows.Count, 2).End(xlUp).Row
Dein Kollege hat im (File)Explorer die Einstellung [x] Dateinamenerweiterungen aktiviert. Damit heisst das Workbook("Art.xlsx") und nicht nur Workbook("Art")
Gruess Hansueli
Anzeige
Explorer Einstellung Fehlreferenzierung verhindern
05.07.2018 15:19:22
EtoPHG
Hallo,
Das Falsch-Referenzieren von Workbooks("String") kann so unabhängig von der File-Explorer Einstellung gemacht werden:
    Dim zeilenende As Long
Dim wbA As Workbook
Set wbA = Workbooks.Open("E:\Art.xlsx")
zeilenende = wbA.Sheets("Art").Cells(wbA.Sheets("Art").Rows.Count, 2).End(xlUp).Row

Zeilenreferenzierungen sollten übrigens immer Long definiert werden. Andernfalls kann es in XL2007 zu Integerüberlauf kommen!
Gruess Hansueli
abgeschrieben ? :-)
05.07.2018 16:30:00
mmat
ja, die Idee hatt' ich auch schon ...
(s. o.)
nein. ist eine Antwort für den Anfrager (owT)
05.07.2018 16:35:32
EtoPHG

schlicht nach dem ersten Satz aufgehört zu lesen
05.07.2018 16:39:11
EtoPHG
mmat,
Weil du sagst, dass Peter mit dem Satz, dass es etwas mit der Excelversion zu tun hat vermutlich recht habe. Was völlig absurd ist (siehe meine Begründungen).
Darum habe ich den Code gar nicht mehr gelesen. Aber anhand der Ähnlichkeit haben wir offenbar einen sehr ähnliche Programmierstil.
Gruess Hansueli
Anzeige
aber immer noch...
05.07.2018 16:44:51
Daniel
fehlt bei euch der hinweis, wie mit der zweiten Datei (Übersicht) umzugehen ist, die nicht geöffnet wird (wahrscheinlich weil sie die Datei ist, den Code enthält).
Gruß Daniel
quatsch mit sauce (owT)
05.07.2018 16:45:52
EtoPHG

dann schau nochmal genauer hin
05.07.2018 17:28:04
Daniel
Naja, den könntest du beitragen o.w.T
05.07.2018 17:02:56
mmat
Ich wollte dem Peter nur nicht widersprechen
05.07.2018 16:51:39
mmat
... weil eigentlich wusste ich nur, wie man das Problem grundsätzlich vermeidet.
Hallo Hansueli,
>> Aber anhand der Ähnlichkeit haben wir offenbar einen sehr ähnliche Programmierstil.
das hoffe ich doch! Denn so ist es richtig !! :-)
AW: Ich wollte dem Peter nur nicht widersprechen
05.07.2018 17:37:25
Nic365
Hallo, vielen Dank an alle. Ich bin sehr dankbar, da es mein erstes längeres VBA-Makro ist.
Leider ist mein Kollege heute schon im (verdienten ? ;))* Feierabend. Kommen dann erst morgen zum Testen. Ich habe jedenfalls wieder viel dazugelernt ;)
Nach nochmaliger Überprüfung hakt das Makro noch an einer anderer Stelle..... bzw. habe ich da wohl noch einen Fehler drin:
'löschen von Fehlern und Leerzeilen
Workbooks("Art").Sheets("Hilfstabelle").Rows("1:1").AutoFilter
ActiveSheet.Range("$A$1:$C$82").AutoFilter Field:=1, Criteria1:="=#NV", _Operator:=xlOr, Criteria2:="="
Cells.Delete Shift:=xlUp
Bezogen auf Spalte A (Field=1) sollen die dortigen Leerzeichen (Criteria2:="=") und #NV-Einträge (Criteria1:="=#NV") gelöscht werden. Er löscht nur die leeren Zeilen und nicht #NV. Durch den vorherigen Codeverlauf ist dies ja nur noch ein Text. Vielleicht kann mir da noch mal jemand einen kurzen Tipp geben.
Vielen Dank und einen schönen Abend,
Nic365
Anzeige
AW: Ich wollte dem Peter nur nicht widersprechen
05.07.2018 19:56:13
Daniel
Hi
in VBA braucht der Autofilter unabängig von der Ländereinstellung immer die englischen Werte.
im Falle des Bezugsfehlers ist das "#N/A" und nicht "#NV"
Alternativ zum Autofilter kann man Zellen mit Fehlerwerten auch so ansprechen:
Columns(1).SpecialCells(xlcelltypeconstants, 16).EntireRow.Delete
mit echten Leerzellen geht das auch:
Columns(1).SpecialCells(xlcelltypeblanks).EntireRow.Delete
wobei man wissen muss, dass eine Zelle die eine Formel mit dem Ergebnis "" enthielt und deren Formel mit Copy/PasteSpecial xlpasteValues eingefügt wurde, weiterhin keine echte Leerzelle ist, sondern eine Zelle mit Text, auch wenn dieser Text der Leerstring ist.
die nächste Frage an dich wäre:
überall arbeitest du korrekt mit vollständiger Referenzierung, dh jeder Zellbereich wird sauber über die vollständige Objektkette Workbook-Worksheet-Range angesprochen.
nur hier verlässt du diese sinnvolle Methode und arbeitest plötzlich mit dem ActiveSheet.
Warum?
du arbeitest mit meherern Dateien, da ist die vollständige Referenzierung erforderlich, damit du sicher bist, dass die Aktion auch auf dem richtigen Tabellenblatt abläuft!
Gruß Daniel
Anzeige
Danke, Daniel !!
06.07.2018 09:09:11
Nic365
Leider hat mein Kollege noch keine Rückmeldung gegeben. Aber schon mal ein kurzes Feedback zur letzten Nachricht von Daniel.
@Daniel: Du hast natürlich recht. Warum auch immer ich den Stil dort gebrochen habe. Hab es jedenfalls korrigiert. Vielen Dank. Jetzt läuft alles.
Schönen Tag an alle und viele Grüße
Nic365

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige