semih55
Goto Top

Werte mit gleicher Auftragsnummer addieren

Hallo Zusammen,

ich habe ein Excel-sheet mit Auftragsnummer, Kunde und Betrag.

Jetzt möchte ich alle Beträge mit gleicher Auftragsnummer addiert haben.

Problem: - Die Beträge sind nicht als eine Zahl definiert, - Im Betrag stehen Tausender mit einem Punkt (z.B. 3.550,50),

Ich habe schon eine Funktion mit der ich den "Punkt" aus dem Betrag entfernen kann:

Public Sub Zeichenloeschung()
Dim i As Long
Dim Start As String
Dim Ende As String
Dim Temp As String
Dim erlaubt As String

erlaubt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890,<> " ' <- hier werden die Zeichen definiert, die erlaubt sind;  
' Groß-/Kleinschreibung wird ignoriert  
Application.ScreenUpdating = False ' Bildschirm-Aktualisierung wird hier deaktiviert;  
' Ansonsten dauert der Vorgang noch ein wenig länger, da er sonst jede Änderung sofort anzeigt  
    For Each C In Selection
        With C
            Temp = ""  
            For i = 1 To Len(.Text)
                If InStr(1, erlaubt, Mid(.Text, i, 1), vbTextCompare) > 0 Then
                    Temp = Temp & Mid(.Text, i, 1)
                End If
            Next i
            .Value = Temp
        End With
        Next C
Application.ScreenUpdating = True ' Jetzt wird die Anzeige wieder aktualisiert  

End Sub

Nun brauche ich noch eine Funktion mit der ich die Beträge addieren kann.
Auch hier habe ich eine Funktion mit der ich experimentierteface-smile

Sub Semih_Formel_fuer_Martina()
QTabelle = "Summary"                                               'Quelltabelle  
QAbZeile = 1                                                             'Überschriftenzeile in Quelltabelle  
QAbSpalte = 2                                                          'Nummer der 1. Datenspalte in Quelltabelle  
QBSpalte = "L"                                                        'Spalte für Betrag in Quelltabelle  

Spalten = 2                                                                'Spaltenanzahl für Vergleich  

ZTabelle = "Details"                                                       'Zieltabelle  
ZAbZeile = 1                                                               'Überschriftenzeile in Zieltabelle  
ZAbSpalte = 1                                                             'Nummer der 1. Datenspalte in Zieltabelle  
ZBSpalte = "D"                                                             'Spalte für Betag in Zieltabelle  

Delim = "§"                                                                   'Trennzeichen - darf in den Daten nicht vorkommen  

Set d = CreateObject("Scripting.Dictionary")                      'Dictionary zum Zwischenspeichern der (konsolidierten) Zeile erzeugen  
QZeile = QAbZeile                                                             'in Überschriftenzeile der Quelltabelle starten  
With Worksheets(QTabelle)
    Do Until .Cells(QZeile, QAbSpalte) = ""                            'Zeilen bearbeiten, bis in erster Spalte kein Wert mehr vorhanden  
        K = ""                                                                        'Schlüssel initialisieren  
        For i = 0 To Spalten - 1                                                 'alle Schlüsselspalten durchgehen  
            K = K & Delim & .Cells(QZeile, QAbSpalte + i)             'Schlüssel zusammensetzen  
        Next
        K = Mid(K, 2)                                                                'erstes Zeichen ist ein Trennzeichen - weglassen  
        Betrag = Val(.Cells(QZeile, QBSpalte))                           'Betrag auslesen  
        If d.Exists(K) Then                                                         'Wenn schon ein Eintrag für diesen Schlüssel vorhanden, ...  
            d.Item(K) = d.Item(K) + Betrag                                      '... Betrag addieren, ...  
        Else
            d.Add K, Betrag                                                            '... ansonsten Eintrag erstellen  
        End If
        QZeile = QZeile + 1                                                           'nächste Zeile der Quelltabelle  
    Loop
End With

T = d.Keys                                                                               'Schlüssel-Texte in Array übernehmen  
B = d.Items                                                                             'Beträge detto  
With Worksheets(ZTabelle)
    .Cells.ClearContents                                                             'Zieltabelle löschen  
    ZZeile = ZAbZeile                                                                   'in Überschriftenzeile der Zieltabelle beginnen  
    For i = 0 To UBound(T)                                                            'alle konsolidierten Einträge durchgehen  
                                                                                                 'Schlüssel-Text wieder in Spalten zerlegen und eintragen  
        .Cells(ZZeile, ZAbSpalte).Resize(1, Spalten) = Split(T(i), Delim)
        .Cells(ZZeile, ZBSpalte) = B(i)                                                 'Betrag(ssumme) eintragen  
        ZZeile = ZZeile + 1                                                                  'nächste Zeile der Zieltabelle  
    Next
End With
End Sub

Die Funktion addiert den Betrag mit gleicher Auftragsnummer der Tabelle1 und fügt quasi einen neuen sheet hinzu mit den bearbeiteten Daten.
Allerdings addiert diese Funktion nur ganze Zahlen (also keine Kommastellen). Dazu müsste ich die Zahl in Double umwandeln aber bekomme ich leider nicht hin.


Ich wäre sehr dankbar, wenn mir jemand helfen könnte.

Content-Key: 248803

Url: https://administrator.de/contentid/248803

Printed on: April 26, 2024 at 20:04 o'clock

Member: colinardo
colinardo Sep 10, 2014 updated at 14:12:21 (UTC)
Goto Top
Hallo semih55, Willkommen auf Administrator.de!
Warum so viel Aufwand wenn's doch so einfach mit einer Formel geht face-smile :
SUMMEWENN(Bereich;Suchkriterien;[Summe_Bereich])
SummeWenn

Lässt sich aber auch in VBA verwenden:
Application.WorksheetFunction.SumIf(Arg1, Arg2, Arg3)
Arg1 Erforderlich Range Bereich – der Zellbereich, der nach Kriterien ausgewertet werden soll. 
Arg2 Erforderlich Variant Kriterien – die Kriterien in Form einer Zahl, eines Ausdrucks oder Texts, mit dem definiert wird, welche Zellen addiert werden. Kriterien können beispielsweise als 32, "32", ">32", oder "Äpfel" angegeben werden. 
Arg3 Optional Variant Summe_Bereich – die tatsächlich zu addierenden Zellen, wenn die entsprechenden Zellen in Bereich auf Kriterien zutreffen. Wenn Summe_Bereich ausgelassen wird, werden die Zellen im Bereich sowohl nach Kriterien ausgewertet als auch addiert, sofern sie Kriterien entsprechen. 
Grüße Uwe
Member: Semih55
Semih55 Sep 10, 2014 at 14:13:49 (UTC)
Goto Top
Ich wollte eine Funktion mit der ich durch einen Klick das Ergebnis habe (über Symbole-Schnellzugriff --> Makro hinzufügen).

Über eine Formel habe ich das auch zum laufen gebracht: =WENN(ZÄHLENWENN($B$2:B29;B29)>1;"";SUMMENPRODUKT(($B$2:$B$427=B29)*($L$2:$L$427)))

Allerdings weiß ich nicht wie ich das automatisieren kann.

Also dass man nicht immer die Formel kopieren muss und "runter ziehen" damit es für alle Zellen macht.
Member: LianenSchwinger
LianenSchwinger Sep 10, 2014 at 14:17:26 (UTC)
Goto Top
Hallo semih55,

und wenn Dein Betrag als Zeichenkette eingetragen ist kann man diesen einfach mit z.B. =WERT(A1) in eine Zahl umwandeln.

G Jörg
Member: colinardo
Solution colinardo Sep 10, 2014 updated at 14:37:57 (UTC)
Goto Top
Und wenn es unbedingt ein Makro sein muss, habe ich hier schon mal ein Makro zum selben Thema gespostet:
Werte aus einer Tabelle vergleichen, einlesen und addieren
und für die Umwandlung in eine Zahl kannst du bspw. CDbl("1.200,30") nutzen.
Member: Semih55
Semih55 Sep 10, 2014 at 14:34:35 (UTC)
Goto Top
Vielen Dank schonmal für deine Hilfe.
Ich habe deinen Makro getestet. Die funktioniert im Prinzip genauso wie meine allerdings mit dem selben "Fehler".
Wenn ich Komma-zahlen addiere dann rechnet deine Funktion ohne die Nachkommastellen.

Wie müsste ich deine Funktion umschreiben damit er auch die Nachkommastellen rechnet??
Member: colinardo
colinardo Sep 10, 2014 updated at 14:40:11 (UTC)
Goto Top
einfach wie geschrieben in Double umwandeln:
in meinem Sheet folgende Zeile so umgeschrieben
cell.Offset(0, 3).Value = CDbl(cell.Offset(0, 3).Value) + CDbl(c.Offset(0, 6).Value)
Member: Semih55
Semih55 Sep 10, 2014 updated at 14:53:40 (UTC)
Goto Top
 
Sub Semih_Formel_fuer_Martina()
QTabelle = "Summary"                                                                                  
QAbZeile = 1                                                                                        
QAbSpalte = 2                                                                                       
QBSpalte = "L"                                                                                       

Spalten = 2                                                                                         

ZTabelle = "Details"                                                                                
ZAbZeile = 1                                                                                        
ZAbSpalte = 1                                                                                      
ZBSpalte = "D"                                                                                       

Delim = "§"                                                                                           

Set d = CreateObject("Scripting.Dictionary")                                                         
QZeile = QAbZeile                                                                                   
With Worksheets(QTabelle)
    Do Until .Cells(QZeile, QAbSpalte) = ""                                                          
        K = ""                                                                                       
        For i = 0 To Spalten - 1                                                                  
            K = K & Delim & .Cells(QZeile, QAbSpalte + i)                                      
        Next
        K = Mid(K, 2)                                                                              
        Betrag = Val(.Cells(QZeile, QBSpalte))                                                    
        If d.Exists(K) Then                                                                         
            d.Item(K) = CDbl(d.Item(K)) + CDbl(Betrag)                                               
        Else
            d.Add K, Betrag                                                                       
        End If
        QZeile = QZeile + 1                                                                   
    Loop
End With

T = d.Keys                                                                                        
B = d.Items                                                                                        
With Worksheets(ZTabelle)
    .Cells.ClearContents                                                                           
    ZZeile = ZAbZeile                                                                              
    For i = 0 To UBound(T)                                                                        
                                                                                                   
        .Cells(ZZeile, ZAbSpalte).Resize(1, Spalten) = Split(T(i), Delim)
        .Cells(ZZeile, ZBSpalte) = B(i)                                                             
        ZZeile = ZZeile + 1                                                                       
    Next
End With
End Sub

Ich bekomme es einfach nicht hin:/

Ich habe jetzt bei meiner Funktion versucht "CDbl" einzufügen: d.Item(K) = CDbl(d.Item(K)) + CDbl(Betrag)
Aber er rechnet trotzdem nicht die Nachkommastellen.

Könntest du mit bitte für meine konkrete Funktion weiterhelfen?
Member: colinardo
colinardo Sep 11, 2014 updated at 09:16:33 (UTC)
Goto Top
Könntest du mit bitte für meine konkrete Funktion weiterhelfen?
Ich arbeite schon lange mit Excel, aber so umständlich hab ich's schon lange nicht mehr erlebt face-wink aber egal jedem das seine.

Dieser Abschnitt sollte so aussehen: (dort hattest du die Funktion VAL() verwendet, die den Betrag immer in einen Integer-Wert ohne Nachkomma gewandelt hat!
...
        Betrag = CDbl(.Cells(QZeile, QBSpalte).Value)
        If d.Exists(K) Then
            d.Item(K) = CDbl(d.Item(K)) + Betrag
        Else
....
Dann klappts auch mit den "Mäusen" nach dem Komma face-smile

Grüße Uwe

p.s. gewöhne dir mal an, die Variablen und deren Variablen-Typen (string/integer/double) vor der Verwendung entsprechend zu deklarieren, dann kommt es nicht zu solchen Effekten.