Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1352to1356
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

@Franz - habe eine Frage aus älterem Code

@Franz - habe eine Frage aus älterem Code
28.03.2014 12:29:01
Wolfgang
Hallo Franz,
den nachfolgenden Code hattest Du mir vor etlichen Jahren zur Verfügung gestellt. Er bewirkt, dass zwischen der geöffneten Mappe und einer auf d. Desktop angewählten Mappe Änderungen/Unterschiede die in den Spalten I:K bestehen könnten, abgeglichen und ggfs. die Änderungen aus der "Desktopmappe" in die Spalten der geöffneten Mappe übertragen werden. Nun mußte ich in der Tabelle eine Spalte einfügen, so dass für die Abfrage nicht mehr die Spalten I:K, sondern die Spalten J:L maßgeblich sind. Ich hatte gehofft den Code lediglich an der Stelle abändern zu können und er läuft. Dem ist leider nicht so. Übersehe ich evtl. etwas? Die Spalten D:E für die Klärung des Hauptkriteriums bleiben dabei unverändert. - Danke Dir schon jetzt für eine Rückmeldung.
Herzliche Grüße - Wolfgang

Option Explicit
'dieser Part dient ausschließlich dem Datenableich und dem Import der Änderungen
Private wksGesamt As Worksheet, wksAlt As Worksheet, wksGrund As Worksheet
Private lngZeile As Long, lngZeileZiel As Long
Private varSuchen, rngGefunden As Range, varKriterium2                '##geändert
Private lngSpalte As Long, bolGeaendert As Boolean
Private Const SpalteSchluessel = 4 'Spalte D - Spalte mit eindeutgem Schlüsselfeld
Private Const SpalteKriterium2 = 5 'Spalte E - Spalte mit 2. Kriterium '##neu
Private Const Zeile1Alt = 2 '1.Datenzeile in Blatt Altdaten
Private Const Zeile1Grund = 2 '1.Datenzeile in Blatt Grunddaten
Private Const Zeile1Gesamt = 1 '1.Datenzeile in Blatt Gesamt
'dient für den Import von Tabellenblättern aus Mappen a.d.
Public meAreaTabellen
Public Desktop As String
Public objDatei As Object
Private Function Durchsuchen(varSuche, varSuche2, wksSuche As Worksheet, _
ByVal lngSpalte As Long, ByVal lngSpalte2 As Long, _
Optional ByVal lngZeile1 As Long = 1) As Range
'Suche in Spalte eines Tabellenblatts mit zusätlichem Kriterium und _
Rückgabe der gefundenen Zelle                 'Function komplett überarbeitet
Dim rngSuche As Range, strAdresse1 As String
With wksSuche
'nur in Spalte suchen ab Zeile1
If .Cells(.Rows.Count, lngSpalte).End(xlUp).Row >= lngZeile1 Then
Set rngSuche = .Range(.Cells(lngZeile1, lngSpalte), _
.Cells(.Cells(.Rows.Count, lngSpalte).End(xlUp).Row, lngSpalte))
Else
'Keine Daten ab Zeile1 abwärts vorhanden
Set Durchsuchen = Nothing
Exit Function
End If
'Hauptkriterium suchen
Set Durchsuchen = rngSuche.Find(what:=varSuche, LookIn:=xlValues, lookat:=xlWhole)
If Not Durchsuchen Is Nothing Then
'Zelladresse der 1. Fundstelle merken
strAdresse1 = Durchsuchen.Address
Do
'2. Kriterium prüfen
If wksSuche.Cells(Durchsuchen.Row, lngSpalte2).Value = varSuche2 Then
Exit Do
End If
'Suche wiederholen
Set Durchsuchen = rngSuche.FindNext(after:=Durchsuchen)
If Durchsuchen.Address = strAdresse1 Then
'Übereinstimmung für beide Kriterien wurde nicht gefunden
Set Durchsuchen = Nothing
Exit Do
End If
Loop
End If
End With
End Function
Sub Alt_Grunddaten_aktualiseren()
Application.ScreenUpdating = False
Set wksGesamt = Worksheets("Gesamt")
Set wksAlt = Worksheets("Altdaten")
Set wksGrund = Worksheets("Grunddaten")
With wksGesamt
For lngZeile = Zeile1Gesamt To .Cells(.Rows.Count, SpalteSchluessel).End(xlUp).Row
varSuchen = .Cells(lngZeile, SpalteSchluessel)
varKriterium2 = .Cells(lngZeile, SpalteKriterium2)           '##neu
'Blatt Altdaten aktualisieren
Call Pruefen(wksZiel:=wksAlt, Zeile1:=Zeile1Alt)
'Blatt Grunddaten aktualisieren
Call Pruefen(wksZiel:=wksGrund, Zeile1:=Zeile1Grund)
Next
End With
Application.ScreenUpdating = True
End Sub
Private Sub Pruefen(wksZiel As Worksheet, ByVal Zeile1 As Long)
'im Zielblatt Schluessel suchen und Daten vergleichen/aktualiseren
Set rngGefunden = Durchsuchen(varSuche:=varSuchen, varSuche2:=varKriterium2, _
wksSuche:=wksZiel, lngZeile1:=Zeile1, lngSpalte:=SpalteSchluessel, _
lngSpalte2:=SpalteKriterium2)                               '##geändert
With wksZiel
bolGeaendert = False
If rngGefunden Is Nothing Then
'Schlüssel in Blatt Gesamt ist im Zielblatt nicht vorhanden
'NeuenDatensatz anlegen
' wksGesamt.Rows(lngZeile).Copy
'Nächste frei Zeile in Schluesselspalte
' lngZeileZiel = .Cells(.Rows.Count, SpalteSchluessel).End(xlUp).Row + 1
'Formate kopieren
'       .Cells(lngZeileZiel, 1).PasteSpecial Paste:=xlFormats
'Werte kopieren
'.Cells(lngZeileZiel, 1).PasteSpecial Paste:=xlValues
Application.CutCopyMode = False
bolGeaendert = True
Else
lngZeileZiel = rngGefunden.Row
'Spalten auf Änderungen prüfen
For lngSpalte = 1 To 11
Select Case lngSpalte
'Hier hatte ich gehofft, einfach die Spaltennummern zu verändern - klappt irgenwie aber leider   _
_
nicht
Case 9, 10, 11  'Spalten I , J und  K
If wksGesamt.Cells(lngZeile, lngSpalte).Value  _
.Cells(lngZeileZiel, lngSpalte).Value Then
.Cells(lngZeileZiel, lngSpalte).Value = _
wksGesamt.Cells(lngZeile, lngSpalte).Value
bolGeaendert = True
End If
Case Else
'do nothing
End Select
Next
End If
'If bolGeaendert = True Then
'Änderungsdatum in Spalte L eintragen
'.Cells(lngZeileZiel, 12).Value = Now
' End If
End With
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: @Franz - habe eine Frage aus älterem Code
28.03.2014 13:20:26
fcs
Hallo Wolfgang,
ist die zusätzliche Spalte auf allen 3 Blättern
Set wksGesamt = Worksheets("Gesamt")
Set wksAlt = Worksheets("Altdaten")
Set wksGrund = Worksheets("Grunddaten")
eingefügt worden?
wenn "Ja", dann sollte es so funktionieren:
      For lngSpalte = 1 To 12 'hier auch die letzte Spalte anpassen
Select Case lngSpalte
Case 10, 11, 12 'Spalten J , K und  L
Wenn "Nein", dann müssen in den nachfolgenden Zeilen die Nummern der zu vergleichendne Spalten irgendwie noch zusätzlich angepasst werden.
Gruß
Franz
Gruß
Franz

Anzeige
AW: @Franz - habe eine Frage aus älterem Code
28.03.2014 20:05:19
Wolfgang
Hallo Franz,
herzlichen Dank zunächst für Deine Rückmeldung. Du hattest vollkommen Recht, ich hatte vergessen, eine der Tabellen anzupassen. Durch Deinen Hinweis ging mir dabei allerdings durch den Kopf, dass ich die beiden Tabellenblätter eigentlich gar nicht mehr benötige (Altdaten und Gesamt), da sich der "Datenverkehr" nur noch über die Tabelle Grunddaten abspielt. Wie müßte ich den Code verändern, damit die beiden Tabellen Altdaten und Gesamt quasi ausgeschaltet werden und in der Mappe gelöscht werden könnten? - Danke Dir schon jetzt wieder für Deine Rückmeldung.
Herzliche Grüße - Wolfgang

Anzeige
AW: @Franz - habe eine Frage aus älterem Code
29.03.2014 08:20:18
fcs
Hallo Wolfgang,
ich weiss ja nicht, wie du die Makros jetzt einsetzt.
Es werden aber 2 Tabellenblätter benötigt.
Eine Tabelle die die Daten liefert -das ist in den Makros wksGesamt bzw. gemäß Objektzuweisung das Tabellenblatt "Gesamt"- und eine zweite Tabelle in die aktualisierte Daten übertragen werden -das ist Variable wksZiel, der bisher in 2 Durchläufen nacheinander die Tabellen "Altdaten" und "Grunddaten" zugewiesen werden.
Du kannst also nur eine der beiden Zieltabellen aus dem Datentransfer rausnehmen.
Die Anpassungen um "Altdaten" zu löschen sind in folgendem Makro zu machen:
Sub Alt_Grunddaten_aktualiseren()
Application.ScreenUpdating = False
Set wksGesamt = Worksheets("Gesamt")
'  Set wksAlt = Worksheets("Altdaten")      - ggf. löschen
Set wksGrund = Worksheets("Grunddaten")
With wksGesamt
For lngZeile = Zeile1Gesamt To .Cells(.Rows.Count, SpalteSchluessel).End(xlUp).Row
varSuchen = .Cells(lngZeile, SpalteSchluessel)
varKriterium2 = .Cells(lngZeile, SpalteKriterium2)           '##neu
'Blatt Altdaten aktualisieren
'      Call Pruefen(wksZiel:=wksAlt, Zeile1:=Zeile1Alt)      - ggf. löschen
'Blatt Grunddaten aktualisieren
Call Pruefen(wksZiel:=wksGrund, Zeile1:=Zeile1Grund)
Next
End With
Application.ScreenUpdating = True
End Sub

Zusätzlich kannst du in der Deklaration der Variablen die Variable wksAlt und die Konstante Zeile1Alt löschen.
Gruß
Franz

Anzeige
AW: @Franz - habe eine Frage aus älterem Code
30.03.2014 15:46:55
Wolfgang
Hallo Franz,
sorry, dass ich mich jetzt erst wieder melde. Ich habe zunächst versucht, das immer noch vorhandene Problem zu klären/"einzukreisen"; Ich konnte nun nach vielen Tests feststellen, dass es gar nicht a.d. bisher geänderten Einstellungen mehr lag (da hatte ich Deine Hinweise entspr. angepasst), sondern wohl eher im nachfolgenden Code zu finden ist. Über ein UF mit Listbox1 und Combobox1 wird die gewünschte Mappe auf dem Desktop gesucht. Problem, so meine ich nun festgestellt zu haben, ist, dass in der Listbox1 die Tabellenblätter aus der entspr. Mappe gem. Combobox1 angezeigt werden, hier aber anscheinend nur "Tabelle1" "Tabelle2"... akzeptiert werden; Im veränderten Tool heißt das maßgebliche Tabellenblatt, aus dem die Daten vom Desktop importiert werden, "Results". Wie müßte der folgende Code geändert werden, damit auch die Tabelle "Results" akzeptiert wird? - Schön wäre, dass diese direkt in der Listbox1 markiert wird. Die bisherigen Bezeichnungen "Tabelle1" etc. sind dabei hinfällig geworden.
Danke Dir schon jetzt recht herzlich wieder für Deine erneute Rückmeldung.
Gruß - Wolfgang
Option Explicit
Private Sub ComboBox1_Click()
Dim i As Integer
Application.ScreenUpdating = False
If Not objDatei Is Nothing Then
objDatei.Close False
Set objDatei = Nothing
End If
Me.ListBox1.Clear: Me.ListBox1.Value = ""
Set objDatei = GetObject(Desktop & ComboBox1)
For i = 1 To objDatei.Worksheets.Count
Me.ListBox1.AddItem objDatei.Worksheets(i).Name
Next i
Me.ListBox1.Enabled = IIf(i > 1, True, False)
Application.ScreenUpdating = True
End Sub
Private Sub CommandButton2_Click()
Dim i As Integer
Application.ScreenUpdating = False
Dim TextTabelle As String
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then
TextTabelle = TextTabelle & ListBox1.List(i) & ";"
End If
Next i
TextTabelle = Left$(TextTabelle, Len(TextTabelle) - 1)
Unload Me
meAreaTabellen = Split(TextTabelle, ";")
Call LeseTabellen
Call Copyeinsbisvier
Call einsbisvierloeschen
Call Alt_Grunddaten_aktualiseren
Application.ScreenUpdating = True
End Sub
Private Sub UserForm_Initialize()
Dim objshell As Object
Call Mappeoffen
Application.ScreenUpdating = False
Set objshell = CreateObject("WScript.Shell")
Desktop = objshell.SpecialFolders("Desktop")
Desktop = IIf(Right$(Desktop, 1) = "\", Desktop, Desktop & "\")
Set objshell = Nothing
Call SucheDatei
Application.ScreenUpdating = True
End Sub
Sub SucheDatei()
Dim Fso, Ordner, varDatei
Dim SucheDatei As String
Application.ScreenUpdating = False
SucheDatei = ".xlsb"
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Ordner = Fso.getfolder(Desktop)
'Schleife über alle Dateien im Ordner
For Each varDatei In Ordner.Files
'Dateifilter, Platzhalter verwenden
If varDatei Like "*" & SucheDatei Then
Me.ComboBox1.AddItem Right$(varDatei, Len(varDatei) - InStrRev(varDatei, "\")) '= Dateiname
End If
Next varDatei
Application.ScreenUpdating = True
End Sub
Private Sub CommandButton3_Click()
Unload Me
End Sub

Anzeige
AW: @Franz - habe eine Frage aus älterem Code
31.03.2014 07:55:34
fcs
Hallo Wolfgang,
an Hand des Codes für das Userform kann ich nicht feststellen, was da falsch läuft. Dazu müsste ich das gesamte Dateiumfeld kennen.
Gruß
Franz

AW: @Franz - habe eine Frage aus älterem Code
31.03.2014 17:27:08
Wolfgang
Hallo Franz,
habe mir noch einmal die weiteren Codes unter Sub CommandButton2_Click()angesehen und angehängt. Ändere ich das Tabellenblatt "Results" in der "Desktopmappe" manuell auf "Tabelle1" ab, überspielt Excel wunderbar die Daten in "Gesamt", um dann in "Grunddaten" evtl.Änderungen abzugleichen. Lasse ich die Tabelle "Results" in der "Desktopmappe" bestehen, tut sich nichts mehr. Kann die Ursache evtl. im Code Copyeinbisvier liegen? - Habe auf jeden einmal die besagten Codes angehängt (mit meinem Versuch bzgl. Tabelle "Results" anzupassen -ergebnislos-. Der Bezug auf "Tabelle1" etc. wäre dabei nicht mehr nötig, da in der "Desktopmappe" nur noch das Tabellenblatt "Results" existiert und hieraus die Daten importiert werden sollen. Danke schon jetzt recht herzlich erneut für Deine Geduld mit mir und erneute Rückmeldung.
Sub LeseTabellen()
Dim i As Integer
Application.ScreenUpdating = False
With ThisWorkbook
For i = LBound(meAreaTabellen) To UBound(meAreaTabellen)
objDatei.Sheets(meAreaTabellen(i)).Copy after:=.Sheets(.Sheets.Count)
ActiveSheet.Visible = False   'Ausblenden
Next i
End With 'ThisWorkbook
If Not objDatei Is Nothing Then
objDatei.Close False
Set objDatei = Nothing
End If
Erase meAreaTabellen
With Sheets("Start").Select
Range("A1").Select
End With
Application.ScreenUpdating = True
End Sub
Sub Copyeinsbisvier()
Dim lngRQue As Long, lngRZiel As Long, x As Long
lngRZiel = 1
Worksheets("Gesamt").UsedRange.Delete
For x = 1 To Worksheets.Count
With Worksheets(x)
If .Name = "Tabelle1" Or .Name = "Tabelle2" Or _
.Name = "Tabelle3" Or .Name = "Tabelle4" Or .Name = "Results" Then
lngRQue = .Cells(.Rows.Count, 1).End(xlUp).Row
If lngRQue >= 2 Then
.Range(.Rows(2), .Rows(lngRQue)).Copy _
Worksheets("Gesamt").Cells(lngRZiel, 1)
lngRZiel = lngRZiel + lngRQue - 1
End If
End If
End With
Next
End Sub


Dim sh As Worksheet
Application.DisplayAlerts = False
For Each sh In ThisWorkbook.Sheets
Select Case sh.Name
Case "Gesamt", "Start", "Grunddaten", "Altdaten", "Results"
Case Else
sh.Delete
End Select
Next
Application.DisplayAlerts = False
End Sub>

Sub Alt_Grunddaten_aktualiseren()
Application.ScreenUpdating = False
Set wksGesamt = Worksheets("Gesamt")
Set wksAlt = Worksheets("Altdaten")
Set wksGrund = Worksheets("Grunddaten")
With wksGesamt
For lngZeile = Zeile1Gesamt To .Cells(.Rows.Count, SpalteSchluessel).End(xlUp).Row
varSuchen = .Cells(lngZeile, SpalteSchluessel)
varKriterium2 = .Cells(lngZeile, SpalteKriterium2)           '##neu
'Blatt Altdaten aktualisieren
Call Pruefen(wksZiel:=wksAlt, Zeile1:=Zeile1Alt)
'Blatt Grunddaten aktualisieren
Call Pruefen(wksZiel:=wksGrund, Zeile1:=Zeile1Grund)
Next
End With
Application.ScreenUpdating = True
End Sub

Anzeige
AW: @Franz - habe eine Frage aus älterem Code
01.04.2014 07:00:26
fcs
Hallo Wolfgang,
das Problem liegt wahrscheinlich woanders.
Deine Datei enthält bereits ein Blatt mit Namen "Results".
Wenn das Makro "LeseTabellen" das Blatt "Results" aus der im Userform ausgewählten Datei in diese Datei kopiert und dabei ausblendet, dann wird es als "Results (2)" eingefügt.
Die nachfolgenden Makro lesen deshalb keine Daten aus diesem Blatt ein und zum Schluß wird es wieder gelöscht.
Das passiert nicht, wenn du das Blatt "Results" in der Desktop-Datei vorher in "Tabelle1" umbenennst.
Du must also zuerst das Blatt "Results" in der Datei mit dem Userform löschen und dann das Blatt aus der im Userform gewählten Datei hineinkopieren.
Sub LeseTabellen()
Dim i As Integer
Application.ScreenUpdating = False
With ThisWorkbook
'vorhandenes Blatt "Results" löschen
For i = 1 To .Sheets.Count
If .Sheets(i).Name = "Results" Then
Application.DisplayAlerts = False
.Sheets("Results").Delete
Application.DisplayAlerts = True
Exit For
End If
Next i
'Blatt "Results" aus Desktopdatei kopieren
For i = 1 To objDatei.Sheets.Count
If objDatei.Sheets(i).Name = "Results" Then
objDatei.Sheets("Results").Copy after:=.Sheets(.Sheets.Count)
Exit For
End If
Next
End With 'ThisWorkbook
If Not objDatei Is Nothing Then
objDatei.Close False
Set objDatei = Nothing
End If
Erase meAreaTabellen                'wird eigentlich nicht mehr gebraucht
With Sheets("Start").Select
Range("A1").Select
End With
Application.ScreenUpdating = True
End Sub
Wenn du in den im Userform ausgewählten Dateien immer nur noch das Blatt "Results" bearbeiten willst, dann kannst du dir eigentlich den ganzen Kram rund um die Listbox1 und die Liste der Tabellenblätter sparen. Ich würde da an deiner Stelle in der Listbox1 nur noch zur Information die Tabellenblätter in der in der Combobox1 ausgewählten Datei anzeigen.
Gruß
Franz

Anzeige
Tausend Dank!!! - es klappt wunderbar.
01.04.2014 09:43:55
Wolfgang
Hallo Franz,
tausend Dank für Deine erneute Rückmeldung und Überlassung des Codes. Danke aber auch für die Erläuterungen, was der Code im einzelnen bewirkt; habe ihn entsprechend eingebaut und das Tool läuft nun wieder wunderbar. Ich hätte die Änderungen nie so hinbekommen. Du hast mir erneut wieder sehr geholfen!
Gruß - Wolfgang

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige