Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Summierung durch Makro mit 2 Bedingungen





Frage

Hallo Leute, ich erarbeite ein Makro, dass mir zeigt wieviel von welchen Material (Bedingung 1) in welcher Produktionsstufe (Bedingung 2) verwendet wird. Die Bedingung 2 habe ich hinbekommen und sieht wie folgt aus: 'Schrauben With Worksheets("Zusammenfassung") For inSpalte = 2 To Columns.Count For inZaehler = 2 To Worksheets.Count On Error Resume Next doSumme = doSumme + Application.WorksheetFunction.HLookup(.Cells(1, inSpalte), _ Worksheets(inZaehler).Range("a1:f6"), 14) Next inZaehler Cells(2, inSpalte) = doSumme doSumme = 0 Next inSpalte End With Das funktioniert solange wie die Reihenfolge der Materialien gleich bleibt. Leider ist das aber nicht der Fall. Deshalb brauche ich noch Bedingung 1 (welches Material). Bedingung 1 (mit dem Zeilenwert 14) bekomme ich aber leider nicht als Variable hin. Deshalb wende ich mich an Euch. Könnt Ihr mir bitte helfen. Gruß Peter Von Rode

Antwort 1 von Beverly

Hi Peter,

deine Matrix ist falsch deklariert

 Worksheets(inZaehler).Range("a1:f6"), 14)


Der Bereich geht von Zeile1 bis Zeile6, du suchst aber in Zeile14.

Bis später,
Karin

Antwort 2 von Peter3011

Hallo Karin,

sorry erst mal, dass ich mich so spät melde. Ich war unterwegs.

Genau diese 14 soll variabel sein.

Erläuterung:

Das Makro summiert die Werte in einem Summenblatt. Die Werte hierfür kommen aus einzelnen Blättern, die alle verschiedene Produkte darstellen und folglicherweise alle auch unterschiedliche Materialien benötigen.

Demnach sind in dem Summenblatt alle Materialien aufgelistet, während in den Produktblättern nur die Materialien vorkommen, die auch für die Herstellung des Produktes gebraucht werden.

Daraus ergibt sich das Problem, dass z. B. die 9mm Schraube zwar im Summenblatt in Zeile 14 der Matrix vorkommt, aber dieser Wert nicht zwangsläufig für Produkt 1 gelten muss, da hier bspw. viel weniger Materialien benötigt werden.

Deshalb muss diese 14 als Variable im Summenblatt in der Zelle links neben ihr die Bezeichnung erkennen und diese dann in den einzelnen Produktblättern suchen.

Dieses Problem habe ich bisher über einen Index mit Spalten- und Zeilenvariablen gelöst, indem ich Vergleichsfunktionen für die Spalten und Zeilen eingesetzt habe.

Bei sich ändernder Blattzahl ist das allerdings nicht mehr möglich.

Ich habe zwar für diese 14 eine worksheetfunction (hlookup) eingesetzt, aber leider hat dass nicht funktioniert.

Kann man hier keine Datei anhängen, damit das Problem noch visuell erläutert wird?

Wenn Dir dazu ein Kniff einfällt, wäre das toll.

Gruß

Peter3011

Antwort 3 von Beverly

Hi Peter,

unter dieser Adresse http://uploadagent.de/ kannst du eine Datei für 100 Tage kostenlos hochladen.

Bis später,
Karin

Antwort 4 von Peter3011

Aha,

danke, wieder was gelernt.

Die Datei liegt unter dem folgenden Pfad:

http://www.uploadagent.de/files/1178642278/Test.xls

Ich glaube, dass das Problem nun besser zu verstehen.

Bin leider nicht der Weltmeister im erklären.

Danke für Dein Engagement für mich.

Gruß

Peter3011

Antwort 5 von Beverly

Hi Peter,

ich hoffe, dass ich das Problem richtig verstanden habe. Versuche es einmal mit diesem Code

Sub neu()
    Dim wsTabelle As Worksheet
    Dim raZelle As Range
    Dim inZeile As Integer
    Dim inSpalte As Integer
    For inSpalte = 2 To 6
        For inZeile = 2 To 6
            For Each wsTabelle In ThisWorkbook.Worksheets
                If wsTabelle.Name <> "Zusammenfassung" Then
                    Set raZelle = wsTabelle.Range("A1:F6").Find(Worksheets("Zusammenfassung").Cells(inZeile, 1), lookat:=xlPart)
                    If Not raZelle Is Nothing Then
                        doSumme = doSumme + wsTabelle.Cells(raZelle.Row, inSpalte)
                    End If
                End If
            Next wsTabelle
            Worksheets("Zusammenfassung").Cells(inZeile, inSpalte) = doSumme
            doSumme = 0
            Set raZelle = Nothing
        Next inZeile
    Next inSpalte
End Sub


Bis später,
Karin

Antwort 6 von Beverly

Hi Peter,

mir ist gerade aufgefallen, dass sich da eine kleine Ungenauigkeit eingeschlichen hat, die zwar in deiner Arbeitsmappe keinen Einfluss hat, aber vielleicht bei einem User, der den Code für seine Belange anpassen möchte: ändere den Codeteil lookat:=xlPart in lookat:=xlWhole. Mit xlPart wird nur nach einer Teilübereinstimmung gesucht, mit xlWhole dagegen nach einer Komplettübereinstimmung.

Bis später,
Karin

Antwort 7 von Peter3011

Hallo Karin,

aahhh ssssooooorrrrryyy!!!!!!

Meine Beispieldatei hat eine Winzigkeit nicht betrachtet. Unsere Produktionsstufen beginnen nicht alle bei PS 1. Das liegt daran, dass wir die Produktionsstufen unserer Zulieferer mit berücksichtigen. Also wenn ein Zulieferei ein Produkt mit 8 Produktionsstufen fertigt, dann geht es bei und bei PS 9 weiter. Das machen wir deshalb, um unternehmensübergreifend ein Kostencontrolling zu gewährleisten und das Produkt effizienter optimieren zu können.

Diesen Umstand habe ich in der neuen Datei noch nachträglich dargestellt.

http://www.uploadagent.de/files/1178736541/Test 20070509.xls

Jedenfalls kann ich mit dem folgenden Makro die Produktionsstufe berücksichtigen:

With Worksheets("Zusammenfassung")
For inSpalte = 2 To Columns.Count
For inZaehler = 2 To Worksheets.Count
On Error Resume Next
doSumme = doSumme + Application.WorksheetFunction.HLookup(.Cells(1, inSpalte), _
Worksheets(inZaehler).Range("a1:f6"), 14)
Next inZaehler
Cells(2, inSpalte) = doSumme
doSumme = 0
Next inSpalte
End With

und mit Deinem Makro kann ich das entsprechende Material berücksichtigen. Dieses Makro steht auch für die fette 14.

Diese Makros müssen also zusammengeführt werden, damit in Abhängigkeit vom Material und der Produktionsstufe addiert wird.

Mein einfaches Gemüt hat sich deshalb folgende Lösung überlegt:

Sub neu()

Dim wsTabelle As Worksheet
Dim raZelle As Range
Dim inZeile As Integer
Dim inSpalte As Integer

For inSpalte = 2 To 6
For inZeile = 2 To 6
For Each wsTabelle In ThisWorkbook.Worksheets
If wsTabelle.Name <> "Zusammenfassung" Then
Set raZelle = wsTabelle.Range("A1:F6").Find(Worksheets("Zusammenfassung") _
.Cells(inZeile, 1), lookat:=xlWhole)
If Not raZelle Is Nothing Then
doSumme = doSumme + Application.WorksheetFunction.HLookup(.Cells(1, inSpalte), _
Worksheets(inZaehler).Range("a1:f6"), wsTabelle.Cells(raZelle.Row, inSpalte))
End If
End If
Next wsTabelle
Worksheets("Zusammenfassung").Cells(inZeile, inSpalte) = doSumme
doSumme = 0
Set raZelle = Nothing
Next inZeile
Next inSpalte

End Sub

Leider funktioniert das nicht, irgendetwas mit der Zelle HLookup nicht mehr stimmt. Keine Ahnung wieso.

Kannst Du mir bitte noch mal helfen.

Gruß

Peter3011

Antwort 8 von Beverly

Hi Peter,

ganz klar ist mir nicht, was du machen willst. Ich versuche mal, es so darzulegen, wie ich es verstanden habe:

1. die Anzahl in der Zusammenstellungsliste kann unterschiedlich sein, je nachdem was die maximale PS-Nummer (in allen Produktetabellen zusammen genommen) ist
2. die Anzahl der PS je Produkt ist immer gleich (also in jeder Produktetabelle 5), nur die SP-Nummern können sich unterscheiden
3. es soll die Summe für jede SP-Nummer gebildet werden, unabhängig davon, in welcher Spalte der Produktetabellen die SP-Nummer steht.

Ehe ich weiter mache, muss ich schon genau wissen, was das Ergebnis sein soll. Ich kenne mich ja mit eurem Prduktionsprozess nicht aus und das, was dir selbstverständlich erscheint, ist für mich ein "Buch mit 7 Siegeln" ;-).

Bis später,
Karin

Antwort 9 von Peter3011

Hallo Karin,

bitte, bitte nimm mir zunächst ab, dass ich Dich nicht überstrapazieren will.

Die Produktionsstufen müssen nicht bei PS 1 beginnen, sondern können auch bei PS>1 beginnen (das ist immer der Fall). Demnach muss im Blatt "Zusammenfassung" die kleinste Produktionsstufe ermittelt werden (Makro habe ich hierfür), die dann in Zelle B1 geschrieben wird (für das Maximum gehe ich eh über alle 255 verbleibenden Spalten, das mache ich mit ner Formel).

Die Produktionsstufen der Produkte sind alle unterschiedlich lang (Produkt 1 hat 13 Stufen und Produkt 7 136 Stufen).

Die Sortierung der Materialien im Blatt "Zusammenfassung" ist nicht die selbe, wie bei den Blättern der einzelnen Produkte (z. B. in Zusammenfassung Schrauben, Reifen, Lenkrad und in Produkt 1Schrauben, Blech, Reifen).

Für jede Stufe soll die Summe des Materialbedarfs über alle Produkte an Schrauben, Blech etc. ermittelt werden.

Das Makro, was Du mir geschickt hast, addiert richtigerweise nur Schrauben und nur Reifen usw..

Das ist absolut i. O.


Aber zusätzlich sollen nur Schrauben addiert werden, die in der selben Produktionsstufe benötigt werden. Z. B. Produkt 1 und 2 benötigen in der PS 4 insgesamt 119 Schrauben 76 in Produkt 1 und 43 in Produkt 2.

Ich glaube, dass es das ganz gut trifft.

Ich weiß nicht, wie ich Dir für Deine Geduld und Hilfsbereitschaft nur danken kann.

Woher hast Du eigentlich dieses ganze VBA Wissen (war auf Deiner Homepage, is ja Hammer)?

Gruß

Peter3011

Antwort 10 von Beverly

Hi Peter,

Zitat:
Aber zusätzlich sollen nur Schrauben addiert werden, die in der selben Produktionsstufe benötigt werden.


Demnach sollen 2 Auswertungen gemacht werden? Oder sehe ich das falsch? Und wo soll das 2. Ergebnis eingetragen werden? Hier mal der Code für den Teil 2, wie ich es aus deiner Beschreibung interpretiert habe. Eingetragen wird in Tabelle "Zusammenfassung"

Sub gesamt_je_ps()
    Dim wsTabelle As Worksheet
    Dim raZelle As Range
    Dim raZelle2 As Range
    Dim inZeile As Integer
    Dim inSpalte As Integer
    Application.ScreenUpdating = False
    With Worksheets("Zusammenfassung")
        For inSpalte = 2 To IIf(IsEmpty(.Cells(1, Columns.Count)), Cells(1, .Columns.Count).End(xlToLeft).Column, .Columns.Count)
            For inZeile = 2 To 6
                For Each wsTabelle In ThisWorkbook.Worksheets
                    If wsTabelle.Name <> "Zusammenfassung" Then
                        Set raZelle = wsTabelle.Range("A1:F6").Find(.Cells(inZeile, 1), lookat:=xlWhole)
                        If Not raZelle Is Nothing Then
                            Set raZelle2 = wsTabelle.Range("B1:F1").Find("PS " & Mid(.Cells(1, inSpalte), InStr(.Cells(1, inSpalte), " ") + 1), lookat:=xlWhole)
                            If Not raZelle2 Is Nothing Then
                                doSumme = doSumme + wsTabelle.Cells(raZelle.Row, raZelle2.Column)
                            End If
                        End If
                    End If
                Next wsTabelle
                .Cells(inZeile, inSpalte) = doSumme
                doSumme = 0
                Set raZelle = Nothing
                Set raZelle2 = Nothing
            Next inZeile
        Next inSpalte
    End With
    Application.ScreenUpdating = True
End Sub


Programmieren ist mein Hobby und ich bin da auch vollkommener Autodidakt. Bevor ich vor knapp 2 Jahren so richtig intensiv mit Excel begonnen habe, hatte ich allerdings schon mehr als 20 Jahre Erfahrung mit dBASE (allerdings auch nur als Hobby). Aus heutiger Sicht muss ich sagen: schade, dass es damals die Foren noch nicht gab - ich hätte mir manchen Umweg und Fehler ersparen können. Deshalb helfe ich jetzt anderen, damit sie es besser haben. Das, was ich über Excel weiß, habe ich zum überwiegenden Teil aus den Foren. Wenn man andere User bei der Lösung ihrer Probleme unterstützt, lernt man selbst sehr viel, weil man sich mit Dingen auseinandersetzen muss, von denen man teilweise nicht einmal geahnt hat, dass sie existieren.

Bis später,
Karin

Antwort 11 von Peter3011

Guten Abend Karin,

sorry mein fleißiges Bienchen.

War heute full house bei uns Betrieb. Deshalb melde ich mich auch erst jetzt.

Ich habe noch einmal eine Datei unter diesem Pfad hochgeladen.

http://www.uploadagent.de/files/1178911573/Test 20070511.xls

Da kannst Du in Zelle B4 sehen, wie ich bisher bisher mein Problem gelöst habe.

Es handelt sich hier um einen Index, dem ich in die Spalten und Zeilen Vergleichsfunktionen eingebaut haben (das siehst Du alles in der Bearbeitungsleiste).

Für jedes Blatt (Produkt 1 usw.) steht so ein Index, um die Summe in der Zusammenfassung bilden zu können.

Die Schwierigkeit besteht nun darin, dass die Anzahl der Produkte (und damit der Blätter) variiert, so dass das mit den Indexen nicht so das Wahre ist (zeigt dann NV# an).

Das Makro muss also irgendwie so arbeiten, dass das gleiche Ergebnis rauskommt, wie bei den Index aus Zelle B4 und dabei das Blatt Zusammenfassung ausfüllen.

Zelle B4 ist der Schlüssel denke ich.

Jetzt aber ab zu Kind und Kegel und mach nicht mehr so lang.

Schönes WE.

Gruß

Peter3011

Antwort 12 von Beverly

Hi Peter,

ich habe meinen Code nicht in deiner Arbeitsmappe gefunden, deshalb muss ich annehmen, dass du ihn nicht getestet hast.

Gemessen an deiner Beschreibung in deiner hochgeladenen Arbeitsmappe macht mein Code genau das, was du mit der Formel in B4 erreichen willst (die übrigens #NV anzeigt, sodass ich nicht prüfen kann, welcher Wert drinstehen müsste). Ich habe zum besseren Verständnis für dich einige Kommentare in den Code geschreiben. Es wird folgendes berücksichtigt:

1. es wird das gesamze Blatt Zusammenfassung von Spalte B bis zur letzten Spalte und von Zeile 2 bis Zeile 6 ausgefüllt

2. es werden alle Tabellen der Arbeitsmappe durchlaufen, gleichgültig wie viele enthalten sind, die Anzahl der Produkte (Tabellen) kann also unterschiedlich sein

3. es wird summert für jedes Teil in A2:A6 der Tabelle "Zusammenfassung" (also für jede Zeile) für jede Produktstufe (also für jede Spalte)

Link zur Datei

Bis später,
Karin

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: