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

Dieses Makro über mehrere Tabellen

Dieses Makro über mehrere Tabellen
28.12.2003 02:00:32
Uwe
Hallo Zusammen,

schon mal im voraus vielen Dank für eure Mühe...

ich hoffe es kann mir jemand helfen. Folgendes Makro habe
ich erstellt um aus einer Tabelle, die ich von unserem
Rechenzentrum bekomme auszuwerten. Jetzt ist es aber
so, dass es mehrere Tabellen sind, da ich mehrere Mandanten
verwalte.

Es werden pro Mitarbeiter pro Monat alle Lohnarten, die
im einzelnen Monat angefallen sind vom Rechenzentrum
Zeile für Zeile aufgeführt. Ich sortiere und summiere
die Lohnarten über mehrere Monate hinweg in eine
neue Tabelle, die ich SozialplanSumme genannt habe.

Wie kann ich dieses Makro umschreiben, oder ergänzen, dass
es über mehrere Tabellen die entsprechenden Daten holt????

Wäre sehr über eine Hilfe dankbar.

Hier das Makro:


Sub LOAsumiert022()
Dim summe As Single, bereich As range, zelle As range, wsszelle, j As Date
j = Now
n = 6       'Zeilenzähler für Pers-Nr. in SozialplanSumme Tabelle
d = 3       'Spaltenzähler für LOA
summe = 0
Set wss = ThisWorkbook.Worksheets("SozialplanSumme")
Set w022 = ThisWorkbook.Worksheets("Mandant022")
wsszelle = wss.UsedRange.Rows.Count + 1
w022zelle = w022.UsedRange.Rows.Count
wssSpalte = wss.UsedRange.Columns.Count
w022bereich = range(Cells(1, 1), Cells(w022zelle, 1)).Address
Set bereich = w022.range(w022bereich)
Do Until d = wssSpalte
Do Until n = wsszelle + 1
For Each zelle In bereich
If zelle.Value = wss.range("A" & n).Value And _
zelle.Offset(0, 9) = wss.Cells(2, d) Then
summe = summe + zelle.Offset(0, 11).Value
Else
End If
Next zelle
wss.Cells(n, d) = summe
n = n + 1
summe = 0
Loop
d = d + 1
n = 6
Loop
Debug.Print "LOAsummiert022-Makro abgearbeitet in: " & Format(Now - j, "hh:mm:ss")
End Sub

31
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dieses Makro über mehrere Tabellen
28.12.2003 10:13:21
Josef Ehrensberger
Hallo Uwe,

ich nehme mal an, das die Tabellenblätter die übertragen
werden sollen alle den Namen "Mandantxxx" haben.

Dann arbeitet die zusätzliche Schleife alle Blätter
ab deren Name mit "Mandant" beginnt.



Sub LOAsumiert022()

Dim summe As Single, bereich As Range, zelle As Range, wsszelle, j As Date
Dim wks As Worksheet
j = Now
n = 6       'Zeilenzähler für Pers-Nr. in SozialplanSumme Tabelle
d = 3       'Spaltenzähler für LOA
summe = 0
Set wss = ThisWorkbook.Worksheets("SozialplanSumme")
For Each wks In ThisWorkbook.Sheets
If Left(wks.Name, 7) = "Mandant" Then  'Überprüft den Namen der Tabelle
Set w022 = wks    'Wenn Tabellenname mit "Mandant" beginnt dann

wsszelle = wss.UsedRange.Rows.Count + 1
w022zelle = w022.UsedRange.Rows.Count
wssSpalte = wss.UsedRange.Columns.Count

w022bereich = Range(Cells(1, 1), Cells(w022zelle, 1)).Address
Set bereich = w022.Range(w022bereich)
Do Until d = wssSpalte
    Do Until n = wsszelle + 1
        For Each zelle In bereich
            If zelle.Value = wss.Range("A" & n).Value And _
                zelle.Offset(0, 9) = wss.Cells(2, d) Then
                summe = summe + zelle.Offset(0, 11).Value
                Else
            End If
        Next zelle
        wss.Cells(n, d) = summe
        n = n + 1
        summe = 0
    Loop
    d = d + 1
    n = 6
Loop
Next  'Schleife für alle Tabellen
Debug.Print "LOAsummiert022-Makro abgearbeitet in: " & Format(Now - j, "hh:mm:ss")
End Sub

     Code eingefügt mit Syntaxhighlighter 2.5


Gruß Sepp
Anzeige
AW: Hallo, Funktioniert noch nicht.
28.12.2003 10:39:14
Uwe
Hallo Zusammen,
hallo Sepp,

vielen Dank, dass Du Dich mit dem Problem beschäftigst. Find ich super.

Ja, die anderen Tabellen beginnen mit dem Text "Mandantxxx".

Nach dem ich Dein Makro übernommen habe, habe ich es getestet.
Es funktioniert leider noch nicht, da er eine Fehlermeldung ausgibt:
"Next ohne For".
Da ich noch Anfänger auf dem Gebiet Makroprogrammierung bin, wäre
es Klasse, wenn Du mir nochmal helfen könntest. Habe es versucht auch
an einer anderen Stelle (Deine Ergänzung) einzutragen, aber es
funktioniert nicht.

Vielen Dank im voraus.

Viele Grüße
Uwe
Anzeige
AW: Hallo, Funktioniert noch nicht.
28.12.2003 10:47:37
Ramses
Hallo Uwe

Die Fehlermeldung ist falsch.
Es muss eigentlich heissen "If ohne End IF". Da ist EXCEL wohl etwas überfordert ;-))
Ändere den Code so:

Loop
End If
Next 'Schleife für alle Tabellen

Gruss Rainer
Hier auch noch was...
28.12.2003 10:27:03
Ramses
Hallo

Auch wenn Josef schon was geschriben hat,... hier noch meine Variante die zwischenzeitlich entstanden ist :-))

Option Explicit


Sub Workbook_Summiertes_022()
'by Ramses
'Variablendeklaration
Dim summe As Single, i As Integer, n As Long, d As Long
Dim wksZelle As Long, wssZelle As Long, wssSpalte As Integer
Dim wksBereich As Range, Bereich As Range, Zelle As Range
Dim j As Date
'w022 wurde durch wks ersetzt um für alle Worksheets
'angewendet werden zu können
Dim wss As Worksheet, wks As Worksheet
'Variablenzuweisung
j = Now
n = 6       'Zeilenzähler für Pers-Nr. in SozialplanSumme Tabelle
d = 3       'Spaltenzähler für LOA
summe = 0
Set wss = ThisWorkbook.Worksheets("SozialplanSumme")
'Start der Schleife über alle Tabellen in
'der aktuellen Arbeitsmappe
For i = 1 To Worksheets.Count
Set wks = Worksheets(i).Name
'Tabellenname muss mit "Mandant" beginnen
If UCase(Left(wks, 7)) <> "MANDANT" Then
Debug.Print "Makro " & i & " von " & Worksheets.Count & _
" für " & wks & " gestartet um: " & Format(Now - j, "hh:mm:ss")
'Hier wurden keine Änderungen mehr vorgenommen
wssZelle = wss.UsedRange.Rows.Count + 1
wksZelle = wks.UsedRange.Rows.Count
wssSpalte = wss.UsedRange.Columns.Count
wksBereich = wks.Range(Cells(1, 1), wks.Cells(wksZelle, 1)).Address
Set Bereich = wks.Range(wksBereich)
Do Until d = wssSpalte
Do Until n = wssZelle + 1
For Each Zelle In Bereich
If Zelle.Value = wss.Range("A" & n).Value And _
Zelle.Offset(0, 9) = wss.Cells(2, d) Then
summe = summe + Zelle.Offset(0, 11).Value
End If
Next Zelle
wss.Cells(n, d) = summe
n = n + 1
summe = 0
Loop
d = d + 1
n = 6
Loop
Debug.Print "Makro " & i & " fertig um: " & Format(Now - j, "hh:mm:ss")
End If
Next i
End Sub


Gruss Rainer
Anzeige
AW: Hier auch noch was...
28.12.2003 12:57:01
AW: Hallo Rainer
Hallo Zusammen,
Hallo Rainer,

vielen Dank für Deine Hilfe,
leider funktioniert es noch nicht
und da ich nicht so erfahren bin,
wäre es klasse, wenn Du mir noch
mal helfen könntest.

Folgender Fehler erscheint in der
Zeile: " Set wks = Worksheets(i).Name"

Laufzeitfehler 424 Objekt erforderlich.

Nochmals vielen DAnk für Deine Hilfe im voraus.

Gruß Uwe
Lapsus...
28.12.2003 13:01:12
Ramses
Hallo

ändere die Zeile mal in

Set wks = Worksheets(Worksheets(i).Name)

Dann sollte es tun.

Gruss Rainer
AW: Lapsus...
28.12.2003 13:09:10
Uwe
Hallo Rainer,

ja, jetzt funktioniert es, aber leider
kommt jetzt die nächste FEhlermeldung in
der Zeile:

If UCase(Left(wks, 7)) <> "MANDANT" Then
Debug.Print "Makro " & i & " von " & Worksheets.Count & _
" für " & wks & " gestartet um: " & Format(Now - j, "hh:mm:ss")

Laufzeitfehler 438: Objekt unterstützt diese Eigenschaft oder Methode nicht.

Noch mal vielen DAnk für Deine HIlfe

Gruß Uwe
Anzeige
Microsoft Test :-)
28.12.2003 13:31:17
Ramses
Hallo Uwe

die testen die SW auch immer erst beim Kunden

UCase(Left(wks.Name, 7))

und das nächste gleich

" für " & wks.Name & " gestartet um

Gruss Rainer
AW: Microsoft Test :-) Super, gelöst !!Danke
28.12.2003 13:41:00
Uwe
Hallo Rainer,

ja, das hat das Problem behoben.
Leider ist noch ein weiteres Problem aufgetreten.
Siehe weiter unten.

Vielen Dank für Deine Geduld.... und Hilfe

Gruß
Uwe
AW: Noch ein Problem
28.12.2003 13:31:03
Uwe
Hallo Zusammen,
Hallo Rainer,

vielen Dank für Deine Hilfe,
leider funktioniert es noch nicht
und da ich nicht so erfahren bin,
wäre es klasse, wenn Du mir noch
mal helfen könntest.

Folgender Fehler erscheint in der
Zeile: wksBereich = wks.range(Cells(1, 1), wks.Cells(wksZelle, 1)).Address

Laufzeitfehler 1004: Anwendungs- oder Objektdefinierter Fehler
Nochmals vielen DAnk für Deine Hilfe im voraus.

Gruß Uwe
Anzeige
AW: Noch ein Problem
28.12.2003 13:37:57
Ramses
Hallo

es muss heissen

Set wksBereich = wks.range(Cells(1, 1), Cells(wksZelle, 1))

Gruss Rainer
AW: Noch ein Problem
28.12.2003 13:45:08
Uwe
Hallo Rainer,

leider kommt die gleiche Fehlermeldung.

Danke für Deine Hilfe

Gruß Uwe
AW: Noch ein Problem
28.12.2003 13:45:15
Uwe
Hallo Rainer,

leider kommt die gleiche Fehlermeldung.

Danke für Deine Hilfe

Gruß Uwe
???
28.12.2003 13:51:02
Ramses
Hallo Uwe

bei mir funktioniert die Anweisung.

Welchen Wert hat die Variable "wksZelle" wenn das Makro stoppt ?
Mit dem Mauszeiger über die Variable fahren und im Infofenster ablesen oder in die Zeile vor der SetAnweisung "Debug.Print wkszelle" schreiben

Gruss Rainer
Anzeige
AW: ???
28.12.2003 13:54:28
Uwe
Hallo Rainer,

der Wert für wkszelle der Angezeigt wird ist 1

Gruß Uwe
Variablenfehler
28.12.2003 14:01:31
Ramses
Hallo Uwe

ändere die Variablendeklaration von "Dim wksBereich as Range" in "Dim wksBereich as Range".

Ändere anschliessend die Zuweisung wieder wie auf den alten Stand:

wksbereich = wks.Range(Cells(1, 1), wks.Cells(wkszelle, 1)).Address
Set Bereich = wks.Range(wksbereich)

WksBereich war als Range = Bereich deklariert, aber wir haben nur einen String = Adresse übergeben.
Das war das Problem

Gruss Rainer
Bitte noch lesen
28.12.2003 14:02:16
Ramses
Hallo Uwe

die Änderung muss natürlich lauten

Dim wksBereich as String

Gruss Rainer
Anzeige
AW: Variablenfehler
28.12.2003 14:08:59
Uwe
Hallo Rainer,

Du hast mir folgendes geschrieben:

"ändere die Variablendeklaration von "Dim wksBereich as Range" in "Dim wksBereich as Range"."

Hier ist aber keine Änderung erfolgt?

Habe es jetzt mit beiden probiert, einmal mit String und einmal mit Range.

Leider kommt die gleiche Fehlermeldung!!!! Bei Dir klappt es ???

Würde Dir gerne die Tabellen zur Verfügung stellen, aber es handelt sich
hierbei um Daten die ich nicht bekanntgeben darf.

Danke für Deine Geduld.

Gruß Uwe
Nochmals neu...
28.12.2003 14:22:28
Ramses
Hallo Uwe

ich hab mal versucht die Tabelle nachzubilden.
Mit nachfolgendem Code läuft es zumindest bei mir:


Sub Workbook_Summiertes_022()
'by Ramses
'Variablendeklaration
Dim summe As Single, i As Integer, n As Long, d As Long
Dim wksZelle As Long, wssZelle As Long, wssSpalte As Integer
Dim wksBereich As String, Bereich As Range, Zelle As Range
Dim j As Date
'w022 wurde durch wks ersetzt um für alle Worksheets
'angewendet werden zu können
Dim wss As Worksheet, wks As Worksheet
'Variablenzuweisung
j = Now
n = 6       'Zeilenzähler für Pers-Nr. in SozialplanSumme Tabelle
d = 3       'Spaltenzähler für LOA
summe = 0
Set wss = ThisWorkbook.Worksheets("SozialplanSumme")
'Start der Schleife über alle Tabellen in
'der aktuellen Arbeitsmappe
For i = 1 To Worksheets.Count
    Set wks = ThisWorkbook.Worksheets(Worksheets(i).Name)
    'Tabellenname muss mit "Mandant" beginnen
    If UCase(Left(wks.Name, 7)) <> "MANDANT" Then
        Debug.Print "Makro " & i & " von " & Worksheets.Count & _
            " für " & wks.Name & " gestartet um: " & Format(Now - j, "hh:mm:ss")
        'Hier wurden keine Änderungen mehr vorgenommen
        wssZelle = wss.UsedRange.Rows.Count + 1
        wksZelle = wks.UsedRange.Rows.Count
        wssSpalte = wss.UsedRange.Columns.Count
        wksBereich = Range(Cells(1, 1), Cells(wksZelle, 1)).Address
        Set Bereich = wks.Range(wksBereich)
        Do Until d = wssSpalte
            Do Until n = wssZelle + 1
                For Each Zelle In Bereich
                    If Zelle.Value = wss.Range("A" & n).Value And _
                        Zelle.Offset(0, 9) = wss.Cells(2, d) Then
                        summe = summe + Zelle.Offset(0, 11).Value
                    End If
                Next Zelle
                wss.Cells(n, d) = summe
                n = n + 1
                summe = 0
            Loop
        d = d + 1
        n = 6
        Loop
        Debug.Print "Makro " & i & " fertig um: " & Format(Now - j, "hh:mm:ss")
    End If
Next i
End Sub 
     Code eingefügt mit Syntaxhighlighter 1.16



Gruss Rainer
Anzeige
AW: ???
28.12.2003 14:22:55
Uwe
Hallo Rainer,

habe jetzt mal das Workbook hochgeladen, vielleicht
ist es dann nicht so schwierig.?!

Die Datei https://www.herber.de/bbs/user/2621.xls wurde aus Datenschutzgründen gelöscht


Vielen Dank für Deine Geduld und Hilfe.

Gruß Uwe
AW: ???
28.12.2003 13:58:18
Uwe
Hallo Rainer,

nachdem er bei dem Fehler stoppt, ist der wks.name = AbfindungsSumme
Der Name einer anderen Tabelle in diesem Workbook.
Liegt es vielleicht daran??

Gruß Uwe
AW Hallo Rainer, habe Datei hochgeladen
28.12.2003 14:30:20
Uwe
Hallo Rainer,

habe jetzt mal das Workbook hochgeladen, vielleicht
ist es dann nicht so schwierig.?!

Die Datei https://www.herber.de/bbs/user/2621.xls wurde aus Datenschutzgründen gelöscht


Vielen Dank für Deine Geduld und Hilfe.

Gruß Uwe
Anzeige
Läuft
28.12.2003 14:41:44
Ramses
Hallo Uwe,

es war die letzte Änderung wie ich bescshrieben habe.
Der Code läuft und ist im Modul 2 untergebracht

https://www.herber.de/bbs/user/2622.xls

Gruss Rainer
AW: Läuft aber in SozialplanSumme
28.12.2003 14:48:07
Uwe
Hallo Rainer,

ja der Code läuft jetzt, aber es erfolgt keine Berechnung
und die Tabelle"SozialplanSumme" ist nicht ausgefüllt.
Was muss denn noch geändert werden???

Ich hoffe Du verzweifelst nicht langsam mit mir.

Vielen Dank

Gruß Uwe
AW: Läuft aber in SozialplanSumme
28.12.2003 15:05:05
Ramses
Hallo Uwe

Der Teufel steckt im Detail :-))

Es muss heissen

If UCase(Left(wks.Name, 7)) = "MANDANT" Then

Gruss Rainer
AW: Mandant022 wird übertragen, aber...
28.12.2003 15:20:33
Uwe
Hallo Rainer,

leider ist immer noch ein Problem vorhanden.
Der Mandant022 wird in die Tabelle"SozialplanSumme"
übertragen und berechnet, aber der Mandant023 nicht.

Kannst Du mir nochmal helfen.

Gruß Uwe
Berechnungsfehler... :-)
28.12.2003 15:44:09
Ramses
Hallo Uwe

nachdem das Makro ursprünglich nur für einen Durchlauf konzipiert war, steigt das Makro aus nach dem ersten Durchlauf, weil "d = wssSpalte"

Ändere die letzten Zeilen wie folgt


Sub Workbook_Summiertes_022()
Debug.Print "Makro " & i & " fertig um: " & Format(Now, "hh:mm:ss")
'Hier muss d wieder auf den Standardwert zurückgesetzt werden
d = 3
End If
Next i
End Sub


Gruss Rainer
AW: Habe es ergänzt, aber jetzt wird
28.12.2003 15:46:23
Uwe
Hallo Rainer,

habe jetzt unten folgendes ergänzt: d = 3 in dem Code.
Jetzt durchläuft er auch Mandant022 und 023 füllt
Mandant 022 aus und anschließend beim Ausfüllen
von Mandant023 löscht er die Daten von Mandant022
in der SozialplanSummen Tabelle.???

Irgendwie habe ich es wohl alles falsch gemacht????
Bin wohl doch zu blöd dafür.

Debug.Print "Makro " & i & " fertig um: " & Format(Now - j, "hh:mm:ss")
End If
d = 3
Next i
End Sub

Wäre über Deine Hilfe sehr Dankbar.

Gruß Uwe
AW: Habe es ergänzt, aber jetzt wird
28.12.2003 16:07:57
Ramses
Hallo Uwe

... nun muss ich passen.
Für die Berechnung bin ich nicht zuständig ;-)

Ich versuche seit 3 Stunden herauszubekommen, warum diese Wahnsinnsschleifen laufen und warum und von woher die Daten in die Tabelle "Sozialplansumme" übertragen werden.
Leider ohne Erfolg,... bin wohl zu blöd dafür ;-)

Ich denke das hängt mit dem Übertrag in die Tabelle Sozialplansumme zusammen, weil hier "n" und "d" ja teilweise gleich sind, und deshalb die Daten überschrieben werden, wenn beim einen Mandanten Daten vorhanden sind und bei anderen nicht.
Auf die Personalnummer wird hier ja keine Rücksichtgenommen.
Es kann jetzt nur noch sein, dass du für jeden Mandanten eine Tabelle "Sozialplansumme" brauchst.
Das musst du dir mal überlegen.

Ich klinke mich hier mal aus.
Einen schönen Sonntag noch.

Gruss Rainer
AW: ES LÄUFT. Vielen Dank.
28.12.2003 16:12:51
Uwe
Hallo Rainer,

vielen Dank für Deine Mühe, Hilfe und Deine Zeit, die
Du mit meinem Problem verbracht hast.

Find ich super klasse von Dir

Ich habe das Problem selbst gefunden und geändert.
ES LÄUFT.... Vielen Dank noch mal.

Diese Ergänzung habe ich vorgenommen:

If summe <> 0 Then wss.Cells(n, d) = summe

Nochmals vielen Dank und einen schönen Sonntag wünsche ich Dir.

Viele Grüße Uwe
Merci :-)) Geschlossen o.T.
28.12.2003 16:16:49
Ramses
...

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige