Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema ScrollBar
BildScreenshot zu ScrollBar ScrollBar-Seite mit Beispielarbeitsmappe aufrufen

Automatisierungsfehler

Betrifft: Automatisierungsfehler von: Chris
Geschrieben am: 08.09.2014 22:18:23

Hallo zusammen,

per Autofilter möchte ich von einem Sheet Werte in ein anderes kopieren, ohne das beide Sheets aktiviert sind.
Excel "flackert" zwischen den beiden Sheets, danach kommt der Hinweis auf einen Automatiserungsfehler und Excel stürzt ab.

Dieses Makro steht bei im Sheet "Erfassung" in der Activate-Prozedur:

Sheets("FilImport").Range("E9:J710").ClearContents

Sheets("Import").Range("Q6:V707").AutoFilter Field:=1, Criteria1:="1"
Sheets("Import").Range("R6:W707").Copy

Sheets("FilImport").Range("E8").PasteSpecial (xlPasteValues)

Ich habe einen Haltepunkt gesetzt, der Fehler scheint bei dem PasteSpecial zu liegen, da bis ....Copy alles normal läuft.

Hat jemand einen Vorschlag wie ich diesen Fehler lösen kann?

Danke Chris

  

Betrifft: AW: Automatisierungsfehler von: Daniel
Geschrieben am: 08.09.2014 23:26:28

Hi

Das xlPasteValues hier ohne Klammer.
Bei einem direkten Befehlsaufruf werden die Parameter nicht in Klammern gesetzt.

Das PasteSpecial selektiert die eingefügten Zellen und löst damit auch entsprechende Events aus.
Hast du Event-Makros, die hier betroffen sein könnten?

Gruß Daniel


  

Betrifft: AW: Automatisierungsfehler von: Chris
Geschrieben am: 09.09.2014 07:37:47

Hallo Daniel,

Dein Vorschlag ohne Klammer funktioniert leider nicht - es flackert weiterhin und der Code bricht ab mit "Automatisierungsfehler - das Objekt wurde von den Clients getrennt."

Ich schicke mal die Makro, die sich im Sheet "Erfassung" befinden:

Private Sub Worksheet_Activate()
ActiveSheet.EnableAutoFilter = False
DisplayHorizontalScrollBar = False
DisplayVerticalScrollBar = False
'Sheets("Erfassung").ScrollArea = "A1:N32"
Range("H4").NumberFormat = "0000" 'ID Groß
Range("H4").Activate 
Range("G8").WrapText = True
Range("A101").FormulaLocal = "=SVERWEIS(H4;Filimport!E9:K707;7;FALSCH)"

Sheets("FilImport").Range("E9:J710").ClearContents
Sheets("Import").Range("Q6:V707").AutoFilter Field:=1, Criteria1:="1"
Sheets("Import").Range("R6:W707").Copy
Sheets("FilImport").Range("E8").PasteSpecial xlPasteValues

Set adr = Worksheets("FilImport").Range("J9:J709")
Set adr2 = Worksheets("FilImport").Range("I9:I709")


If Sheets("FilImport").Range("J9").Value = "INAKTIV" Then Range("E9:J9").ClearContents


End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

If Range("H4").Value = 0 Then Exit Sub Else Call NoReturn
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Set bereich = Range("A:ZZ")
If Application.Union(Target, bereich).Address = bereich.Address Then Range("H4").Select
End Sub



  

Betrifft: AW: Automatisierungsfehler von: Chris
Geschrieben am: 09.09.2014 07:53:45

Hallo Daniel,

Dein Vorschlag ohne Klammer funktioniert leider nicht - es flackert weiterhin und der Code bricht ab mit "Automatisierungsfehler - das Objekt wurde von den Clients getrennt."

Ich schicke mal die Makro, die sich im Sheet "Erfassung" befinden:

Private Sub Worksheet_Activate()
ActiveSheet.EnableAutoFilter = False
DisplayHorizontalScrollBar = False
DisplayVerticalScrollBar = False
'Sheets("Erfassung").ScrollArea = "A1:N32"
Range("H4").NumberFormat = "0000" 'ID Groß
Range("H4").Activate 
Range("G8").WrapText = True
Range("A101").FormulaLocal = "=SVERWEIS(H4;Filimport!E9:K707;7;FALSCH)"

Sheets("FilImport").Range("E9:J710").ClearContents
Sheets("Import").Range("Q6:V707").AutoFilter Field:=1, Criteria1:="1"
Sheets("Import").Range("R6:W707").Copy
Sheets("FilImport").Range("E8").PasteSpecial xlPasteValues

Set adr = Worksheets("FilImport").Range("J9:J709")
Set adr2 = Worksheets("FilImport").Range("I9:I709")


If Sheets("FilImport").Range("J9").Value = "INAKTIV" Then Range("E9:J9").ClearContents


End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

If Range("H4").Value = 0 Then Exit Sub Else Call NoReturn
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Set bereich = Range("A:ZZ")
If Application.Union(Target, bereich).Address = bereich.Address Then Range("H4").Select
End Sub



  

Betrifft: AW: Automatisierungsfehler von: Daniel
Geschrieben am: 09.09.2014 09:48:06

ok fangen wir mal am Anfang an, bevor wir in die Details gehen:
Ich habe den Code bei mir in eine leere Datei kopiert, die Blätter entsprechend benannt und versucht die Makros ans laufen zu bringen.
bei läuft gar nichts, ich bekomme die Fehlermeldung:
"Variable nicht deklariert" für "DisplayHorizontalScrollbar = False"

Private Sub Worksheet_Activate()
ActiveSheet.EnableAutoFilter = False
DisplayHorizontalScrollBar = False
DisplayVerticalScrollBar = False

was bedeuten hier die letzten zwei Zeilen?
Soll das eine Variablenzuweisung sein? - dann fehlt die Deklaration der Variablen
Möchtest du die Scrollbars ausschalten? - dann fehlt das "ActiveWindow." davor.

grundsätzlich sind deine Variablen nicht deklariert.
Arbeitest du nicht mit Option Explicit?
Wenn nein, solltest du das tun.
Warum und wieso steht hier: http://www.online-excel.de/excel/singsel_vba.php?f=4

Stelle erstmal um aufs Arbeiten mit Option Explicit und deklariere deine Variablen, dann kann man mal weiterschauen.

Gruß Daniel


  

Betrifft: AW: Automatisierungsfehler von: Chris
Geschrieben am: 09.09.2014 12:22:24

Hallo Daniel,

DisplayHorizontalScrollBar = False
DisplayVerticalScrollBar = False


bedeutet, dass die Scrollbalken nicht angezeigt werden und läuft ohne Probleme.. Allerdings ist das nicht wichtig, dient nur der Optik. Kann auch weggelassen werden. Option Explicit habe ich probiert, Excel hat nachwievor keinen Bock und gibt einen Automatisierungsfehler bekannt...


Nun habe ich ein wenig herumprobiert. Das Problem liegt aus irgendwelchen Gründen hier in der letzten Zeile:

Sheets("FilImport").Range("E8").PasteSpecial xlPasteValues

PasteValues in ein Sheet das nicht angezeigt wird in Verbindung mit Autofilter geht nicht. Wieso weiss ich nicht.

Was allerdings ohne Fehler läuft ist:

Sheets("Import").Range("R6:W707").Copy Sheets("FilImport").Range("E8")

Nun dachte ich, das Problem sei gelöst. Die Daten aus der Quelle (R6:W707) werden jedoch per Formel ermittelt, sodass bei ....Copy Sheets....die Formel kopiert wird und dann im Sheet "Filimport" die jeweilige Formel drin stehen mit "#Bezug" als Zelleninhalt.

Gibt irgendeine Möglichkeit hier zu sagen, kopiere nur die Werte?
Sheets("Import").Range("R6:W707").Copy Sheets("FilImport").Range("E8")

Chris


  

Betrifft: AW: Automatisierungsfehler von: Daniel
Geschrieben am: 09.09.2014 12:49:15

Hi
ich hab ja auch nicht gesagt, dass Option Explicit dein spezielles Problem löst.
Du solltst nur generell mit Option Explicit arbeiten und deine Variablen deklarieren.



Dein Progblem ist folgenendes (zumindest stellt es sich für mich so dar, wenn ich im Einzelstep teste)

der Befehl: Sheets("FilImport").Range("E8").PasteSpecial xlPasteValues selektiert intern das Sheet Import und den Zellbereich mit den eingefügten Daten (intern heißt, ohne dass es für dich sichtbar wird) und springt dann zum alten Blatt "Erfassung" zurück.
Durch diesen Rücksprung wird aber wieder das Activate-Event des Sheets "Erfassung" ausgelöst und du befindest dich in einer Endlosschleife.

Beim Einzeile Copy-Destination wird diese Selektion nicht ausgeführt, damit gibt es keinen Rücksprung und damit auch kein rekursives Auslösen des Activate-Events.
Nur kannst du das nicht verwenden, weil Copy-Destination nicht in der Lage ist, nur Werte einzufügen, da brauchst du schon das PasteSpecial.

du hast zwei Lösungsmöglichkeiten:

a) die Ausführung der Events ausschalten, um den Rekursiven Aufruf und die Endlosschleife zu vermeiden:

Application.EnableEvents = False
Sheets("FilImport").Range("E8").PasteSpecial xlPasteValues
Application.EnableEvents = True
b) Statt Copy-PasteSpecial überträgst du die Werte mit direkter Wertzuweisung:
Sheets("FilImport").Range("E8:J709").Value = Sheets("Import").Range("R6:W707").Value

bei dieser Methode musst du darauf achten, dass Ziel- und Quellzellberich gleich gross sind!
bei Copy-PasteSpecial reicht es, die linke obere Ecke des Zielbereichs anzugeben.

Gruß Daniel


  

Betrifft: AW: Automatisierungsfehler von: Chris
Geschrieben am: 09.09.2014 13:46:52

Hallo Daniel,

Option Explicit - ok, werde ich in Zukunft machen :-)

Bei Sheets("FilImport").Range("E8:J709").Value = Sheets("Import").Range("R6:W707").Value habe ich das Problem, dass immer alle Daten kopiert werden, da der Bereich ja immer gleich groß sein muss - wie du schon sagst.

Deshalb ist

Application.EnableEvents = False
Sheets("FilImport").Range("E8").PasteSpecial xlPasteValues
Application.EnableEvents = True

die richtige Variante, die auch funktioniert. Dank!

Chris