Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Zeilen vergleichen und bestimmte Spalte addieren

Frage Entwicklung VB for Applications

Mitglied: linBid23

linBid23 (Level 1) - Jetzt verbinden

01.03.2011 um 15:51 Uhr, 6853 Aufrufe, 6 Kommentare

Hallo Zusammen.

Ich bin Anfänger in VBA, habe keine Ahnung wie ich mein problem lösen soll.

Ich habe eine Tabelle mit unterschiedlichen Zeilen. Insgesamt habe ich über 4000 Zeilen zu vergleichen

Jetzt möchte ich die Zeilen miteinander vergleichen und zwar bestimmte Spalten.
In Tabelle1 nehme ich die erste Zeile und vergleiche ihre Spalten mit den Spalten aller vorhandenen Zeilen.
Wenn die Spalten A, B, C und D von Zeile1 gleich sind mit den Spalten aller Zeilen, dann nehme ich die Spalte "Beitrag" von den betroffenen Zeilen, addiere sie zusammen, mache eine neue Zeile daraus und speichere die Zeile in Tabelle2.
Wenn eine Zeile nicht doppelt vorkommt wird sie unverändert in Tabelle2 kopiert.

Die Bilder zeigen wie die Tabelle2 aussehen sollte.


Tabelle1:
1ce9a6114b5a7e294bafa4af89239991 - Klicke auf das Bild, um es zu vergrößern

Tabelle2:
ce6fcb4cd2a58e8f925ef1f469a503dc - Klicke auf das Bild, um es zu vergrößern


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




Gruß
Christian
Mitglied: bastla
01.03.2011 um 17:14 Uhr
Hallo linBid23 und willkommen im Forum!

Mit einer Ausnahme (die Spalte "Eintragsdatum" in der Tabelle2 ist - insbesondere, wenn mehrere Zeilen zusammengefasst wurden - eigentlich nicht sinnvoll und wird daher nicht befüllt) sollte das folgende Script Deine Anforderung erfüllen:
01.
Sub Konsolidieren() 
02.
QTabelle = "Tabelle1"   'Quelltabelle 
03.
QAbZeile = 1            'Überschriftenzeile in Quelltabelle 
04.
QAbSpalte = 1           'Nummer der 1. Datenspalte in Quelltabelle 
05.
QBSpalte = "F"          'Spalte für Betrag in Quelltabelle 
06.
 
07.
Spalten = 4             'Spaltenanzahl für Vergleich 
08.
 
09.
ZTabelle = "Tabelle2"   'Zieltabelle 
10.
ZAbZeile = 1            'Überschriftenzeile in Zieltabelle 
11.
ZAbSpalte = 1           'Nummer der 1. Datenspalte in Zieltabelle 
12.
ZBSpalte = "F"          'Spalte für Betag in Zieltabelle 
13.
 
14.
Delim = "§"             'Trennzeichen - darf in den Daten nicht vorkommen 
15.
 
16.
Set d = CreateObject("Scripting.Dictionary") 'Dictionary zum Zwischenspeichern der (konsolidierten) Zeile erzeugen 
17.
QZeile = QAbZeile 'in Überschriftenzeile der Quelltabelle starten 
18.
With Worksheets(QTabelle) 
19.
    Do Until .Cells(QZeile, QAbSpalte) = "" 'Zeilen bearbeiten, bis in erster Spalte kein Wert mehr vorhanden 
20.
        K = "" 'Schlüssel initialisieren 
21.
        For i = 0 To Spalten - 1 'alle Schlüsselspalten durchgehen 
22.
            K = K & Delim & .Cells(QZeile, QAbSpalte + i) 'Schlüssel zusammensetzen 
23.
        Next 
24.
        K = Mid(K, 2) 'erstes Zeichen ist ein Trennzeichen - weglassen 
25.
        Betrag = .Cells(QZeile, QBSpalte) 'Betrag auslesen 
26.
        If d.Exists(K) Then 'Wenn schon ein Eintrag für diesen Schlüssel vorhanden, ... 
27.
            d.Item(K) = d.Item(K) + Betrag '... Betrag addieren, ... 
28.
        Else 
29.
            d.Add K, Betrag '... ansonsten Eintrag erstellen 
30.
        End If 
31.
        QZeile = QZeile + 1 'nächste Zeile der Quelltabelle 
32.
    Loop 
33.
End With 
34.
 
35.
T = d.Keys 'Schlüssel-Texte in Array übernehmen 
36.
B = d.Items 'Beträge detto 
37.
With Worksheets(ZTabelle) 
38.
    .Cells.ClearContents 'Zieltabelle löschen 
39.
    ZZeile = ZAbZeile 'in Überschriftenzeile der Zieltabelle beginnen 
40.
    For i = 0 To UBound(T) 'alle konsolidierten Einträge durchgehen 
41.
        'Schlüssel-Text wieder in Spalten zerlegen und eintragen 
42.
        .Cells(ZZeile, ZAbSpalte).Resize(1, Spalten) = Split(T(i), Delim) 
43.
        .Cells(ZZeile, ZBSpalte) = B(i) 'Betrag(ssumme) eintragen 
44.
        ZZeile = ZZeile + 1 'nächste Zeile der Zieltabelle 
45.
    Next 
46.
End With 
47.
End Sub
Um die Formatierungen (zB der Überschriftenzeile) in der Zieltabellemusst Du Dich selbst kümmern - allerdings werden diese, anders als die Zellinhalte, durch das Script nicht gelöscht ...

Grüße
bastla
Bitte warten ..
Mitglied: linBid23
01.03.2011 um 18:24 Uhr
Danke bastla.

Vielen Dank für die schnelle Antwort.

Das klappt wunderbar.
Allerdings muss die Spalte "Eintragsdatum" der ersten Zeile als Datum für die neue Zeile genommen werden.
Ich versuche es anzupassen und poste mein Ergebnis.


Danke nochmal.
Bitte warten ..
Mitglied: bastla
01.03.2011 um 18:41 Uhr
Hallo linBid23!

Ich möchte Dich ja nicht von Deinen Anpassungsversuchen abhalten, aber wenn Du wirklich Anfänger bist, könnte das etwas dauern ...

Bei Bedarf kannst Du zwischenzeitlich auf diesen Ansatz zurückgreifen:
01.
Sub Konsolidieren() 
02.
QTabelle = "Tabelle1"   'Quelltabelle 
03.
QAbZeile = 1            'Überschriftenzeile in Quelltabelle 
04.
QAbSpalte = 1           'Nummer der 1. Datenspalte in Quelltabelle 
05.
QDatumSpalte = "E"      'Spalte für Eintragsdatum in Quelldatei 
06.
QBSpalte = "F"          'Spalte für Betrag in Quelltabelle 
07.
Spalten = 4             'Spaltenanzahl für Vergleich 
08.
ZTabelle = "Tabelle2"   'Zieltabelle 
09.
ZAbZeile = 1            'Überschriftenzeile in Zieltabelle 
10.
ZAbSpalte = 1           'Nummer der 1. Datenspalte in Zieltabelle 
11.
ZDatumSpalte = "E"      'Spalte für Eintragsdatum in Zieldatei 
12.
ZBSpalte = "F"          'Spalte für Betag in Zieltabelle 
13.
 
14.
Delim = "§"             'Trennzeichen - darf in den Daten nicht vorkommen 
15.
 
16.
Set d = CreateObject("Scripting.Dictionary") 
17.
QZeile = QAbZeile 'in Überschriftenzeile der Quelltabelle starten 
18.
With Worksheets(QTabelle) 
19.
    Do Until .Cells(QZeile, QAbSpalte) = "" 'Zeilen bearbeiten, bis in erster Spalte kein Wert mehr vorhanden 
20.
        K = "" 'Schlüssel initialisieren 
21.
        For i = 0 To Spalten - 1 'alle Schlüsselspalten durchgehen 
22.
            K = K & Delim & .Cells(QZeile, QAbSpalte + i) 'Schlüssel zusammensetzen 
23.
        Next 
24.
        K = Mid(K, 2) 'erstes Zeichen ist ein Trennzeichen - weglassen 
25.
        EinDat = .Cells(QZeile, QDatumSpalte) 'Eintragsdatum auslesen 
26.
        Betrag = .Cells(QZeile, QBSpalte) 'Betrag auslesen 
27.
        If d.Exists(K) Then 'Wenn schon ein Eintrag für diesen Schlüssel vorhanden, ... 
28.
            V = Split(d.Item(K), Delim) '... gespeicherte Wertekombination "Datum§Betrag" zerlegen, ... 
29.
            V(1) = V(1) + Betrag '... Betrag addieren und ... 
30.
            d.Item(K) = Join(V, Delim) '... wieder zusammensetzen und eintragen; ... 
31.
        Else 
32.
            d.Add K, EinDat & Delim & Betrag '... ansonsten Eintrag als Kombination "Datum§Betrag" erstellen 
33.
        End If 
34.
        QZeile = QZeile + 1 'nächste Zeile der Quelltabelle 
35.
    Loop 
36.
End With 
37.
 
38.
T = d.Keys 'Schlüssel-Texte in Array übernehmen 
39.
B = d.Items 'Datumswerte und Beträge detto 
40.
With Worksheets(ZTabelle) 
41.
    .Cells.ClearContents 'Zieltabelle löschen 
42.
    ZZeile = ZAbZeile 'in Überschriftenzeile der Zieltabelle beginnen 
43.
    For i = 0 To UBound(T) 'alle konsolidierten Einträge durchgehen 
44.
        'Schlüssel-Text wieder in Spalten zerlegen und eintragen 
45.
        .Cells(ZZeile, ZAbSpalte).Resize(1, Spalten) = Split(T(i), Delim) 
46.
        V = Split(B(i), Delim) 'Kombination "Datum§Betrag" zerlegen 
47.
        .Cells(ZZeile, ZDatumSpalte) = V(0) 'Eintragsdatum eintragen 
48.
        .Cells(ZZeile, ZBSpalte) = V(1) 'Betrag(ssumme) eintragen 
49.
        ZZeile = ZZeile + 1 'nächste Zeile der Zieltabelle 
50.
    Next 
51.
End With 
52.
End Sub
Grüße
bastla
Bitte warten ..
Mitglied: linBid23
01.03.2011 um 23:21 Uhr
Also noch mal Bastla,

du bist einfach genial! du hast mich gerettet.

Eine Frage: Wie werde ich Guru wie du? kannst du mir ein Tipp geben, wo ich anfangen sollte?

Viele Grüße,
linBid23
Bitte warten ..
Mitglied: bastla
01.03.2011 um 23:36 Uhr
Hallo linBid23!

Freut mich, dass es Dir hilft - aber lass mal die Kirche im Dorf ...
kannst du mir ein Tipp geben, wo ich anfangen sollte?
Nicht wirklich - ist bei mir schon etwas länger (aber nicht sehr viel über 30 Jahre ) her, dass ich mit Basic angefangen habe ...

... was ich aber auf jeden Fall empfehlen kann: learning by doing

Grüße
bastla
Bitte warten ..
Mitglied: andersch
09.10.2015 um 12:10 Uhr
Hallo,
ist es möglich noch eine Spalte Stunden nach Betrag einzufügen, die auch summiert wird?
Danke und Gruß
andersch
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
PHP
gelöst Werte in einer sql Spalte addieren (13)

Frage von helmuthelmut2000 zum Thema PHP ...

Windows Server
AD-Berechtigungen von zwei Servern miteinander vergleichen (3)

Frage von s0m3ting zum Thema Windows Server ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...