Anzeige
Archiv - Navigation
1332to1336
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

Archivierung von Daten

Archivierung von Daten
22.10.2013 11:14:13
Daten
Guten Tag geehrte Herbergemeinde,
ich habe ein Problem.
Und zwar möchte ich einen Teil von gesammelten Datenblöcken archivieren, indem ich nach mehreren Auftragsnummern suche (findnext?) und die dazugehörigen 11 Spalten einzulesen und in ein neues Archivdokument zu schreiben.
Nach den 12 Spalten kommt der nächste Datenblock in denen weiter nach der Auftragsnummer gesucht werden muss.
Also Datenursprung Tabellenblatt: Produktionsmeldungen
Datenziel: Produktionmeldungsarchiv.xls im selben Ordner
Archivierungsgrundlage: Auftragsnummern
Im Archiv kann alles untereinander eingefügt werden.
Musterdatei:
https://www.herber.de/bbs/user/87744.xls
Ich hoffe es findet sich ein Helfer, der mir einen Code zur Verfügung stellt.
Meine Versuche habe ich mittlerweile verworfen, damit ich niemanden irritiere.
Außerdem ist es interessant für mich, wie eine darin geübtere Person den Code schreibt, damit ich mich daran ein bisschen inspirieren lassen kann.
Eine Meinung zum Code aus dem ersten Modul in meinem Dokument wäre auch nicht schlecht.
Also schon mal im voraus vielen Dank an alle, die versuchen mir zu helfen. :)
Grüße
Dennis

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Archivierung von Daten
22.10.2013 18:25:30
Daten
Hallo Dennis,
mal sehen, ob Dich das inspiriert. Nach meiner Einschätzung ist so ein Projekt zu anspruchsvoll, um einen Einstieg in die VBA-Programmierung zu finden.
Sub Archivieren()
Dim oTmpWB, oTmpWS, oArchiveWB, oArchiveWS, oActiveWS
Dim i As Integer, strAuftragsnummer As String
Set oTmpWB = Workbooks.Add
Set oTmpWS = oTmpWB.Sheets(1)
Set oActiveWS = ThisWorkbook.Sheets("Produktionsmeldungen")
Set oArchiveWB = Workbooks.Open(ThisWorkbook.Path & "\" & "Produktionsmeldungsarchiv.xls")
Set oArchiveWS = oArchiveWB.Sheets(1)
oTmpWS.Cells(1, 1) = "Kopieren"
Range(oActiveWS.Cells(3, 1), oActiveWS.Cells(3, 12)).Copy Destination:=oTmpWS.Cells(1, 2)
For i = 1 To (oActiveWS.Cells(3, 1).End(xlToRight).Column / 12)
Range(oActiveWS.Cells(4, i * 12 - 11), oActiveWS.Cells(4, i * 12 - 11).End(xlDown).Offset(0, _
11)).Copy Destination:=oTmpWS.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0)
Next
oTmpWS.Cells(2, 1) = "nein"
oTmpWS.Cells(2, 1).Copy Destination:=Range(oTmpWS.Cells(2, 1), oTmpWS.Cells(2, 2).End(xlDown). _
Offset(0, -1))
oTmpWS.UsedRange.AutoFilter
Wiederholen:
strAuftragsnummer = InputBox("Auftragsnummer:")
If strAuftragsnummer = "" Then GoTo NichtWiederholen
For i = 2 To oTmpWS.Cells(Rows.Count, 1).End(xlUp).Row
If CStr(oTmpWS.Cells(i, 2)) = strAuftragsnummer Then
oTmpWS.Cells(i, 1) = "ja"
End If
Next
GoTo Wiederholen
NichtWiederholen:
For i = 2 To oTmpWS.Cells(Rows.Count, 1).End(xlUp).Row
If oTmpWS.Cells(i, 1) = "ja" Then Range(oTmpWS.Cells(i, 2), oTmpWS.Cells(i, 13)).Copy  _
Destination:=oArchiveWS.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
Next
oTmpWB.Close SaveChanges:=False
Set oTmpWB = Nothing
Set oTmpWS = Nothing
Set oArchiveWB = Nothing
Set oArchiveWS = Nothing
Set oActiveWS = Nothing
End Sub

Gruß
Sheldon

Anzeige
AW: Archivierung von Daten
22.10.2013 19:34:17
Daten
Hallo Dennis,
ich hab in deine Datei mal eine Lösung mit Userform eingebaut.
In der Userform können in einer Listbox eine oder mehrere Auftragsnummern ausgewählt werden.
Nach Bestätigung werden dann die Daten ins Archiv kopiert.
Dein Code im 1. Modul:
1. Wenn du schon Variablen deklarierst, dann bitte alle
Durch
Option Explicit
als 1. Zeile in einem Code Modul erzwingt man die Variablen-Deklaration und vermeidet z.B. Schreibfehler bei den Variablennamen bzw. der VBA-Debugger meldet entsprechende Fehler.
Durch aktivieren der entsprechenden Option im VBA-Editor fügt Excel diese Zeile automaisch in jedem neuen Modul ein.
2. Verwende aussagekräftigere Variablennamen
f und g sind nicht so dolle.
Gängige Praxis ist, dass man mit den ersten Zeichen in Kurzform den Variablentyp bezeichnet und dann mit Großbuchstabe den Namen weiterschreibt
Beispiele für Variablendeklarationen:
lngZeile as Long
wkbArchiv As Workbook
wksZiel As Worksheet
strDateiName as String
intJ as Integer
rngZelle as Range
varData as Variant
objDoc as Object
3. Verwende wenn möglich With ... End With
Damit vermeidet man ggf. das ständige Wiederholen von Objekt-Bezeichnungen (in deinem Fall die Tabellenblattnamen)
Alternativ kann man auch die Worksheet-Objekte einer entsprechenden Variablen zuordnen
Dim wksSchichtMld As Worksheet, wksProdMld as Worksheet
Set wksSchicht = Worksheets("Schichtmeldung")
Set wksProdMld = Worksheets("Produktionsmeldungen")
4. Optimierung der Schleifen
In deinem Fall kann man die Wiederholung der ähnlichen Code-Abschnitte für die 4 Varianten zu jeder Maschine/Anlage vermeiden, indem man eine zusätzliche For-Next-Schleife einbaut, die die 4 Zeilen für die Varianten abarbeitet.
5. Verwendung von
Select Case ... Case ... Case ... End Select
statt
If ... ElseIf ... ElseIf ... EndIf
Wenn eine Variable oder auch ein Zelle "nur" auf ihren Wert geprüft werden soll dann ist Select Case übersichtlicher und flexibler.
Ich hab einen Teil meiner Anmerkungen in den Code im Modul1 umgesetzt.
Gruß
Franz
In der ZIP-Datei findest du deine Datei mit den entsprechenden Mskros und die mit dem Archivieren-Button im Userform ausgefüllte Archivdatei.
https://www.herber.de/bbs/user/87755.zip

Anzeige
AW: Archivierung von Daten
23.10.2013 15:38:01
Daten
Vielen Dank Franz!
Ich bin richtig begeistert von dem Feedback und gehe alles Schritt für Schritt durch um alle Anpassungen zu verstehen.
Mein nächster Schritt ist eine Ausschussquotenaufstellung auf Kalender/Artikelbasis. Da werden mir die neuen Ansätze sicher helfen. :)
Auch einen Dank an Sheldon, deinen Code begutachte ich auch noch ganz genau. :)
Ich wünsche euch eine schöne Restwoche mit weiterhin vielen Möglichkeiten, andere Hilfesuchende mit eurem Support Glücklich zu machen. ;)
Grüße
Dennis

AW: Archivierung von Daten
24.10.2013 12:31:58
Daten
Hallo Franz,
hoffentlich erreiche ich dich noch.
Es wäre gut, wenn du eine Möglichkeit finden könntest, dass dein Code die archivierten Datensätze auch noch herauslöscht und die Maschine dem Datensatz im Archiv auch noch zugeordnet werden kann.
Ansonsten wird die Liste ja immer länger und länger, was nicht dem Sinn der Archivierung entspricht.
Es gab in deiner Lösung zur Information aber auch einen kleinen Fehler, den ich beim Test bemerkte.
Die variabel letztezeile ergab immer "1". Das lag daran, dass die "Einfügschleife" auf eine with-Funktion bezogen war, die sich nur auf den Bereich A2:?2 bezog.
Hab die kleine Hürde aber gemeistert. :)
Nichtsdestotrotz super Arbeit. :)
Grüße
Dennis

Anzeige
AW: Archivierung von Daten
24.10.2013 14:28:23
Daten
Hallo Dennis,
füge im Archivtabellenblatt links von Spalte "Auftrag" eine Spalte ein für die Maschine.
Die Code für die Schaltfläche im Userform tauscht du dann durch den nachfolgenden Code aus.
Die Inhalte der kopierten Datensätze werden immer gleich gelöscht.
Nachdem alle Auftragsnummern abgearbeitet sind werden dann die Spalten je Maschine sortiert, so dass die leeren Zeilen ans Ende der Liste wandern.
mfg
Franz
Private Sub cmbArchivieren_Click()
Dim varMaschine, varAuftragNr As Variant, intNr As Integer, intCount As Integer
Dim wkbArchiv As Workbook, wksArchiv As Worksheet, lngZeileArchiv As Long
Dim rngBereich As Range, rngAuftragNr As Range, strAdresse1 As String
Dim lngSpalte As Long, lngZeile As Long
Dim bolOpen As Boolean
'In der Listbox selektierte Auftrags-Nummern ins Archiv kopieren
With Me.ListBox1
Application.ScreenUpdating = False
For intNr = 0 To .ListCount - 1
If .Selected(intNr) = True Then
varAuftragNr = .List(intNr, 0)
'ggf. Archiv-Datei öffnen
If wkbArchiv Is Nothing Then
'prüfen, ob Archivdatei schon geöffnet
For Each wkbArchiv In Application.Workbooks
If LCase(wkbArchiv.Name) = LCase(strDateiArchiv) Then
bolOpen = True 'Merker, dass die Archivdatei geöffnet ist
Exit For
End If
Next
If wkbArchiv Is Nothing Then
'Archivdatei öffnen
Set wkbArchiv = Application.Workbooks.Open( _
Filename:=ThisWorkbook.Path & "\" & strDateiArchiv, addtomru:=True)
End If
Set wksArchiv = wkbArchiv.Worksheets(1)
With wksArchiv
'letzte Zeile mit Auftragsnummer in Spalte 2 des Archivtabellenblattes
lngZeileArchiv = .Cells(.Rows.Count, 2).End(xlUp).Row
End With
End If
'Prüfen, ob Auftrag-Nr. schon archiviert ist
If lngZeileArchiv >= 2 Then
With wksArchiv
Set rngAuftragNr = .Range(.Cells(2, 2), .Cells(lngZeileArchiv, 2)).Find _
(What:=varAuftragNr, LookIn:=xlValues, lookat:=xlWhole)
End With
End If
If rngAuftragNr Is Nothing Then
With wksData
'Spalten mit Auftragsnummern nach Auftragsnummer durchsuchen
For lngSpalte = 1 To .Cells(1, .Columns.Count).End(xlToLeft).Column Step 12
'letzte Zeile mit Daten in Spalte
lngZeile = .Cells(.Rows.Count, lngSpalte).End(xlUp).Row
varMaschine = .Cells(2, lngSpalte).Value
If lngZeile >= 4 Then
'zu durchsuchenden Datenbereich setzen
Set rngBereich = .Range(.Cells(4, lngSpalte), _
.Cells(.Rows.Count, lngSpalte).End(xlUp))
'Auftrags-Nummer suchen im Bereich
Set rngAuftragNr = rngBereich.Find(What:=varAuftragNr, LookIn:=xlValues, _
lookat:=xlWhole)
If Not rngAuftragNr Is Nothing Then
strAdresse1 = rngAuftragNr.Address 'Zelladresse der 1. Fundstelle merken
Do
intCount = intCount + 1 'Zähler für Anzahl gefundene Zeilen
lngZeileArchiv = lngZeileArchiv + 1 'Zeilenzähler im Archiv erhöhen
lngZeile = rngAuftragNr.Row 'Zeile der Auftragsnumer in  _
Produktionsmeldungen
'Daten ins Archiv kopieren nur Werte
wksArchiv.Cells(lngZeileArchiv, 1) = varMaschine
.Range(.Cells(lngZeile, lngSpalte), .Cells(lngZeile, lngSpalte + 11)).Copy
wksArchiv.Cells(lngZeileArchiv, 2).PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
'kopierte Inhalte löschen
.Range(.Cells(lngZeile, lngSpalte), _
.Cells(lngZeile, lngSpalte + 11)).ClearContents
'Suche wiederholen
Set rngAuftragNr = rngBereich.FindNext(After:=rngAuftragNr)
If rngAuftragNr Is Nothing Then Exit Do
Loop Until strAdresse1 = rngAuftragNr.Address
End If
End If
Next lngSpalte
End With
Else
MsgBox "Auftrags-Nr. " & varAuftragNr & " ist bereits archiviert!", _
vbInformation + vbOKOnly, "A R C H I V I E R E N  -  Produktionsmeldungen"
End If
End If
Next
'gelöschte Bereiche umsortieren - leere Zeilen jeweils ans Ende der Liste
With wksData
For lngSpalte = 1 To .Cells(1, .Columns.Count).End(xlToLeft).Column Step 12
'letzte Zeile mit Daten in Spalte
lngZeile = .Cells(.Rows.Count, lngSpalte).End(xlUp).Row
If lngZeile > 4 Then
'Datenbereich zu Maschine
Set rngBereich = .Range(.Cells(4, lngSpalte), .Cells(lngZeile, lngSpalte + 11))
With rngBereich
.Sort Key1:=.Cells(1, 1), order1:=xlAscending, Header:=xlNo, _
Orientation:=xlSortColumns
End With
End If
Next lngSpalte
End With
Application.ScreenUpdating = True
MsgBox "Es wurden " & intCount & " Zeilen ins Archiv übertragen!", _
vbInformation + vbOKOnly, "A R C H I V I E R E N  -  Produktionsmeldungen"
If Not wkbArchiv Is Nothing Then
If bolOpen = True Then
'Speichern ohne schließen
wkbArchiv.Save
Else
'Speichern und schliessen
wkbArchiv.Close savechanges:=True
End If
End If
End With
Set rngBereich = Nothing: Set rngAuftragNr = Nothing
Set wkbArchiv = Nothing: Set wksArchiv = Nothing
Set wksData = Nothing
Unload Me
End Sub

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige