Microsoft Excel

Herbers Excel/VBA-Archiv

Makro-Bremsen lösen (bei Kopie aus andere Datei)

Betrifft: Makro-Bremsen lösen (bei Kopie aus andere Datei) von: Schmitty
Geschrieben am: 11.09.2014 10:01:43

Hallo,

ich habe mit Hilfe von "Makro aufzeichnen" einen funktionierenden Code erzeugt (Er soll von verschiedenen Tabellenblättern einer Datei die Formatierungen einiger Zeilen kopieren).

Er funktioniert recht gut aber braucht recht lange für die Arbeit. Nun meine Frage, ob man den Vorgang beschleunigen kann, also zum Beispiel ob die die Datei "Adressen.xlsm" immer zwangsläufig geöffnet werden muss.

Hier der Code:

' Format aus der Kunden-Datenbank holen
    'Schmitz GmbH
    Workbooks.Open Filename:="Z:\kartei\Adressen.xlsm"
    Windows("Adressen.xlsm").Activate
    Worksheets("Schmitz GmbH").Rows("6:2500").Copy
    Windows("Recherche.xlsm").Activate
    Sheets("Schmitz GmbH").Select
    Rows("6:2500").Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("B4").Select
    ' Schmitz EK
    Windows("Adressen.xlsm").Activate
    Sheets("Schmitz EK").Select
    Rows("6:170").Select
    Selection.Copy
    Windows("Recherche.xlsm").Activate
    Sheets("Schmitz EK").Select
    Rows("6:170").Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("B4").Select
    ' Raiffeisen Heizöl
    Windows("Adressen.xlsm").Activate
    Sheets("Raiffeisen Heizöl").Select
    Rows("6:192").Select
    Selection.Copy
    Windows("Recherche.xlsm").Activate
    Sheets("Raiffeisen Heizöl").Select
    Rows("6:192").Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("F4").Select
    ' Raiffeisen Diesel
    Windows("Adressen.xlsm").Activate
    Sheets("Raiffeisen Diesel").Select
    Rows("6:114").Select
    Selection.Copy
    Windows("Recherche.xlsm").Activate
    Sheets("Raiffeisen Diesel").Select
    Rows("6:114").Select
    Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Range("F4").Select
    ' Datei "Adressen.xlsm" schließen und NICHT speichern
    Windows("Adressen.xlsm").Activate
    ActiveWorkbook.Close savechanges:=False
Gruß
Christian

  

Betrifft: AW: Makro-Bremsen lösen (bei Kopie aus andere Datei) von: Rudi Maintaire
Geschrieben am: 11.09.2014 11:01:55

Hallo,
also zum Beispiel ob die die Datei "Adressen.xlsm" immer zwangsläufig geöffnet werden muss.
ja, muss.

Den größten Effekt erzielst du, indem du auf Activate und Select verzichtest.
z.B.

    Workbooks("Adressen.xlsm").Worksheets("Schmitz GmbH").Rows("6:2500").Copy
    Workbooks("Recherche.xlsm").Sheets("Schmitz GmbH").Rows("6:2500").PasteSpecial _
      Paste:=xlPasteFormats, Operation:=xlNone, _
      SkipBlanks:=False, Transpose:=False
Gruß
Rudi


  

Betrifft: AW: Makro-Bremsen lösen (bei Kopie aus andere Datei) von: Schmitty
Geschrieben am: 11.09.2014 11:39:34

Hallo Rudi,

danke für deine Antwort. Ich habe alles soweit verändert wie du es vorgeschlagen hast.

Jetzt muss ich es nur noch hinbekommen, dass im Tabellenblatt zum Schluss eine bestimmte Zelle markiert ist (damit ich dort später immer gleich etwas eintragen kann).

Der Code lautet im Moment:

    Workbooks("Adressen.xlsm").Worksheets("Schmitz GmbH").Rows("6:2500").Copy
    Workbooks("Recherche.xlsm").Sheets("Schmitz GmbH").Rows("6:2500").PasteSpecial Paste:= _
xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Workbooks("Recherche.xlsm").Sheets("Schmitz GmbH").Range("B4").Select

Leider versteht Excel wohl .Range("B4").Select nicht...

Gruß
Christian


  

Betrifft: AW: Makro-Bremsen lösen (bei Kopie aus andere Datei) von: Rudi Maintaire
Geschrieben am: 11.09.2014 12:19:08

Hallo,
Select kannst du nur auf ein aktives Blatt ausführen.
Deshalb sicherheitshalber alle Objekte nacheinander.

Workbooks("Recherche.xlsm").Select
Sheets("Schmitz GmbH").Select
Range("B4").Select
Gruß
Rudi


  

Betrifft: AW: Makro-Bremsen lösen (bei Kopie aus andere Datei) von: Rudi Maintaire
Geschrieben am: 11.09.2014 12:19:19

Hallo,
Select kannst du nur auf ein aktives Blatt ausführen.
Deshalb sicherheitshalber alle Objekte nacheinander.

Workbooks("Recherche.xlsm").Select
Sheets("Schmitz GmbH").Select
Range("B4").Select
Gruß
Rudi


  

Betrifft: AW: Makro-Bremsen lösen (bei Kopie aus andere Datei) von: Daniel
Geschrieben am: 11.09.2014 14:29:25

Hi
man kann die Zelle auch direkt mit Appliation.Goto aktivieren, Application.goto funktioniert auch Blatt- und Dateiübergreifend:

Application.Goto Workbooks("Recherche.xlsm").Sheets("Schmitz GmbH").Range("B4")
Gruß Daniel


  

Betrifft: AW: Makro-Bremsen lösen (bei Kopie aus andere Datei) von: Schmitty
Geschrieben am: 11.09.2014 14:52:16

Hallo Rudi,

hallo Daniel,

danke nochmals. Es funktioniert nun mit Daniels Lösungsvorschlag wie gewünscht!

Gruß
Christian


  

Betrifft: AW: Makro alle 15 Minuten ausführen von: Schmitty
Geschrieben am: 11.09.2014 15:04:42

So,

jetzt habe ich ein fertiges VBA, was wie folgt aussieht:

' Format aus der Kunden-Datenbank holen
    Sub Aktualisieren()

    ' Datei "Adressen.xlsm" öffnen
    Workbooks.Open Filename:="Z:\kartei\Adressen.xlsm"
    'Schmitz GmbH
    Workbooks("Adressen.xlsm").Worksheets("Schmitz GmbH").Rows("6:2500").Copy
    Workbooks("Recherche.xlsm").Sheets("Schmitz GmbH").Rows("6:2500").PasteSpecial Paste:= _
xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Application.Goto Workbooks("Recherche.xlsm").Sheets("Schmitz GmbH").Range("B4")
    ' Schmitz EK
    Workbooks("Adressen.xlsm").Worksheets("Schmitz EK").Rows("6:170").Copy
    Workbooks("Recherche.xlsm").Sheets("Schmitz EK").Rows("6:170").PasteSpecial Paste:= _
xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Application.Goto Workbooks("Recherche.xlsm").Sheets("Schmitz EK").Range("B4")
    ' Raiffeisen Heizöl
    Workbooks("Adressen.xlsm").Worksheets("Raiffeisen Heizöl").Rows("6:192").Copy
    Workbooks("Recherche.xlsm").Sheets("Raiffeisen Heizöl").Rows("6:192").PasteSpecial Paste:= _
xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Application.Goto Workbooks("Recherche.xlsm").Sheets("Raiffeisen Heizöl").Range("F4")
    ' Raiffeisen Diesel
    Workbooks("Adressen.xlsm").Worksheets("Raiffeisen Diesel").Rows("6:114").Copy
    Workbooks("Recherche.xlsm").Sheets("Raiffeisen Diesel").Rows("6:114").PasteSpecial Paste:= _
xlPasteFormats, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Application.Goto Workbooks("Recherche.xlsm").Sheets("Raiffeisen Diesel").Range("F4")
    ' Datei "Adressen.xlsm" schließen und NICHT speichern
    Windows("Adressen.xlsm").Activate
    ActiveWorkbook.Close savechanges:=False

End Sub
Jetzt möchte ich, dass dieses Makro, egal auf welchem Tabellenblatt ich gerade bin (gibt ja wie euch vielleicht aufgefallen ist vier Stück), nach 15 Minuten Inaktivitiät automatisch ausgeführt wird.

Ich habe
Application.OnTime Now + TimeValue("00:15:00"), "Aktualisieren"
probiert, jedoch startet das Makro dann auch nach 15 Minuten, nur hört es dann nicht mehr auf und läuft in einer Schleife immer und immer wieder durch...

Jemand eine Idee, wo der Denkfehler liegt?

Gruß
Christian


  

Betrifft: AW: Makro alle 15 Minuten ausführen von: Daniel
Geschrieben am: 11.09.2014 15:37:31

Hi
bei Ontime merkt sich Excel auch die Datei und führt das Makro auch dann aus, wenn die Datei geschlossen ist, dazu öffnet es dann die Datei wieder.

um das zu verhindern musst du den gestarteten OnTime-Aufruf beim Schließen der Datei wieder zurücknehmen.

das geht so:
1. in einem allgemeinen Modul oberhalb der Makros eine Variable für die Startzeit deklarieren, diese ist für alle Makros innerhalb der Datei gültig und sie behält ihren Wert auch beendigung der Makros:

Option Explict
Public Startzeit as Date
2. beim Starten des Makros befüllst du diese Startzeit:
Startzeit = Now + TimeSerial(0, 15, 0)
Application.Ontime Startzeit, "Aktualisieren"
3. die Rückname beim Schließen erfolgt mit diesem Code im Modul "DieseArbeitsmappe"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Startzeit > Now Then Application.OnTime Startzeit, "Aktualisieren", schedule:=False
End Sub

hierbei wird im Ontime der Parameter "Schedule" auf FALSE gesetzt.
Die Startzeit muss die gleiche sein wie beim normalen Aufruf, sonst gibt es einen Fehler
(das ist so erforderlich, weil du ja das Makro zu unterschiedlichen Zeiten starten könntest und von diesen Mehrfachaufrufen nicht alle sondern nur bestimmte zurücknehmen willst).

Gruß Daniel


  

Betrifft: AW: Makro alle 15 Minuten ausführen von: Schmitty
Geschrieben am: 12.09.2014 07:15:39

Hallo Daniel,

verstehe ich das richtig, dass bei diesem Code nach dem öffnen der Datei alle 15 Minuten das Makro ausgeführt wird, egal, was ich gerade in der Arbeitsmappe mache?

Das ist für meine Zwecke unpraktisch. Ich dachte da eher an eine Ausführung nach 15 Minuten Nichtbenutzung des Arbeitsblattes (oder alternativ eines der Autofilter auf den vier Tabellenblättern)...

Gruß
Christian


  

Betrifft: AW: Makro alle 15 Minuten ausführen von: Daniel
Geschrieben am: 12.09.2014 08:07:17

Hi
Wenn du mit Application.OnTime Startzeit, Makroname ein Makro aufrufst, wird dieses zur angegebenen Startzeit ausgeführt.

Wenn du ein Makro willst, dass nach 15 min Inaktivität läuft, dann musst du im SheetChange oder SheetSelectionChange-Event im Modul "Diese Arbeitsmappe" folgende Aktionen ausführen:
1. Mit Application.OnTime letzte Startzeit, Makroname, Schedule:=False den letzten Aufruf widerrufen.
2. Mit Application.OnTime neue Startzeit, Makroname das Makro zu einem späteren Zeitpunkt erneut starten.

Desweitern musst du beachten, dass das Makro auch dann ausgeführt wird, wenn du die Datei geschlossen hast, weswegen du beim Schließen ebenfalls den letzten Aufruf zurücknehmen solltest.

Gruß Daniel


  

Betrifft: AW: Makro alle 15 Minuten ausführen von: Schmitty
Geschrieben am: 12.09.2014 14:11:15

Hallo Daniel,

danke, ich werde dass nachher mal testen...

Gruß
Christian


 

Beiträge aus den Excel-Beispielen zum Thema "Makro-Bremsen lösen (bei Kopie aus andere Datei)"