Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1224to1228
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

Werte vergleichen und in Arbeitsmappe übertragen

Werte vergleichen und in Arbeitsmappe übertragen
damicl
Hallo zusammen,
da ich ein totaler Anfänger im Bereich VBA bin, ersuche ich euch um Hilfe.
Ich möchte mit meiner VBA-Anwendung verschiedene Werte vergleichen und in eine andere Arbeitsmappe übertragen.
Folgende Ausgangssituation liegt vor:
20 Variablen erstellt mit Namen (A3 bis A23) Diese wurden bereits mit Werten "befüllt" (Namen, z.B. Hans)
In einer Tabelle (Zelle C16 bis C30) können nun verschiedene dieser Namen der Variablen drinstehen.
Es soll nun folgendes passieren:
Die Zellen C16 bis C30 sollen auf die Werte der Variablen A3 bis A23 überprüft werden. Wenn eine Übereinstimmung vorliegt, dann soll eine entsprechende, bereits vorhandene Arbeitsmappe geöffnet werden, und der Inhalt der gesamten Zeile in diese geöffnete Arbeitsmappe übertragen und gespeichert werden. Der Knackpunkt ist eben wo das ganze hingeschrieben wird. Immer in die nächst freie Zeile der geöffneten Arbeitsmappe.
Das ganze soll für die Zeilen 16 bis 30 passieren und entsprechend in die richtigen Arbeitsmappen eingetragen werden.
Der Name der Arbeitsmappe ist wie folgt aufgebaut: Bezeichnung Name Monat Jahr.xlsx
Monat und Jahr sind bereits ausgelesen und in Variablen geschrieben.
Ich hoffe, mir kann bei dieser Sache jemand weiterhelfen. Meine bisherigen Konstruktionen aus Schleifen ergeben nicht wirklich Sinn.
Vielen Dank schon mal.
AW: Werte vergleichen und in Arbeitsmappe übertragen
28.08.2011 17:03:57
Tino
Hallo,
kannst mal diesen Code testen.
Sub Test()
Dim ArrayNamen(), ArrayDaten(), n&
Dim oWBEx As Workbook, strPath$
Dim sWS As Worksheet
Dim iCalc%

'Dateiname + Pfad anpassen 
strPath = "G:\1 Forum\Bezeichnung Name Monat Jahr.xlsx"

'Tabelle anpassen wo die Daten C16:C30 sind 
Set sWS = Tabelle2
ArrayDaten = sWS.Range("C16:C30").Value2

'Tabelle anpassen wo die Daten A3:A23 sind 
ArrayNamen = Tabelle1.Range("A3:A23").Value2

For n = 1 To Ubound(ArrayDaten)
    If CheckInArray(ArrayNamen, ArrayDaten(n, 1)) Then
        
        If oWBEx Is Nothing Then
            With Application
                iCalc = .Calculation
                .ScreenUpdating = False
                .EnableEvents = False
                .Calculation = xlCalculationManual
            End With
            Set oWBEx = Workbooks.Open(strPath) 'Datei öffnen 
        End If
        
        With oWBEx.Sheets(1) 'evtl. Tabelle anpassen wo die Daten hinkommen 
            .Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(, 15).Value = _
            sWS.Cells(15 + n, 16).Resize(, 15).Value
        End With
    End If
Next n

If Not oWBEx Is Nothing Then
    oWBEx.Close SaveChanges:=True 'Datei speichern + schließen 
    With Application
        .Calculation = iCalc
        .ScreenUpdating = True
        .EnableEvents = True
    End With
End If
End Sub


Function CheckInArray(Array1(), varWert) As Boolean
Dim varIn
For Each varIn In Array1
    If varWert = varIn Then
        CheckInArray = True
        Exit Function
    End If
Next varIn
End Function
Gruß Tino
Anzeige
AW: Werte vergleichen und in Arbeitsmappe übertragen
28.08.2011 22:57:04
damicl
Danke für die Antwort. Der Code sieht soweit nicht schlecht aus, nur habe ich mich wohl etwas umständlich ausgedrückt.
Es handelt sich um eine Art Auftragserfassung. Der Auftrag wurde bereits in einem anderen Dokument erstellt und muss nun von den verschiedenen Arbeitern mit Ihren Tätigkeiten befüllt werden. Jeder der Arbeiter besitzt eine Personalnummer. Diese befindet sich in einem separatem Dokument welches bei der Erstellung des Auftrages ausgelesen wird und somit die Namen aller Arbeiter (20 Stück) in je eine Variable (Variable A3 bis A20) gespeichert wird. Die Zeilen 16 bis 30 sind dazu da, von den verschiedenen Arbeitern ausgefüllt zu werden. Dazu wird in Spalte A die Personalnummer eingegeben, in Spalte B das Datum und ich Spalte C erscheint passend zu Personalnummer aus Spalte A der Name des Mitarbeiters. Nun sollen Variable A3 bis A20 mit dem Namen in Spalte C verglichen werden. Bei Übereinstimmung der Variable mit dem Inhalt von C soll die dazugehörige Arbeitsmappe geöffnet werden. Es gibt also für jeden Arbeiter eine eigene Arbeitsmappe in die der Zeileninhalt (also die verichtete Tätigkeit des Arbeiters am Auftrag) abgespeichert wird. In dieser geöffneten Arbeitsmappe befinden sich 32 Tabellenblätter. 31 Tage und eine Gesamte zur Abrechung des gesamten Monats. Der Name dieser geöffneten Arbeitsmappe ist somit: Lohnabrechnung Name(einer der Variablen A3 bis A23) Monat(= Variable des aktuellen Monats) Jahr(=aktuelles Jahr).xlsx. Monat und Jahr wurden bereits ermittelt und befinden sich bereits in Variablen. Es fehlt nur noch der dazu passende Name. Gespeichert wird also Zeile für Zeile in verschiedene Arbeitsmappen, da nicht ein Arbeiter alleine am Auftrag arbeitet. Daher muss das ganze "dynamisch" aufgebaut sein. Im schlimmsten Fall steht also in jeder Zeile (Zeile 16 bis Zeile 30) ein anderer Mitarbeiter. Somit werden bis zu 15 verschiedene Arbeitsmappen geöffnet und die komplette Zeile dort reingeschrieben. Das ganze geschieht beim Klick auf einen Button.
Anzeige
AW: Werte vergleichen und in Arbeitsmappe übertragen
29.08.2011 06:41:40
fcs
Hallo damicl,
ich hab Tino's Lösung mal in deine gewünschte Richtung angepasst.
Alle Informationen die du schon ermittelt hast werden als Parameter an die Prozedur übergeben, die die Daten in das Lohnabrechnungsblatt des jeweiligen Mitarbeiters überträgt.
Die Tatsache, dass pro Tag ein Blatt ausgefüllt wird macht es natürlich noch etwas komplizierter.
Das was in Auftragsdaten_Einlesen steht muss du in geeignter Form in dein vorhandenes Makro einbauen.
Falls du unbedingt mit deinen Variablen A3, A4, bis A20 arbeiten willst, dann muss du den Code innerhalb der For-Next-Schleife 18-mal kopieren und arrName(iIndex) jeweils durch die Variable ersetzen.
Gruß
Franz
Sub Auftragsdaten_Einlesen()
Dim vAktuellerMonat, vAktuellesJahr, arrName(3 To 20) As String
Dim iIndex As Integer
Dim wbAuftrag As Workbook, wksAuftrag As Worksheet
'Statt mit Variablen A3,A4,...,A20 zu arbeiten ist es einfacher ein Daten-Array abzuarbeiten
arrName(3) = "MeierB"
arrName(4) = "MeierA"
arrName(5) = "Schulze"
arrName(6) = "Özdemir"
'usw.
'Arbeitsmappe in der die auszulesenden Daten stehen
With Application.FileDialog(msoFileDialogOpen)
.Title = "Bitte Datei mit Auftragsdaten öffnen"
If .Show = False Then Exit Sub
Workbooks.Open Filename:=.SelectedItems(1), ReadOnly:=True
End With
Set wbAuftrag = ActiveWorkbook  'oder = Workbooks("Auftrag")         'Anpassen!!
'Tabellenblatt in dem die auszulesenden Daten stehen
Set wksAuftrag = wbAuftrag.Worksheets(1) 'oder auch = wbAuftrag.Worksheets("Erfassung")
vAktuellerMonat = "08"
vAktuellesJahr = "2011"
For iIndex = LBound(arrName) To UBound(arrName)
Application.StatusBar = "Bearbeite Stundenabrechnung für " & arrName(iIndex)
Call Daten_nach_Lohnabrechnung(sName:=arrName(iIndex), sJahr:=vAktuellesJahr, _
sMonat:=vAktuellerMonat, wksQuelle:=wksAuftrag)
Next
Application.StatusBar = False
wbAuftrag.Close savechanges:=False
End Sub
Sub Daten_nach_Lohnabrechnung(sName As String, ByVal sJahr As String, _
ByVal sMonat As String, wksQuelle As Worksheet)
Dim Zelle As Range
Dim oWBEx As Workbook, strPath$, strDatei$, vSheet
Dim iCalc%
If sName = "" Then GoTo Beenden
'Verzeichnis in dem die Dateien für die einzelnen Mitarbeiter stehen -    anpassen
strPath = "C:\Users\Public\Test\01\"
'Zellen mit Namen im Quelltabellenblatt abarbeiten   -  Bereich ggf. anpassen
For Each Zelle In wksQuelle.Range("C16:C30")
If Zelle.Value = sName Then
If oWBEx Is Nothing Then
strDatei = "Lohnabrechnung " & sName & " " & sMonat & " " & sJahr & ".xlsx"
'Prüfen, ob Datei für Mitarbeiter vorhanden
If Dir(strPath & strDatei) = "" Then
MsgBox "Der Dateiname """ & strPath & strDatei & """ existiert nicht!"
Exit For
End If
With Application
iCalc = .Calculation
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
Set oWBEx = Workbooks.Open(strPath & strDatei) 'Datei öffnen
End If
'Index-Nr. oder Blattname des Tabellenblatts für den Tag aus dem Datum in _
Spalte B (2) ermitteln - hier sind Blatt 1 die Übersicht und Blatt 2 bis 32 _
die Blätter für die Tage 1 bis 31
vSheet = Day(wksQuelle.Cells(Zelle.Row, 2)) + 1 '              - ggf. anpassen
With oWBEx.Sheets(vSheet)
.Cells(.Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(, 15).Value = _
wksQuelle.Cells(Zelle.Row, 1).Resize(, 15).Value
End With
End If
Next Zelle
Beenden:
If Not oWBEx Is Nothing Then
oWBEx.Close savechanges:=True 'Datei speichern + schließen
With Application
.Calculation = iCalc
.ScreenUpdating = True
.EnableEvents = True
End With
End If
End Sub

Anzeige
AW: Werte vergleichen und in Arbeitsmappe übertragen
29.08.2011 22:17:38
damicl
Hallo Franz,
vielen Dank für den Code. Ich teste ihn erst morgen Abend. Bin heute nicht mehr dazu gekommen.
Das ganze liest sich soweit echt gut, auch wenn ich noch nicht alles verstehe. Werd schon noch drauf kommen. Ich versuche es mal einzubinden und melde mich dann wieder.
Vielen Dank schon mal
Gruß
damicl
AW: Werte vergleichen und in Arbeitsmappe übertragen
01.09.2011 18:24:13
damicl
Hallo Franz,
nochmal vielen Dank für deine Mühen. Habe es gestern mal in meine Arbeitsmappe eingebunden. Aber es klappt noch nicht so richtig. Wenn ich auf meinen speichern-button drücke werde ich aufgefordert, "manuell" die "Lohnabrechnung" zu öffnen. Nach dem "manuellen" öffen wird aber nichts darin abgespeichert. Das ganze sollte automatisch öffen, zeilen für zeile abspeichern. Mir ist noch was eingefallen, was die Sache erschweren könnte. Da ja nicht ein Auftrag komplett an einem Tag abgearbeitet wird, sondern an mehreren und auch noch von verschiedenen Arbeitern, sollten nur die Daten des aktuellen Tags abgespeichert werden. Oder besser gesagt, die Daten, die neu in den Auftrag dazugekommen sind. Die alten, die bereits begespeichert wurden, sollen natürlich nicht mehr neu abgespeichert werden. Hoffe jemand versteht, was ich meine.
Gruß
damicl
Anzeige
AW: Werte vergleichen und in Arbeitsmappe übertragen
01.09.2011 22:35:59
fcs
Hallo damid,
da ich ja die Struktur diener DAten nnicht kenne musste mir ja etwas zusammenstellen.
In dem Dialog soll nicht die Lohnabrechnung der einzelnen Mitarbeiter geöffnete werden, sondern die Datei, in die die Mitarbeiter ihre Tätigkiten eintragen. Wenn diese Datei schon geöffnet ist, dann kannst du den Datei-Auswahldialog weglassen. in der Zeile
  Set wbAuftrag = ActiveWorkbook  'oder = Workbooks("Auftrag")         'Anpassen!!
muss du Excel dann anweisen, in welcher Arbeitsmappe es die zu kopierenden Daten findet.
Wenn du die Daten in Etappen einlesen willst, dann muss Excel ja irgend wie erkennen, ob die Daten schon eingelese sind. Entweder es gibt Kriterien, die man vergleichen kann (Datum + Eintrag in bestimmter Spalter), oder in den von den Mitarbeitern ausgefüllten Listen werden die Zeilen markiert, die schon eingelesen wurden.
Hier mal in einer ZIP-Datei die Beispieldateien mit denen ich garbeitet habe.
Die Makros sind in Datei "SteuerungAbrechnung.xls" der Rest sind die Dateien aus den kopiert wird (Auftrag....xls) und die Abrechnungsdateien der einzelnen Mitarbeiter.
Gruß
Franz
https://www.herber.de/bbs/user/76427.zip
Anzeige

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige