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

Daten zeilenweise aus Tabellenblättern extrahieren und in ein anderes Tabellenblatt schreiben

Frage Microsoft Microsoft Office

Mitglied: midnightautomatic

midnightautomatic (Level 1) - Jetzt verbinden

26.09.2010, aktualisiert 17:58 Uhr, 5222 Aufrufe, 10 Kommentare

Ich versuche eine Auswertung aus mehreren Tabellenblättern, die z.T. dynamisch generiert werden, sich ändern und deren Inhalte wieder gelöscht werden. Die Auswertung sollte jedoch alle extrahierten Daten enthalten.

Hallo,
ich möchte aus zwei Tabellenblättern, automatisch Daten extrahieren und in ein drittes schreiben. Konkret sieht das so aus, dass nur Zeilen, die einen Eintrag in Spalte D haben, fortlaufend auf das dritte Blatt kopiert werden sollen. Dazu soll jede Änderung in der Spalte D sofort erkannt werden und die Zeile anschließend kopiert werden.
Wenn ich das nötige Makro mit:

01.
Private Sub Worksheet_Change(ByVal Target As Range) 
02.
Call Makro 
03.
End Sub
in den Worksheets aufrufe, passiert das zwar sofort, aber alle Daten werden neu übernommen und nicht nur die letzte Änderung. Problematisch ist für mich auch, die fortlaufende Liste. Zum Teil werden momentan alte Zeilen von neuen überschrieben oder ich habe doppelte.

Wie muss der korrekte Ansatz lauten?

Hat jemand eine praktische Idee?

Gruß

Alexander
Mitglied: midnightautomatic
26.09.2010 um 18:07 Uhr
Hi!

Hier noch das Makro, das ich dafür zurzeit einsetze:
01.
Sub Auswertmakro() 
02.
Dim Zeile As Long, Blattname_alt As String, _ 
03.
Wiederholungen As Long 
04.
Application.ScreenUpdating = False 
05.
Blattname_alt = "Datenquelle" 'ActiveSheet.Name 
06.
 
07.
Sheets("zu bestellen").Select 
08.
    Cells.Select 
09.
    Selection.ClearContents 
10.
 
11.
Sheets(Blattname_alt).Activate 
12.
For Wiederholungen = 1 To 6000 
13.
If Cells(Wiederholungen, 4) <> "" Then 
14.
Zeile = Sheets("zu bestellen").Range("D65536"). _ 
15.
End(xlUp).Offset(1, 0).Row 
16.
Rows(Wiederholungen).Copy _ 
17.
Sheets("zu bestellen").Cells(Zeile, 1) 
18.
End If 
19.
Next 
20.
End Sub
Funktioniert abgesehen von den besagten Problemen leider auch nur für ein Tabellenblatt.
Gruß
Alexander
Bitte warten ..
Mitglied: 76109
26.09.2010 um 19:15 Uhr
Hallo Alexander!

Zu ersteinmal ist diese Funktion bei mehreren Blättern besser geeignet und der Code wird in "DieseArbeitsmappe" eingefügt:
01.
Const Sheet1 = "Daten1" 
02.
Const Sheet2 = "Daten2" 
03.
Const Spalte = 4 
04.
 
05.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
06.
    If Sh Is Sheets(Sheet1) Or Sh Is Sheets(Sheet2) Then 
07.
        '................. 
08.
    End If 
09.
End Sub
Das Problem bei solchen Erreignis-Funktionen ist, dass diese auch bei Aktivitäten ausgelöst werden, die sich auf mehrere Zellen beziehen. D.h. je nach Aktion werden hier nicht nur einzelne Zell-Adressen, sondern auch Bereichs-Adressen übergeben z.B. "$D$4" oder "$A2$:$G$8" sowas in der Art, die z.B. auch die Adressen "$D$2:$D$8 beinhaltet. Um also Fehler zu vermeiden, wird Dir nix anderes übrigbleiben, als bei einer Änderung stets den gesamten Inhalt zu exportieren.

Gruß Dieter
Bitte warten ..
Mitglied: 76109
26.09.2010 um 19:31 Uhr
Hallo nochmal!

Du könntest auch diesen Code verwenden, der zumindest ermittelt, ob sich in der Spalte D etwas geändert hat:
01.
Const Sheet1 = "Daten1" 
02.
Const Sheet2 = "Daten2" 
03.
Const Spalte = 4 
04.
 
05.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
06.
    Dim TestSpalteD As Range 
07.
     
08.
    If Sh Is Sheets(Sheet1) Or Sh Is Sheets(Sheet2) Then 
09.
        Set TestSpalteD = Application.Intersect(Target, Range("D:D")) 
10.
         
11.
        If Not TestSpalteD Is Nothing Then 
12.
            '....Daten exportieren..... 
13.
        End If 
14.
    End If 
15.
End Sub
Bitte warten ..
Mitglied: 76109
28.09.2010 um 11:21 Uhr
Hallo Alexander!

Du könntest diesen Code mal testen. Allerdings funktioniert der nur, wenn die Daten-Sheets eine Überschrift-Zeile in Zeile 1 enthalten.

Konstanten entsprechend anpassen
01.
Const Sheet1 = "Daten1" 
02.
Const Sheet2 = "Daten2" 
03.
Const Sheet3 = "Bestellen" 
04.
 
05.
Const FilterRange = "D:D"       'Spalte D mit Leer/Inhalt 
06.
Const CopyZeileVon = 2          'Spalte D kopieren ab Zeile ? 
07.
 
08.
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
09.
    Dim Wks As Worksheet, TestSpalteD As Range, CopyZeileBis As Long, PasteZeileAb As Long 
10.
     
11.
    If Sh Is Sheets(Sheet1) Or Sh Is Sheets(Sheet2) Then 
12.
        Set TestSpalteD = Application.Intersect(Target, Range(FilterRange)) 
13.
         
14.
        If Not TestSpalteD Is Nothing Then 
15.
            Set Wks = Sheets(Sheet3) 
16.
             
17.
            Application.ScreenUpdating = False 
18.
             
19.
            Wks.Cells.Clear 
20.
             
21.
            With Sheets(Sheet1) 
22.
                .Rows(1).Copy Wks.Rows(1) 
23.
                .Range(FilterRange).AutoFilter Field:=1, Criteria1:="<>", VisibleDropDown:=False 
24.
                 CopyZeileBis = .Cells(.Rows.Count, "D").End(xlUp).Row 
25.
                 PasteZeileAb = CopyZeileVon 
26.
                .Rows(CopyZeileVon & ":" & CopyZeileBis).Copy Wks.Rows(PasteZeileAb) 
27.
                .AutoFilterMode = False 
28.
            End With 
29.
                 
30.
            With Sheets(Sheet2) 
31.
                .Range(FilterRange).AutoFilter Field:=1, Criteria1:="<>", VisibleDropDown:=False 
32.
                 CopyZeileBis = .Cells(.Rows.Count, "D").End(xlUp).Row 
33.
                 PasteZeileAb = Wks.Cells(Wks.Rows.Count, "D").End(xlUp).Row + 1 
34.
                .Rows(CopyZeileVon & ":" & CopyZeileBis).Copy Wks.Rows(PasteZeileAb) 
35.
                .AutoFilterMode = False 
36.
            End With 
37.
            Application.ScreenUpdating = True 
38.
        End If 
39.
    End If 
40.
End Sub
Gruß Dieter

[edit] kleine Änderung (funktional aber wie vorher) [/edit]
Bitte warten ..
Mitglied: midnightautomatic
28.09.2010 um 18:21 Uhr
Hi Dieter!
Das habe ich eigentlich auch schon fast hinbekommen, hatte aber Unregelmäßigkeiten, die ich mir nicht erklären konnte. Deine Lösung gefällt mir sehr gut, weil auch die Performance vermutlich besser ist. Vielen Dank!
Grüße
Alexander
Bitte warten ..
Mitglied: midnightautomatic
28.09.2010 um 18:45 Uhr
Hi Dieter!
Problematisch ist für mich allerdings noch, dass in Tabelle „Daten2“ die bekannte Suchfunktion aus dem anderen Beitrag verwendet werden soll. Jetzt scheitern leider alle Ansätze außer Deiner ComboBox, weil Tabellenblatt „Daten2“, wo die Suche ausgeführt wird, ja jedes Mal wieder gelöscht wird. Es wäre daher sinnvoll die Daten in „bestellen2“ fortlaufend zu sammeln, zumindest was die Auswertung aus dem Sheet „Daten2“ angeht.

Wenn es dann wirklich auf die Bestellung zugeht, müsste „bestellen“ erst sortieren und gegeben falls Zeilen zusammenfassen. Dann hätte man eine Komplettlösung, beinhaltet aber schon die nächste Baustelle.
Viele Grüße
Alexander
Bitte warten ..
Mitglied: 76109
28.09.2010 um 19:09 Uhr
Hallo Alexander!

Zitat von midnightautomatic:
Das habe ich eigentlich auch schon fast hinbekommen, hatte aber Unregelmäßigkeiten, die ich mir nicht erklären
konnte. Deine Lösung gefällt mir sehr gut, weil auch die Performance vermutlich besser ist. Vielen Dank!
Die Performance sollte meines Erachtens turbomäßig sein.

Zu Deiner zweiten Antwort habe ich im Moment keinen Plan und muss ich mir erst nochmal anschauen. Aber grundsätzlich besteht ja die Möglichkeit, die Aktualisierung während der Ausführung anderer Aktivitäten, wie beispielsweise der Suchfunktion, bis zu dessen Beendigung zu deaktivieren. Wäre jetzt mein erster Gedanke dazu

Gruß Dieter
Bitte warten ..
Mitglied: midnightautomatic
28.09.2010 um 22:17 Uhr
Hallo Dieter!

Aber grundsätzlich besteht ja die Möglichkeit, die Aktualisierung während der Ausführung anderer Aktivitäten, wie beispielsweise der Suchfunktion, bis zu dessen Beendigung zu deaktivieren. Wäre jetzt mein erster Gedanke dazu

Das dürfte keine Rolle spielen. Am Ende zählen für mich nach wie vor die Zeilen, die eine Eintragung in der Spalte D, nennen wir sie Menge, haben, denn diese landen dann schließlich auf dem Bestellformular bzw. auf dem Tabellenblatt "bestellen". Problematisch ist eher, dass nach erfolgter Suche meine Eintragung in Spalte D und damit die Übernahme in Tabellenblatt "bestellen" flöten geht, sobald ich eine neue Suche ausführe
Bitte warten ..
Mitglied: midnightautomatic
28.09.2010 um 22:41 Uhr
Hi Dieter!
Bisher habe ich in "bestellen" die Artikel, Artikelnummer, Preis und Gesamtpreis gesammelt. Die Spalte wird erst dann berücksichtigt, wenn in Menge eine Eintragung gemacht wurde. Menge müsste man dann in die korrespondierende Spalte von "Daten1" kopieren, damit diese auch in der nächsten Suche berücksichtigt wird. Das sprengt aber hier den Rahmen. Ich mache dann einen extra Thread.
Der erfolgte Eintrag in Spalte D und damit die zugehörige Zeile darf auch nach der nächsten Suche nicht verlorengegangen sein. Das ist der Kern.

Grüße

Alexander
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Debian
Www-data in ein CIFS Share Daten schreiben lassen? (3)

Frage von Jens4ever zum Thema Debian ...

Webbrowser
gelöst Daten in entfernte Mysql DB schreiben (3)

Frage von nullacht15 zum Thema Webbrowser ...

Windows Netzwerk
IIS - anderes Netz zulassen (3)

Frage von survial555 zum Thema Windows Netzwerk ...

Cloud-Dienste
Amazon: Dieser Lkw transportiert Daten in die Cloud (1)

Link von Kraemer zum Thema Cloud-Dienste ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...