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



## Reist (24. Februar 2015)

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


----------



## Yaslaw (25. Februar 2015)

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?


----------



## Reist (25. Februar 2015)

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


----------



## Zvoni (25. Februar 2015)

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.


----------



## Reist (25. Februar 2015)

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)


----------



## Reist (25. Februar 2015)

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?


----------



## Yaslaw (25. Februar 2015)

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.

```
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
```


----------



## Reist (25. Februar 2015)

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


----------



## Reist (25. Februar 2015)

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


----------



## Yaslaw (25. Februar 2015)

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.


----------



## Reist (25. Februar 2015)

Das versuche ich eigentlich immer ;-) igrendwann muss man mit sowas auf eigenen Beinen stehen, es ist auch wenn ich ehrlich bin nur der Anfang der schwer Fällt!

Wie gesagt, danke danke!! Wenn mir was fehlt versuche ich natürlich zu aller erst es selbst zu lösen!


----------



## Reist (27. Februar 2015)

So ich dann nochmal mit einer Kleinigkeiten. .

Ich möchte mir in einer MsgBox dir Anzahl aller belegten zellen in Spalte I ausgeben lassen. Ich habs jetzt schon soweit das er mir in der MsgBox die Zahl bis zur letzt belegten Zelle ausgibt, aber er zählt leere Spalten mit.

Mein Code dafür:

Dim ACells as Integer

ACells = Cells (Rows.Count, "I").End (xlUp).Row

MsgBox ACells

Ich weiß es ist nur ne Winzigkeit,  aber ich komm nicht drauf!  Wäre nett wenn mir nochmal jemand helfeb könnte!!

Lg
Lukas


----------



## Yaslaw (27. Februar 2015)

Du zählst damit alle Zeilen bis zur letzten Belegung: ACessl.row


----------



## Reist (27. Februar 2015)

Mhm... das erklärt auf jeden Fall wieso er auch alle leerzellen angibt...

Ich werd nochmal ein bisschen rumprobieren (ich kann mir vorstellen das die Lösung ziemlich aimpel ist...)...


----------



## Yaslaw (27. Februar 2015)

Suchen nach "vba excel count not empty cells"

Erster Treffer bei Swisscows (google is evil...):
http://www.mrexcel.com/forum/excel-...pplications-count-non-blank-cells-column.html


----------



## Reist (27. Februar 2015)

Mhm...liegt wohl daran das ich nur auf deutsch gesucht habe =\... wollte nicht unnötig spamen, danke trotzdem


----------



## Yaslaw (27. Februar 2015)

EIn tipp. Auf english findet man viel mehr Lösungen zum Thema VBA


----------



## Zvoni (27. Februar 2015)

Hat Excel nicht eine Worksheet-Function, die das ausgibt? Also Anzahl nicht-leerer Zellen?
Würde eher in die Richtung suchen, als unnötig selbst etwas zu bauen.


----------



## Reist (27. Februar 2015)

Habs jetzt schon hinbekommen (mit oben geleiateten Hilfestellungen) aber das wäre natürlich auch mal gut zu wissen... gibts generell im Internet einegut aaufgestellte datenbank? Ich hab hatte bisher leider immer nur mehroder weniger zusammengewürfelte Code-Ansammlungen gefunden, die zwar nützlich waren, alles in allem aber nicht wirklich geholfen haben...


----------

