Alle Tabellenblätter auslesen, Werte für Suchkreterium bestimmen und summiert ausgeben

Reist

Grünschnabel
Hallo zusammen und entschuldigt bitte den wirren Namen dieses Themas aber ich wusste es einfach nicht besser zu bennen.

Generell entschuldige ich mich falls im Nachfolgenden noch einige essentielle infos fehlen, dies ist mein erster Post und ich hab ehrlich gesagt keine Ahnung was ich zur Lösung des Problems brauche, bzw was ihr braucht!

Das Problem:

Ich habe eine Tabelle mit mehreren Tabellenblättern. Aktuell 18, es können aber stetig mehr werden.
In allen Tabellen sind Namen wie z.B.: Äpfel, Birnen, Bananen usw. aufgeführt und es sind ihnen von Tabellenblatt zu Tabellenblatt unterschiedliche Werte zugeordnet.

Ich möchte gerne ein Makro erstellen, das die Werte aus allen anderen Tabellenblättern ausließt und sie in Tabelle 1 summiert wiedergibt.
Also sagen wir mal wenn in Tabelle 1 für Apfel ein Wert von 20 steht und in Tabelle 3 ein Wert von 100 dann soll mir in Tabelle 1 für Apfel 120 ausgegeben werden.

Das ganze ist deswegen leider nicht so einfach(Für mich) weil die Namen an unterschiedlichen(nicht vorhersehbaren) Stellen in den Blättern auftrauchen können und manchmal sogar doppelt geführt werden.

Ich habe relativ schnell aufgegeben es mit einfachen Formeln zu versuchen und hatte mich bereits an eine VBA Variante ran gemacht, aber daraus wurde nichts weil mir schlichtweg das Know how und die Funktionsbezeichnungen fehlen. Ich bin zwar dabei mich in Fachliteratur einzulesen, aber ich glaube alleine schaffe ich das nicht sonderlich schnell. Daher bitte ich um eure Hilfe.

Sollte eine Wichtige info fehlen, werde ich sie natürlich sofort ergänzen!

LG und Danke im Voraus
Lukas
 
Dann versuchen wr doch mal zu helfen, dass du alle deine Äpfel und Birnen findes...

Ich hab da noch 2 Fagen
1) Hast du in der Tabelle 1 irgendwo drin, was du suchst? Also dass du Äpfel und Birnen zählen möchtest?
2) Die Bezeichnung Birne kann also irgendwo in der Tabelle stehen. Kann man mindestens davon ausgehen, dass wenn er 'Birne' in dem Feld D34 findet, dass dann der Wert daneben steht, also in E34?
 
Hi,

Um deine Fragen kurz zu beantworten ja und ja ;-)

In Tabelle 1 Werden alle Namen in Spalte A aufgeführt und die Summen sollen in Spalte E auftauchen. Die Suchkreterien sind somit permanent vorhanden.
Die Werte die den einzelnen Namen zugeordnet sind stehen wie du richtig vermutet hast neben den namen, aber nicht unmittelbar.
Die Namen tauchen in den anderen Tabellen wieder in Spalte A auf und fie dazugehörigen Werte werden in Spalte E aufgeführt.
Somit gehört Spalte A1 zu E1.

Danke das du dich meinem Problen annimmst!!

LG
Lukas
 
Klingt für mich nach einem Teilergebnis (Pro Tabellenblatt und Name) in Zusammenhang mit Summe (in der Mastertabelle).

Als VBA-Makro ist es relativ einfach (und da sogar mit zu berücksichtigen, dass dynamisch immer mehr Tabellenblätter hinzukommen können),
jedoch sollte dir klar sein, dass die Makro-Lösung mit steigendem Datenbestand immer langsamer wird.
 
Mhm, irgendwie empfinde ich das als nicht ganz so einfach =D was aber wahrscheinlich daran liegt das ich mit der Materie des VBA programmierens erst wenig Berührung hatte.

Das mit der abnehmenden Geschwindigkeit solte vorerst kein Problem sein denke ich, ich nehme mal an das er bei 30-40 Tabellenblättern immernoch annehmbare schnell sein wird... oder liege ich da falsch? (Der pc hat auch eine ganz ordentliche grundleistung)
 
Mal eine Frage nebenbei, da ich mich (jetzt wo ich dmit konfrontiert bin) doch recht für vba interessiere, kann mir da jemand eine gute Lektüre empfehlen?
 
So auf die Schnelle
Erstelle ein neues Modul und kopiere den Code hinein.
Dann kannst du das Makro calc() aufrufen....

Kommentare sind im Code. Es lohnt sich ev. im Internet noch kurz über das Objekt 'Dictionary' schlau zu machen, das ich verwende. Ist mMn die mächtigste Liste, die man in VBA verwenden kann.
Visual Basic:
Option Explicit

Const C_NAME_COLUMN = "A"       'Spalte mit den Namen
Const C_VALUE_COLUMN = "E"      'Spalte mit den Werten

Public Sub calc()
    Dim ws          As Worksheet    'Referenz auf ein Worksheet
    Dim map         As Object       'Ein Dictionary
    Dim sheetNr     As Long         'Nummer des aktuellen Sheets
    Dim name        As String       'Wert der Spalte A
    Dim value       As Variant      'Wert der Spalte E
    Dim rowNr       As Long         'aktuelle Zeilennummer
    
    'Map erstellen
    Set map = CreateObject("scripting.Dictionary")
    
    Set ws = Worksheets(1)      'Das Ziel-Sheet auswählen
    
    'Alle Namen ermitteln und eine Referenz auf die Zielzelle speichern
    'Dictionary(Name => Zielzelle)
    'Alle in Spalte A belegten Zeilen durchgehen.
    'Für 'ws.Range(C_NAME_COLUMN & Rows.Count).End(xlUp).Row' siehe http://www.globaliconnect.com/excel/index.php?option=com_content&view=article&id=86:last-used-row-last-used-column-vba&catid=79&Itemid=475
    For rowNr = 2 To ws.Range(C_NAME_COLUMN & Rows.Count).End(xlUp).Row
        name = ws.Range(C_NAME_COLUMN & rowNr).value            'Name aus der Spalte A ermitteln
        If Not name = Empty Then                                'Prüfen, ob ein Name vorhanden ist
            If Not map.exists(name) Then                        'Prüfen ob wir den Namen bereits im Map als Key haben
                map.Add name, ws.Range(C_VALUE_COLUMN & rowNr)  'Der Map einen Eitrag hinzufügen: Key=Name, Value = Referenz auf die Zeilzelle
                map(name).value = Empty                         'Den Wert zurücksetzen um vorherige Berechnungen zu beseitigen
            End If
        End If
    Next rowNr
    
    'Alle Restlichen Worksheets durchgehen
    For sheetNr = 2 To Worksheets.Count
        Set ws = Worksheets(sheetNr)
        'Alle Zellen der Spalte A durchgehen
        For rowNr = 1 To ws.Range(C_NAME_COLUMN & Rows.Count).End(xlUp).Row
            name = ws.Range(C_NAME_COLUMN & rowNr).value        'Name aus Spalte A ermitteln
            value = ws.Range(C_VALUE_COLUMN & rowNr).value      'Value aus Spalte B ermitteln
            If map.exists(name) And IsNumeric(value) Then       'Prüfen ob der Name im der Map vorhanden ist und ob der Value eine Zahl ist
                map(name).value = map(name).value + value       'Den Wert der Zielzelle um den value erhöhen
            End If
        Next rowNr
    Next sheetNr
    
    'Aufräumen
    Set map = Nothing
    Set ws = Nothing
End Sub
 
Zuletzt bearbeitet:
Ich bedanke mivh schonmal im voraus, doch leider kann ich nicht sagen ob ich es heute noch testen kann...

Sibald ich es testen konnte melde ivh mich nochmal!!

LG
Lukas
 
Also ich konnte es jetzt Testen und es funktioniert einwandfrei!!! Wirklich super! Du hast mir damit eine menge Zeit und aufwand erspart!!!

Wenn nochmal was sein sollte melde ich mich nochmal! Aber bis dahin noch einmal tausenddank!!

LG
Lukas
 
An deiner Stelle würde ich versuchen zu Verstehen was da im Code vor sich geht.
Die Kommentare sollten dabei helfen. Wenn trotzdem etwas nicht klar ist, frag einfach.
 
Zurück