352 Aufrufe
Gefragt in Tabellenkalkulation von zagor Mitglied (166 Punkte)
Bearbeitet von zagor

Folgenden Code habe ich versucht für meine Bedürfnisse anzupassen, aber da ich keine Ahnung von der Materie habe, ist es nur beim Kopieren des Codes geblieben. Der untere braucht 12 Arbeitsblätter nach 12 Monaten. Der Code schreibt die Daten nach einem horizontalen Kalender. Mein Kalender ist untereinander reihende 365 Tage. Das Datum wird im Arbeitsblatt "Schicht 1" bei B6 eingegeben. Dabei sollten folgende Zellen des Arbeitsblatts "Schicht 1"; Zelle W3; Zelle W4, Zelle W5; Zelle W6; Zelle W7; Zelle M3; Zelle M4; Zelle M5; Zelle M6; Zelle M7 kopiert werden.

Sub Daten_in_Tabelle_Schicht_kopieren_Klicken()
    Dim wksTab As Worksheet
    Dim intSpalte As Integer
    Set wksTab = Worksheets(Format(Range("B6"), "mmm"))
    With wksTab
        For intSpalte = 6 To 36
            If .Cells(4, intSpalte) = Range("B6") Then
                .Cells(8, intSpalte) = Range("W3")
                .Cells(9, intSpalte) = Range("W4")
                .Cells(10, intSpalte) = Range("W5")
                .Cells(11, intSpalte) = Range("W6")
                .Cells(17, intSpalte) = Range("I37")
                .Cells(22, intSpalte) = Range("S17")
                .Cells(23, intSpalte) = Range("S19")
                .Cells(23, intSpalte) = Range("S20")
                .Cells(29, intSpalte) = Range("S35")
                .Cells(31, intSpalte) = Range("S37")
                .Cells(35, intSpalte) = Range("A1") '<==????? Zelladresse anpassen
                .Cells(36, intSpalte) = Range("A1") '<==????? Zelladresse anpassen
                Exit For
            End If
        Next intSpalte
    End With
End Sub

https://supportnet.de/forum/?qa=blob&qa_blobid=13267284043232647019

14 Antworten

0 Punkte
Beantwortet von zagor Mitglied (166 Punkte)

Guten Morgen,

ich brauche nochmal Ihren Support. Ich muss die Produktivität übertragen. 

Die Quelldatei "641_Kopmplett" gibt es für jede Abt. immer als eine Datei "642_Komplett" usw. bis "644_Komplett".

Das dumme in der Quelldatei, dass jeder Monat für sich ein Monat ist. Kann man die Produktivitätswerte exportieren? I

Bedanke mich im Voraus für die Unterstützung.

Die Zieldatei heißt "Mitarbeiterstunden".

https://supportnet.de/forum/?qa=blob&qa_blobid=17718866035525233423

https://supportnet.de/forum/?qa=blob&qa_blobid=15112595723939820519

+1 Punkt
Beantwortet von m-o Profi (22.8k Punkte)

Hallo,

füge das folgende Makro in ein allgemeines Modul deiner Arbeitsmappe "Mitarbeiterstunden" ein. Ich gehe mal davon aus, die einzulesenden Tabellen immer gleich aufgebaut sind (Arbeitsmappenname beginnt immer mit 3stelliger Nummer, Tabellenname immer Monatszahl zweistellig am Ende, Datum immer Zeile 11 und Produktivität immer Zeile 40, erstes Datum ab Spalte F).

Nach dem Start wirst du aufgefordert, die einzulesende Datei und den einzulesenden Monat auszuwählen.

Sub import()
Dim wkbQuelle As Workbook
Dim wksQuelltab As Worksheet
Dim a As Integer
Dim w As Integer
Dim intProdnr As Integer
Dim intMonat As Integer
Dim Datei As Variant
Dim Rueck As Variant
Dim bExists As Boolean
Dim arrProd(30, 1) As Variant
Dim Suche As Range

'Bildschirmaktualisierung ausschalten:
Application.ScreenUpdating = False

'Datei-Öffnen Dialog aufrufen
Datei = Application.GetOpenFilename(FileFilter:="Microsoft Excel-Dateien (*.xl*), *.xl*", Title:="EINE Datei zum Öffnen auswählen")

'ausgewählte Datei öffnen
Workbooks.Open (Datei)
      
'Quelldatei an Variable zuweisen
Set wkbQuelle = ActiveWorkbook   'geöffnete Datei

'Produktnummer in variable schreiben
intProdnr = CInt(Left(wkbQuelle.Name, 3))

Eingabe:
'zu importierenden Monat abfragen; nur Zahlen als Eingabe zulassen
intMonat = Application.InputBox("Bitte geben Sie den zu importierenden Monat als Zahl (1 - 12) ein!", "Eingabe Monat", Type:=1)

'Prüfen, ob gültige Eingabe gemacht wurde
If intMonat < 1 Or intMonat > 12 Then
 'Falls nicht, dann Nachfrage, ob neuer Versuch
 Rueck = MsgBox("Ungültige Eingabe! Bitte wählen Sie eine Zahl zwischen 1 und 12 aus! Erneute Eingabe des Monats gewünscht?", 20, "Unzulässige Eingabe")
 If Rueck = vbNo Then
    'Abbruch, falls nein gedrückt wurde
    Exit Sub
   Else
    'ansonsten neuer Versuch
    GoTo Eingabe
  End If
End If

'Prüfen, ob Monat in Quelldatei existiert
With wkbQuelle
  For w = 1 To .Worksheets.Count
    If CInt(Right(.Worksheets(w).Name, 2)) = intMonat Then
      Set wksQuelltab = .Worksheets(w)
      bExists = True
      Exit For
    End If
  Next w
End With

'Fehlermeldung, falls Monat nicht gefunden wurde
If bExists = False Then
  MsgBox "Der Monat " & intMonat & " wurde nicht gefunden! Abbruch!", 16, "Fehler"
  Exit Sub
End If

'Daten aus Quelldatei in Array einlesen
With wksQuelltab
  'Inhalte der Spalten F bis AJ in Array einlesen
  For w = 6 To 36
    arrProd(w - 6, 0) = .Cells(11, w) 'Datum
    arrProd(w - 6, 1) = .Cells(40, w) 'Produktivitivität
  Next w
End With

'Quelldatei wieder schließen - ohne Speicherung
wkbQuelle.Close (False)

With ThisWorkbook.ActiveSheet
  'Produktnummer suchen
  For w = 12 To 15
    If .Cells(2, w).Value = intProdnr Then Exit For
  Next w
  For a = LBound(arrProd, 1) To UBound(arrProd, 1)
   'Daten aus Array in Tabelle schreiben
   'Nur Daten aus dem betreffenden Monat einfügen
   If arrProd(a, 0) <> "" And Month(arrProd(a, 0)) = intMonat Then
     'Datum suchen
     Set Suche = .Range("A:A").Find(arrProd(a, 0), LookIn:=xlValues)
     'Falls Datum gefunden, dann Produktivität eintragen
      If Not Suche Is Nothing Then .Cells(Suche.Row, w) = arrProd(a, 1)
   End If
  Next a
End With

'Bildschirmaktualisierung einschalten:
Application.ScreenUpdating = True

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von zagor Mitglied (166 Punkte)
Guten Morgen @M.O.,

der Code von der ersten Seite meines Threads funktioniert tadellos. Ich bin Dir sehr dankbar.

Ein Problem habe ich ; weil drei Schichten auf drei Arbeitsblätter verteilt sind , werden die Angaben der Schicht 2 & 3 des jeweiligen Arbeitsblatts nicht immer in die "Mitarbeiterstunden 2023" übertragen.

Dein Code befindet sich im Standardmodul des Schicht 1-Arbeitsblattes.

Warum werden die Daten der Schicht 2 & 3 nicht übertragen? Muss das Modul auch in den Arbeitsblätter vorhanden sein? Danke schön.
+1 Punkt
Beantwortet von m-o Profi (22.8k Punkte)
ausgewählt von zagor
 
Beste Antwort

Hallo,

der von mir geposteten Codes, auch der für die Übertragung der Stunden der einzelnen Schichten in das Übersichtsblatt gehört in ein allgemeines Modul, so dass dieser grds. ohne Probleme von allen Arbeitsblättern aus gestartet werden kann und auf diesen auch funktioniert.

Hast du den Code aber einem Button zugeordnet, so wird dieser i.d.R. im VBA-Projekt des betreffenden Arbeitsblattes hinterlegt.

Durch den Code werden die Werte der Zellen W3 bis W6 (Gesamt aller Mitarbeiterstunden) und M3 bis M6 (gesamt aller Mitarbeiteranzahlen) übertragen. Dort hast du ja in einer Art Zusammenfassung die Daten aus den einzelnen Schichten zusammengefasst. Wenn deine Verknüpfungen dort richtig sind, dann sollten auch die korrekten Summen aus den einzelnen Arbeitsblättern in die Gesamtübersicht übertragen werden.

Der Code greift immer auf das aktuelle Arbeitsblatt zurück. Es ist also im Prinzip ergal, ob du den Code aus dem Arbeitsblatt "Schicht 1", "Schicht 2" oder "Schicht 3" startest. Er darf nur nicht aus dem Arbeitsblatt "2023" gestartet werden.

Ansonsten stelle noch einmal eine Beispielarbeitsmappe mit dem Fehler zur Verfügung.

Gruß

M.O.

...