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

VBA Kopieren und Transponieren

VBA Kopieren und Transponieren
02.01.2022 20:24:16
Bernd
Ein guten Abend an die Runde,
man hat mir gesagt, dass ich hier gut aufgehoben bin mit meinem Problem.
Ich möchte im Reiter "Dienst" wo sich mein Dienstplan für das ganze Jahr befindet
diesen auf die 12 Reiter "Monate" runterbrechen bzw. für den jeweiligen Monat übertragen.
könnt Ihr mir da Helfen?
als Beispiel habe ich meine Datei zur Ansicht hinterlegt
https://www.herber.de/bbs/user/150100.xlsm

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Kopieren und Transponieren
02.01.2022 21:22:06
onur
"man hat mir gesagt, dass ich hier gut aufgehoben bin mit meinem Problem" - Jemand, der "VBA-gut" ist, braucht aber keine Hilfe bei so einem "Problem".
AW: VBA Kopieren und Transponieren
02.01.2022 23:25:51
Yal
Moin Bernd,
zwar ist diese Aufgabe mit VBA lösbar, aber es hat nicht die klare Wiederholungstruktur, die eine VBA-Verarbeitung einfach macht. Du bist schon weit genug mit VBA um das zu erkennen (daher würde ich die Anmerkung von Onur relativieren).
Wenn es nur eine einmalige Übertragung ist, überlege, ob es nicht mehr Sinn macht, diese per Hand zu machen.
Eine Schwierigkeit ist zum Beispiel, dass alle deine Monatenblätter an einem Montag anfangen.
Man könnte die erste unnötige Zeilen löschen, aber Du hast die Vorlage genau auf 31 Tage festgelegt. 6 volle Woche sind notwendig, um davor und danach "abzuschneiden" (was leichter ist, als nachträglich hinzufügen). Ausblenden wäre auch eine denkbare Alternative
Dann sind deine Monate immer mit eine Leerzeile nach dem Sonntag. Also Kopie "en bloc" geht nicht.
Als Vorbereitungsarbeit musst Du:
_ in jedem Monat der erste Tag im Monat in A1 erzeugen =DATWERT("1. "&H8&" 2022")
_ daraus der erste Montag im Monat =A1-WOCHENTAG(A1-2;3)+6
_ die passende Tage in jede Zeile der Monate
_ daraus eine gültige Datum erstellen
_ eine Vorgehensweise, jede Datum in jedem Monat durchzugehen, und daraus die Stelle im Blatt "Dienst" zu lesen und übertragen
_ und dann die nicht benötigte Zeilen auszublenden
Wenn Du soweit bist und es trotzdem klemmt, dann nur noch nach der "Problemstelle" im Forum fragen und dann wirst Du von Antworte überhäuft.
VG
Yal
Anzeige
AW: VBA Kopieren und Transponieren
05.01.2022 21:05:20
Bernd
Problemstelle:
Ich wollte das Datum dem Wochentag zuordnen.
Gestern hatte es Funktioniert und Heute sehe ich den Wald vor lauter Bäumen nicht.
Hilfe, Hilfe, Hilfe

Sub wrapper_make_time()
Call make_time(Sheets("Start").Range("P8").Text)
End Sub

Sub make_time(year As String)
Dim month, bebefore, before, curr_date, week_day As String
Dim curr As Range
Dim Feiertagsprüfung As Date
ActiveSheet.Unprotect
month = ActiveSheet.Range("H8").Text
curr_date = Format("01." & month & "." & year, "dd.mm.yyyy")
For i = 18 To 59
bebefor = ActiveSheet.Cells(i - 2, 2).Text
befor = ActiveSheet.Cells(i - 1, 2).Text
Set curr = ActiveSheet.Cells(i, 2)
week_day = ActiveSheet.Cells(i, 3).Text
If Len(before) > 1 And Len(week_day) > 1 Then
curr_date = Int(before) + 1 & Right(curr_date, 8)
If test_end_date(curr_date) Then
Exit Sub
End If
curr = Format(curr_date, "dd")
ElseIf Len(bebefore) > 1 And Len(week_day) > 1 Then
curr_date = Int(bebefore) + 1 & Right(curr_date, 8)
If test_end_date(curr_date) Then
Exit Sub
End If
curr = Format(curr_date, "dd")
ElseIf week_day = Format(curr_date, "ddd") Then
curr = Format(curr_date, "dd")
End If
'     Feiertagsprüfung = curr_date
'     If WorksheetFunktion.CountIf(Sheets("Feiertage").Range("C:C"), Feiertagsprüfung) > 0 Then
'         With ActiveSheet.Cells(i, 2).Font
'             .Color = -16763905
'             .TintAndShade = 0
'            End With
'         End If
Next i
End Sub

Function test_end_date(ByVal curr_date As String) As Integer
Dim my_test As Date
Dim res As Integer
res = 0
On Error GoTo err_month:
my_test = Format(curr_date, "dd.mm.yyyy")
If Day(my_test) > Day(Application.WorksheetFunktion.EoMonth(my_test, 0)) Then
res = 1
End If
test_end_date = res
Exit Function
err_month:
test_end_date = 1
End Function

Anzeige
AW: VBA Kopieren und Transponieren
06.01.2022 18:36:30
Yal
Hallo Bernd,
sorry, aber ich komme nicht ganz klar mit dem von Dir gegebenen Code.
Ich habe einfach die Idee von meinem letzten Beitrag im Code umgesetzt.
Nur folgende Anpassung muss vorher stattfinden: im Blatt "Muster_Blatt" muss eine zusätzliche Woche eingefügt werden. Dafür dürfen die letzten 2 einzelne Tageun die entsprechende Wochensummenzeile gelöscht werden. Die Monatsummenzeile ist dann die Zeile 66.
Lösch vorher alle Blätter Januar bis Dezember. Diese werden auf Basis von "Muster_Blatt" neuerzeugt.

Sub AlleMonate_erstellen()
Dim i As Integer
Dim Monat As String
Dim Jahr As Integer
'Jahr lesen und prüfen
Jahr = CInt(Sheets("Start").Range("S1").Value)
If Jahr  2100 Then
MsgBox "Gegebenes Jahr """ & Jahr & """ ist nicht tragbar.", vbExclamation, "Tschüss"
Exit Sub
End If
'für alle Monate
For i = 1 To 12
Monat = Format(DateSerial(Jahr, i, 1), "MMMM") 'erste Buchstabe gross
Sheets("Muster_blatt").Copy after:=Sheets(Sheets.Count) 'Kopie vom Muster
Sheets(Sheets.Count).Name = Monat 'Name vergeben
Worksheets(Monat).Range("H8") = Monat 'Name reinschreiben
Monat_setzen Jahr, Monat 'Monat setzen
Next
End Sub
Private Sub Monat_setzen(ByVal Jahr As Integer, ByVal Monat As String)
Dim Zeile As Integer
Dim aktTag As Date
aktTag = DateValue("1. " & Monat & " " & Jahr)
With Worksheets(Monat)
Zeile = 17 + Weekday(aktTag, vbMonday) 'Startzeile ermitteln
If Zeile > 18 Then .Rows("18:" & Zeile - 1).Hidden = True 'unnötige Zeilen am Anfang ausblenden
Do
.Cells(Zeile, 2) = Day(aktTag) 'Tagesnummer setzen
.Cells(Zeile, 1) = Worksheets("Dienst").Cells(Month(aktTag) * 9 - 4, Day(aktTag) + 2).Value 'Dienst für den Tag abholen
Zeile = Zeile + 1 - CInt(Weekday(aktTag) = vbSunday) 'Zeile + 1, bei Sonntag + 2
aktTag = aktTag + 1 'Tag +1
Loop While Format(aktTag, "MMMM") = Monat 'Weiter solang aktTag noch im selbe Monat
Select Case Zeile
Case Is = 58
.Rows(Zeile & ":64").Hidden = True 'Teil der 6.Woche (Trifft in 2022 nur Januar und Mai)
End Select
End With
End Sub
VG
Yal
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige