Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
972to976
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
972to976
972to976
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Zellen via VBA verbinden, aber wie...

Zellen via VBA verbinden, aber wie...
24.04.2008 19:32:46
Uwe
Nicht, das ich schon wieder eine Frage hätte:
In diversen Tabellenblättern einer Arbeitsmappe habe ich in Zelle A9:A39 (Tage 1-31) bzw. B9:B39 (Wochentage Mo-So) einen Monatskalender abgebildet. Hier liegt nicht das Problem. Vielmehr geht es darum, das jeder Kalendertag eines Monats im Laufe der Zeit ja auch ein Sonntag sein kann. Ist z.B. der Wochentag der Zelle B19 ein Sonntag, so müßten die Zellen C13:C19 verbunden sein. Es gilt hier also, das die Zellen C9:C39 in Abhängigkeit der Kalenderwochen (Mo-So) miteinander verbunden sein müssen. Dieses gilt entsprechen für jede Kalenderwoche... Zellen hingegen fest miteinander zu verbinden würde ich gewöhnlich z.B. wie folgt erledigen:
Range("A1:B19").Merge
Zu allem Überfluß ist zudem in den dann verbundenen Zellen eine einfache Berechnung durchzuführen. Wie verbinde ich also Zellen in Abhängigkeit vom Monatskalender so, das ich diese z.B. für die automatische Berechnung von Wochensollstunden weiternutzen kann?
Wie war das doch gleich mit dem Wald und den Bäumen? Ich blick nicht wirklich durch...Hiiilfeee!!!
Besten Dank für Euer Interesse, Eure Mühe des Rätsels Lösung zu finden.
Gruß
Uwe
PS: Der Monatsletzte ist nunmal nicht immer ein Sonntag. Der "Rest" der Kalendertage, eben vor dem ersten Sonntag im Folgemonat müßte dann ebenso in Spalte C verbunden sein! Tja...
PPS: Des Rätsels Lösung wird ausschließlich via VBA gesucht... Dies als Hinweis für all diejenigen, dies wissen wollen.

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zellen via VBA verbinden, aber wie...
24.04.2008 19:57:08
Reinhard
Hi Uwe,
mit den verbundenen zellen, muß das sein? langt da nicht eine optische Verbundenheit, Rahmen, Farbe?
Willst du das Ergebnis der Wochenstunden in Vba oder soll es in eine zelle rechts neben dem jeweiligen Sonntag durch Vba eingetragen werden, oder eine entsprechende Formel eingetragen werden?
Was soll passieren wenn der 3te Sonnatg ist, soll dann als Wochensumme nur der 1te=Fr genommen werden, oder noch die anderen tage aus dem Vormonat dazu.
Gleiches Problem ist ja am Monatsende.
Gruß
Reinhard

AW: Zellen via VBA verbinden, aber wie...
24.04.2008 20:15:03
Uwe
Hallo Reinhard!
Ja, LEIDER!!! MUSS sein. Es geht der Übersichtlichkeit halber absolut nicht anders, als diese Zellen miteinander zu verbinden.
Das Ergebnis soll mit Hilfe von VBA in den verbundenen Zellen (also C9:C39, jeweils die des Sonntags) eingetragen werden. Formeln dürfen NICHT genutzt werden, da bereits der gesamte "Rest" in VBA abgebildet ist...
Wenn z.B. der Monatsdritte ein So ist, dann gilt die Woche wie in Deinem Beispiel von Fr-So!!! Ist der Monatsvierte der So dann von Do-So usw.
Ähnlich soll`s sein, so z.B. der viertletzte Tag des Monats ein Sonntag ist... Dann wären hier die Zellen in Spalte C für Mo Di Mi zu verbinden. Die Summe der Stunden, die sich später aus dieser Aufrechnung ergeben, fließen in den Datenexport/Datenimport des Folgemonats. Das aber ist für mich kein Problem.
Mir gehts "nur" (ist schon "schlimm" genug?) um diese verbundenen Zellen und die Zellen die das Ergebnis meiner Berechnung "liefern".
Ganz ganz lieben Dank für Deine Hilfe. Wäre SUUUPER klasse wenn Du DAS hinbejkommst.
Uwe
PS: Die Berechnung (Ergebnis z.B. dann in den verbundenen Zelle (C9:C15) wäre z.B. 38:30 Std (C8) - Summe (F9:F15)
PPS: Hoffentlich hab ich`s hinbekommen mich diesmal mehr verständlich auszudrücken. Na dann...

Anzeige
AW: Zellen via VBA verbinden, aber wie...
24.04.2008 20:25:00
Reinhard
Hallo Uwe,
ich kann das so machen, aber wenn in C9-C13 die einzelnen Tagesstunden stehen un ich dann C9-C15 verbinde und in C15 die Summe eintrage, sind die vorgerigen Daten alle weg, ist das von dir eingeplant?
Gruß
Reinhard

AW: Zellen via VBA verbinden, aber wie...
25.04.2008 04:05:00
Wuxinese
Servus Uwe,
ich hoffe, ich hab alles richtig verstanden. Ich hab mal ein einfaches Makro gebastelt, das das macht, wie ich verstanden habe, was Du willst :)
https://www.herber.de/bbs/user/51852.xls
Kommt das hin?
Gruss und schoenes Wochenende
Rainer

AW: Zellen via VBA verbinden, aber wie...
26.04.2008 08:18:00
Uwe
Hallo Rainer!
Vielen Dank für Deine Datei, Deine Mühe. Inzwischen habe ich die von mir geradewegs so benötigte Routine meinen genauen Bedürfnissen angepasst:
Option Explicit

Private Sub CommandButton1_Click()
Dim i As Integer, run As Integer, y As Integer, q As Integer
On Error Resume Next
With Tabelle1
run = .Range("a" & .Rows.Count).End(xlUp).Row
.Range("C9:C39" & run).ClearContents
.Range("C9:C39").UnMerge
For i = run To 2 Step -1
If .Cells(i, 2) = "Mo" Then
If Month(.Cells(i, 1)) = Month(.Cells(run, 1)) Then
.Range("C" & i & ":C" & run).Merge
.Range("C" & i) = Application.WorksheetFunction.Sum(.Range("G" & i & ":f" & run))
Else
For y = i To run
If Month(.Cells(y, 1))  Month(.Cells(run, 1)) Then q = y + 1
Next y
.Range("C" & q & ":C" & run).Merge
.Range("C" & q) = Application.WorksheetFunction.Sum(.Range("G" & q & ":G" & run))
.Range("C" & i & ":C" & q - 1).Merge
.Range("C" & i) = Application.WorksheetFunction.Sum(.Range("G" & i & ":G" & q - 1))
End If
run = i - 1
If run  1 Then
.Range("C1:C" & run).Merge
.Range("C1") = Application.WorksheetFunction.Sum(.Range("G1:G" & run))
Exit For
End If
End If
Next i
End With
End Sub


Wie Du bemerkst, benötige ich die "Vergabe" der Wochentage nicht. Diese sind nämlich durch den Monatskalender vorgegeben. Lange Rede kurzer Sinn.
In Deiner Routine hat sich wohl ein Fehler eingeschlichen, den ich so nicht erkenne! Und zwar funktioniert alles perfekt so ich denn Deine Tabelle unverändert lasse. Verschiebe ich Sie hingegen z.B. von A1 folgende auf A9 usw. werden die Zellen, die vor dem ersten Montag des Monats liegen nicht miteinander verbunden, bzw. die erforderliche Summe dann nicht gerechnet. Hingegen funktioniert das Verbinden am Ende eines Kalendermonats stets perfekt.
Deine Routine orientiert sich an den Montagen eines Monats... Soweit habe ich das erkannt. So seltsam das klingt funktioniert Deine Routine immer dann, wenn Du sie z.B. nur von Zeile 1 nach Zeile 2 verschiebst. Nicht aber, wenn mehr als sieben Zeilen zwischen dem Tabellenanfang und dem ersten Montag des Monats liegen.
Wär super so Du da auf Fehlersuche gehst. Wie gesagt, ich seh jetzt erst recht vor lauter Wald die Bäume nicht mehr.
Gruß
Uwe

Anzeige
AW: Zellen via VBA verbinden, aber wie...
26.04.2008 11:27:31
Reinhard
Hi Uwe,

Option Explicit
Private Sub CommandButton1_Click()
Dim Von As Long, Bis As Long, Zei As Long, Anf As Long, Ende As Long
With Worksheets("Tabelle1")
Anf = IIf(.Range("A2") = "", .Range("a2").End(xlDown).Row, 2)
Ende = .Range("a" & .Rows.Count).End(xlUp).Row
.Range("B:C").ClearContents
.Columns(3).UnMerge
For Zei = Anf To Ende
.Cells(Zei, 2) = WeekdayName(Weekday(.Cells(Zei, 1), vbMonday), , vbMonday)
Next Zei
For Zei = Anf To Ende
Von = Zei
While Month(.Cells(Zei, 1)) = Month(.Cells(Zei + 1, 1)) And Weekday(.Cells(Zei, 1),  _
vbMonday)  7
Zei = Zei + 1
If Zei > Ende Then Exit For
Wend
.Range("C" & Von & ":C" & Zei).Merge
.Range("C" & Von) = Application.WorksheetFunction.Sum(.Range("F" & Von & ":f" & Zei))
Next Zei
If Zei > Ende Then
.Range("C" & Von & ":C" & Zei - 1).Merge
.Range("C" & Von) = Application.WorksheetFunction.Sum(.Range("F" & Von & ":f" & Zei))
End If
End With
End Sub

Gruß
Reinhard

Anzeige
AW: Zellen via VBA verbinden, aber wie...
26.04.2008 14:26:00
Uwe
Hallo Reinhard!
Vielen Dank für Deine Mühe. Leider gibt`s immer noch zwei Probleme, so ich die Prozedur ins Programm "einbaue". Du orientierst Dich in der Routine immer noch an den Wochentagen, die Du anhand des Datums in Spalte A festlegst. Sowohl Datum als auch Wochentage stehen bei mir ja bereits im Vorfeld fest.
So gesehen sollte sich Deine Prozedur "nur" an den Angaben der Zellen B9:B39 orientieren. Hierin sind ja bereits die Kalendertage (Mo-So) festgelegt.
Füge ich Deine überarbeitete Prozedur, die hinsichtlich der Tage am Monatsanfang hervorragend funktioniert, ein, gibt`s die Fehlermeldung, das die Monatstage in der Spalte A fehlen. Die Zellen A9:A39 behinhalten dagegen "nur" die Werte 1-31.
Wäre irre toll, so Du diese Prozedur für mich einfach von den Wochentagen (Mo-So) der Zellen B9:B39 abhängig hinkriegen würdest...
Besten Dank für Deine Mühe.
Lieben Gruß
Uwe
PS: Inzwischen habe ich einen Gedankenfehler hinsichtlich der erforderlichen Berechnungen entdeckt. Das aber würde ich zunächst selber versuchen hinzubiegen.

Anzeige
AW: Zellen via VBA verbinden, aber wie...
28.04.2008 08:07:00
Wuxinese
Servus Uwe,
da ist keine grosse Fehlersuche notwendig. Du musst nur fuer alle Aktionen sicherstellen, dass sie dann nur in den Zeilen 9 - 39 stattfinden - also gar kein Hexerwerk. Ich habe das mal veraendert, so dass es jetzt funktioniert, wie ich meine dass Du es willst :-)
Ich habe jetzt noch eine kleine Schleife am Anfang eingefuegt, die jeweils prueft, ob in Spalte A die Zeile 39 leer ist. Kann ja passieren bei Monaten mit nur 30 bzw. 28 Tagen. Dann faengt er entsprechend erst am letzten Tag des Monats an.
Ausserdem hab ich jetzt 2 Vorschlaege fuer Dich. Wenn naemlich auf einem Tabellenblatt lediglich ein Monat steht, z. B. nur der April und sichergestellt ist, dass dann kein Tag aus dem Mai dabei ist, dann kann man das ganze etwas vereinfachen, weil die umstaendliche Monatspruefung wegfaellt (siehe Vorschlag 2).
Ich hoffe, dass ich Dir damit helfen konnte. Gib bitte kurz Bescheid.
Gruss
Rainer
Vorschlag 1:

Private Sub CommandButton1_Click()
Dim i As Integer, run As Integer, y As Integer, q As Integer
On Error Resume Next
With Tabelle1
For i = 39 To 9 Step -1
If Not (IsEmpty(.Cells(i, 1))) Then
run = i
Exit For
End If
Next i
.Range("C9:C39").ClearContents
.Range("C9:C39").UnMerge
For i = run To 9 Step -1
If .Cells(i, 2) = "Mo" Then
If Month(.Cells(i, 1)) = Month(.Cells(run, 1)) Then
.Range("C" & i & ":C" & run).Merge
.Range("C" & i) = _
Application.WorksheetFunction.Sum(.Range("G" & i & ":G" & run))
Else
For y = i To run
If Month(.Cells(y, 1))  Month(.Cells(run, 1)) Then q = y + 1
Next y
.Range("C" & q & ":C" & run).Merge
.Range("C" & q) = _
Application.WorksheetFunction.Sum(.Range("G" & q & ":G" & run))
.Range("C" & i & ":C" & q - 1).Merge
.Range("C" & i) = _
Application.WorksheetFunction.Sum(.Range("G" & i & ":G" & q - 1))
End If
run = i - 1
If run  8 Then
.Range("C9:C" & run).Merge
.Range("C9") = Application.WorksheetFunction.Sum(.Range("G9:G" & run))
Exit For
End If
End If
Next i
End With
End Sub


Vorschlag 2:


Private Sub CommandButton1_Click()
Dim i As Integer, run As Integer
On Error Resume Next
With Tabelle2
For i = 39 To 9 Step -1
If Not (IsEmpty(.Cells(i, 1))) Then
run = i
Exit For
End If
Next i
.Range("C9:C39").ClearContents
.Range("C9:C39").UnMerge
For i = run To 9 Step -1
If .Cells(i, 2) = "Montag" Then
.Range("C" & i & ":C" & run).Merge
.Range("C" & i) = _
Application.WorksheetFunction.Sum(.Range("G" & i & ":G" & run))
run = i - 1
If run  8 Then
.Range("C9:C" & run).Merge
.Range("C9") = Application.WorksheetFunction.Sum(.Range("G9:G" & run))
Exit For
End If
End If
Next i
End With
End Sub


Anzeige
AW: Zellen via VBA verbinden, aber wie...
28.04.2008 16:33:54
Uwe
Hallo Rainer!
PERFEKT!!!!! Deine Variante 2 ist GENAU die, nach der ich gesucht habe. Getestet... PASST. Und doch, so`n gaaanz kleines Problem hab ich da noch, äh, sogar zwei. Sorry:
1.) Nachdem Zellen verbunden, Berechnungen durchgeführt, sind mitunter einige Rahmen, die zwischen den einzelnen Kalenderwochen nicht da. Die Wochen sind perfekt getrennt. Sehen aber unschön aus, da nicht durch Linien voneinander getrennt. Daher die Frage: Woher kommt das? Ließe sich bestimmt ganz leicht lösen?
2.) Zur Zeit bildet Deine Routine ja völlig richtig die jeweiligen Summen aus der Spalte G. Hinzu kommen allerdings auch entsprechend die Werte der Spalte I. Diese daraus resultierrende Summe muß dann je Woche von dem Wert der Zelle C7 abgezogen werden.
Sorry. Aber ich fange erst an, via VBA "rechnen" zu lernen.
Ganz ganz lieben Gruß
Uwe
PS: BESTEN Dank für Deine Mühe, Deine Bereitschaft `nem "Greenhorn" auf die Sprünge helfen zu wollen!

Anzeige
AW: Zellen via VBA verbinden, aber wie...
30.04.2008 03:57:46
Wuxinese
Servus Uwe,
beim Berechnen mit VBA funktioniert das eigentlich genauso wie mit einer Formel. Der Code rechnet jetzt folgendermassen: C7-Summe(G*:G*)-Summe(I*:I*) wobei der Stern jeweils fuer die erste bzw. letzte Reihe der verbundenen "Grosszelle" steht.
Ausserdem wird jetzt noch ein Rahmen um die verbundenen Zellen gesetzt. Wenn Du den Rahmen noch formatieren musst, kannst Du unter der VBA-Hilfe nachschauen. Da findest Du Informationen zum BorderAround oder Border-Objekt und welche Moeglichkeiten zur Formatierung VBA bietet. So und mit Hilfe des Forums hab ich mir auch meine VBA-Kenntnisse angeeignet. Ist genauso wie beim Skifahren: Sieht bei mir zwar nicht immer elegant aus und auch die Technik ist nicht die Beste, aber runterkommen tu ich doch immer :-)
Gib kurz Bescheid, ob alles funktioniert, wie es soll!
Viele Gruesse und einen schoenen Feiertag
Rainer

Private Sub CommandButton1_Click()
Dim i As Integer, run As Integer
On Error Resume Next
With Tabelle1
For i = 39 To 9 Step -1
If Not (IsEmpty(.Cells(i, 1))) Then
run = i
Exit For
End If
Next i
.Range("C9:C39").ClearContents
.Range("C9:C39").UnMerge
For i = run To 9 Step -1
If .Cells(i, 2) = "Mo" Then
.Range("C" & i & ":C" & run).Merge
.Range("C" & i & ":C" & run).BorderAround , , xlColorIndexAutomatic
.Range("C" & i) = .Cells(7, 3) - _
Application.WorksheetFunction.Sum(.Range("G" & i & ":G" & run)) - _
Application.WorksheetFunction.Sum(.Range("I" & i & ":I" & run))
run = i - 1
If run  8 Then
.Range("C9:C" & run).Merge
.Range("C9:C" & run).BorderAround , , xlColorIndexAutomatic
.Range("C9") = .Cells(7, 3) - _
Application.WorksheetFunction.Sum(.Range("G9:G" & run)) - _
Application.WorksheetFunction.Sum(.Range("I9:I" & run))
Exit For
End If
End If
Next i
End With
End Sub


Anzeige
AW: Zellen via VBA verbinden, aber wie...
01.05.2008 09:57:21
Uwe
Hallo Rainer!
Deine Routine funktioniert PERFEKT!!! Geradewegs so, wie von mir beabsichtigt. O.k. Inzwischen habe ich diese aufgeteilt... In eben der Festsetzung der Zellen, incl. Rahmen drumherum und Berechnungen. Das aber hab ich gar selber problemlos hinbekommen. Soweit richtig klasse... Deine Lösung!!!
Apropos Berechnungen. Inzwischen habe ich die Rotine soweit kopiert, das auch die Zellen der Spalten AQ und AT ebenso miteinander verbunden werden wie die Zellen der Spalte C. Die Berechnung des Ergebnisses der Spalte AQ hingegen ist eine etwas andere. Diese bekomm ich nur fehlerfaft hin! In die verbundenen Zellen der Spalte AQ soll das Ergebnis aus:
Wert aus Spalte C + Werte der Spalte AP - Werte der Spalte H (jeweils wiederum bezogen auf die KW)
Ich denke mal, das ich`s dann hinsichtlich der erforderlichen Berechnungen geschafft habe, bzw. andere dann analog selber hinkriege...
Wäre da nicht das "Problem" das meist Monatsanfang bzw. - ende keine vollständigen KW sind. Wie diese Lösung aber generell aussehen soll, werde ich mir erst einmal erarbeiten, bevor ich hier wieder wen "nerve"...
Erst einmal insbesondere Dir vielen, vielen Dank für Deine Mühe, Deine hervorragende Lösung!!!
Bis später? (Gerne mit diesem einen Wink mit dem Telegraphenmast hinsichtlich der "neuen" Berechnung.)
Danke
Uwe
PS: Wer sich nicht traut, auch mal "dumm" zu fragen, bleibt... "unwissend". Und mich zu schämen, hier zu fragen? Neee, geht gar nicht...
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige