Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
668to672
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
668to672
668to672
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Hilfe für vorhandenes Makro

Hilfe für vorhandenes Makro
21.09.2005 13:38:45
Daniel
Hallo Zusammen,
Matthias G hatte mit hier im Forum vor ein paar Wochen unten stehendes Makro geschrieben, das Summen über bestimmte Tabellenblätter ausführt.
Dieses Makro wird alle x Minuten ausgeführt.
Leider bin ich erst jetzt dazu gekommen, das Ganze richtig zu testen.
Dabei hätte ich ein paar grundsätzliche Dinge gernen anders gelöst. Ich hoffe mir kann hier jemand helfen.
Folgene Punkte würde ich gernen ändern:
- Wenn ich zwei Mappen geöffnet habe, und die Mappe geöffnet habe, in der nicht dieses Makro ist, und Makrow ird wie oben erwähnt alle x Minuten ausgeführt, so kommt ein Fehler. Nämlich INdex außerhalb des gültigen bereichs. Es muss wohl daran liegen, dass die Mappe nicht aktiv ist. Wie kann man das ändern, das es im Hintergrund von selbst läuft.
- Außerdem möchte ich nicht, dass wenn ich in einer anderen Anwendung bin, nach Ausführen des Makro automatisch nach Excel springt. Wie kann man das umgehen.
Kurz gesagt möchte ich, dass alles im Hintergrund abläuft.
Ich hoffe, meine Erklärung ist nicht zu kurz und ist machbar.
Vielen Dank für Hilfe!
Daniel
So, und hier das Makro:
'Prozedur Blattsumme:
'Argumente: dat nach diesem Datum wird gesucht
' Spalte: Addiert die Werte der Blätter in dieser Spalte
' Ergebnisspalte: in diese Spalte wird die Summe geschrieben

Sub Blattsumme(dat As Date, Spalte As Integer, Ergebnisspalte As Integer)
Dim Blatt()
Dim Summe As Double
Dim bl
Dim z As Range
'Blattnamen (kann erweitert werden):
Blatt = Array("Blatt1", "Blatt2", "Blatt3", "Blatt4")
'Spalte A aller Blätter durchsuchen und in [Spalte] liegende Werte addieren
For Each bl In Blatt
Debug.Print bl
Set z = Sheets(bl).Range("A:A").Find(What:=dat)
If Not z Is Nothing Then Summe = Summe + z.Offset(0, Spalte - 1).Value
Next bl
'Summe in Tabelle eintragen:
Dim lz As Long
With Sheets("Gesamtauswertung")
'Suche Datum in Spalte A von Gesamtauswertung
Set z = .Range("A:A").Find(What:=dat)
If z Is Nothing Then
'nicht gefunden, dann neue Zeile anlegen
lz = .Cells(Rows.Count, Ergebnisspalte).End(xlUp).Row + 1
.Cells(lz, 1) = dat
Else
'gefunden, dann diese Zeile verwenden
lz = z.Row
End If
.Cells(lz, Ergebnisspalte) = Summe
.Cells(lz, Ergebnisspalte) = Summe
If Ergebnisspalte = 5 Then .Range("B3") = Summe
End With
End Sub

'---------------------------------------------------------------
'Test: Summiert die Treffen der Spalten B-K, ohne F und G

Sub Summen()
Dim i As Integer
For i = 2 To 5 'Spalte B-E
Blattsumme Date, i, i
Next i
For i = 8 To 11 'Spalte H-K
Blattsumme Date, i, i
Next i
End Sub

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Hilfe für vorhandenes Makro
21.09.2005 13:46:19
Rene
Hi,
damit es nur in dem Workbook ausgeführt wird, wo das macro drin ist, müsstest du überalle da, wo du auf ein sheet oder eine celle verweist, mit Thisworkbook davor oder workbooks(Workbookname) einfügen, damit es auch wirklich nur in diesem workbook ausgeführt wird...
wegen im hintergrund laufen machst du am anfang ein application.screenupdaten = false rein und am ende ein application.screenupdating = true rein
have fun
lg René
AW: Hilfe für vorhandenes Makro
21.09.2005 13:52:35
u_
Hallo,
ungetestet für dein erstes Prob:
Sub Blattsumme(dat As Date, Spalte As Integer, Ergebnisspalte As Integer)
Dim Blatt()
Dim Summe As Double
Dim bl
Dim z As Range
Dim wks As Worksheet
'Blattnamen (kann erweitert werden):
Blatt = Array("Blatt1", "Blatt2", "Blatt3", "Blatt4")
'Spalte A aller Blätter durchsuchen und in [Spalte] liegende Werte addieren
For Each bl In Blatt
For Each wks In ThisWorkbook.Worksheets
If wks.Name = bl Then
Set z = wks.Range("A:A").Find(What:=dat)
If Not z Is Nothing Then Summe = Summe + z.Offset(0, Spalte - 1).Value
Exit For
End If
Next wks
Next bl
Gruß
Geist ist geil!
Anzeige
AW: Hilfe für vorhandenes Makro
21.09.2005 17:06:29
Daniel
Also das Problem besteht weiterhin.
Es wird die Zeile
Set z = wks.Range("A:A").Find(What:=dat)
markiert. Index außerhalb des gütligen Bereichs.
Was muss geändert werden?
danke,
Daniel
AW: Hilfe für vorhandenes Makro
21.09.2005 19:24:17
Rene
wie gesagt, setze erstmal for jedes "sheet" ein "thisworkbook.", somit ist das gesamte macro nur auf dieses workbook beschränkt
sachen wie activesheet solltest du rausnehmen, da das sich nun wieder auf das derzeit active sheet bezieht
lg René
AW: Hilfe für vorhandenes Makro
21.09.2005 19:28:13
Rene
probiers mal so, dürfte eigentlich gehen, bzw ich habe keinen Fehler gefunden und bei mir läufts...

Sub Blattsumme(dat As Date, Spalte As Integer, Ergebnisspalte As Integer)
Dim Blatt()
Dim Summe As Double
Dim bl
Dim z As Range
'Blattnamen (kann erweitert werden):
Blatt = Array("Blatt1", "Blatt2", "Blatt3", "Blatt4")
'Spalte A aller Blätter durchsuchen und in [Spalte] liegende Werte addieren
For Each bl In Blatt
Debug.Print bl
Set z = Thisworkbook.Sheets(bl).Range("A:A").Find(What:=dat)
If Not z Is Nothing Then Summe = Summe + z.Offset(0, Spalte - 1).Value
Next bl
'Summe in Tabelle eintragen:
Dim lz As Long
With thisworkbook.Sheets("Gesamtauswertung")
'Suche Datum in Spalte A von Gesamtauswertung
Set z = .Range("A:A").Find(What:=dat)
If z Is Nothing Then
'nicht gefunden, dann neue Zeile anlegen
lz = .Cells(Rows.Count, Ergebnisspalte).End(xlUp).Row + 1
.Cells(lz, 1) = dat
Else
'gefunden, dann diese Zeile verwenden
lz = z.Row
End If
.Cells(lz, Ergebnisspalte) = Summe
.Cells(lz, Ergebnisspalte) = Summe
If Ergebnisspalte = 5 Then .Range("B3") = Summe
End With
End Sub

'---------------------------------------------------------------
'Test: Summiert die Treffen der Spalten B-K, ohne F und G

Sub Summen()
Dim i As Integer
For i = 2 To 5 'Spalte B-E
Blattsumme Date, i, i
Next i
For i = 8 To 11 'Spalte H-K
Blattsumme Date, i, i
Next i
End Sub

Anzeige
AW: Hilfe für vorhandenes Makro
22.09.2005 09:14:26
Daniel
Ok,danke.
Damit wird das erste Problem gelöst.
Allerdings habe ich das 2. noch.
In der Datei läuft eine Kopierroutine alle x Minuten. Wnenn ich nicht in Excel bin, sondern in einer anderen Anwendung, dann springt es automatisch nach Excel. Das möchte ich nicht. Soll ich das bestreffende Makro mal einstellen, ich verstehe das nicht was ich da ändern muss.
Grüße,
Daniel
AW: Hilfe für vorhandenes Makro
22.09.2005 09:52:45
Rene
Verswuche mal ein "application.screenapdating = false" gleich am anfang, aber irgendwo muss du dann auch ein application.screenupdating = true eintragen, damit du irgendwann auch mal excel wieder vorholen kannst, sonst hört des ja nie auf
lg René
Anzeige
AW: Hilfe für vorhandenes Makro
22.09.2005 10:44:16
Daniel
Hi,
ich bekomme das irgendwie nicht hin.
So sieht das ganze Modul aus:
Option Explicit
Public NextTime As Date
'führt Prozedur "Kopieren" aus und bibt Excel Startzeit für die nächste Ausführung an:

Sub StartTimer()
StopTimer
NextTime = Now + TimeValue("00:01:00") 'alle 60 Minuten
Kopieren
Summen
Application.OnTime NextTime, "StartTimer"
End Sub

'Löscht die OnTime-Anweisung wieder

Sub StopTimer()
On Error Resume Next
Application.OnTime earliesttime:=NextTime, Procedure:="StartTimer", Schedule:=False
On Error GoTo 0
End Sub

'Funktion prüft, ob angegebene Mappe geöffnet ist. Rückgabewert: True oder False

Function WBIsOpen(ByVal n As String) As Boolean
Dim wb As Workbook
For Each wb In Workbooks
If UCase(wb.Name) = UCase(n) Then
WBIsOpen = True
Exit Function
End If
Next wb
WBIsOpen = False
End Function

'Funktion prüft, ob angegebener Tabellenblattname vorhanden ist. Rückgabewert: True oder False

Function WSExists(wb As Workbook, ByVal n As String) As Boolean
Dim ws As Worksheet
For Each ws In wb.Sheets
If UCase(ws.Name) = UCase(n) Then
WSExists = True
Exit Function
End If
Next ws
WSExists = False
End Function


Sub Kopieren()
Dim i As Integer, n As String
Dim ActSh As Worksheet
Dim erg As String, WarFehler As Boolean
i = 1
n = ThisWorkbook.Sheets("Namen").Cells(i, 1)
WarFehler = False
If UserForm1.Visible = True Then Unload UserForm1
Set ActSh = ActiveSheet 'aktuelles Blatt merken
'Meldung anzeigen
With UserForm1
.SchliessenButton.Enabled = False
.Show False 'nichtmodal anzeigen, d.h. es wird nicht aufs Schließen der UF gewartet
Application.ScreenUpdating = False 'Bildschirmaktualisierung abschalten
End With
Do While n <> ""
UserForm1.TextBox1 = UserForm1.TextBox1 & vbLf & "Mappe wird aus """ & n & ".xls" & """ aktualisiert..."
DoEvents
erg = KopiereBlatt(ThisWorkbook.Path, n & ".xls", "Auswertung", n)
If erg = "" Then
UserForm1.TextBox1 = UserForm1.TextBox1 & "OK" & vbLf
Else
WarFehler = True
UserForm1.TextBox1 = UserForm1.TextBox1 & vbLf & "FEHLER:" & erg & vbLf
End If
i = i + 1
n = ThisWorkbook.Sheets("Namen").Cells(i, 1)
Loop
If WarFehler Then
'Wenn Fehler, dann auf Bestätigung warten
UserForm1.SchliessenButton.Enabled = True
Else
'sonst Userform gleich schließen
Unload UserForm1
End If
ActSh.Activate 'Blatt wieder aktivieren (falls neue Blätter erzeugt werden mussten)
'Bildschirmaktualisierung wieder einschalten
Application.ScreenUpdating = True
End Sub

'Kopierroutine

Function KopiereBlatt(QMappe_Pfad As String, QMappe_Name As String, _
QBlatt_Name As String, ZBlatt_Name As String) As String
'Debug.Print QMappe_Pfad, QMappe_Name, QBlatt_Name, ZBlatt_Name
'Exit Sub
Dim WB_Q As Workbook
Dim WS_Q As Worksheet
Dim WS_Z As Worksheet
Dim Zieloffen As Boolean
Dim ErrMsg As String 'Fehlermeldung, bei möglichen Fehlern
On Error GoTo ERRHANDLER
'Mappe Master.xls bei Bedarf schreibgeschützt öffnen
If Not WBIsOpen(QMappe_Name) Then
ErrMsg = "Fehler beim Öffnen von """ & QMappe_Pfad & "\" & QMappe_Name & """"
Application.EnableEvents = False '<<< NEU
Workbooks.Open QMappe_Pfad & "\" & QMappe_Name, ReadOnly:=True, UpdateLinks:=False '<<< NEU
Application.EnableEvents = True '<<< NEU
ErrMsg = ""
Zieloffen = False
Else
Zieloffen = True
End If
'Prüfen, on Blatt existiert, b.B. erstellen
If Not WSExists(ThisWorkbook, ZBlatt_Name) Then
ThisWorkbook.Sheets.Add After:=ThisWorkbook.Sheets(Sheets.Count)
ThisWorkbook.ActiveSheet.Name = ZBlatt_Name
End If
'Variablen zuweisen
Set WS_Z = ThisWorkbook.Sheets(ZBlatt_Name)
Set WB_Q = Workbooks(QMappe_Name)
ErrMsg = "Blatt """ & QBlatt_Name & """ in " & QMappe_Name & " nicht vorhanden!"
Set WS_Q = WB_Q.Sheets(QBlatt_Name)
ErrMsg = ""
WS_Z.Cells.Delete 'Blattinhalt löschen
WS_Q.Cells.Copy 'Blattinhalt kopieren
'in Blatt Schmidt einfügen:
With WS_Z.Range("A1")
.PasteSpecial xlPasteValues
.PasteSpecial xlPasteFormats
'.Select
End With
Application.CutCopyMode = False 'Kopiermarkiereung entfernen
'Quellmappe wieder schließen, wenn sie extra geöffnet wurde
If Not Zieloffen Then WB_Q.Close SaveChanges:=False
KopiereBlatt = ""
Exit Function
ERRHANDLER:
KopiereBlatt = IIf(ErrMsg = "", Err.Description, ErrMsg)
Err.Clear
End Function

Anzeige
AW: Hilfe für vorhandenes Makro
22.09.2005 09:59:45
Rene
Hi,
sezte am anfang der sub ein Application.screenupdating = false, so müsste es gehen...
lg René

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige