Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
968to972
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
968to972
968to972
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Code-Problem

Code-Problem
18.04.2008 09:44:40
Chantal
Guten Morgen,
ich habe vor einiger Zeit diesen Code im Forum gefunden der auch wunderbar funktioniert
nur eines ist noch ein Problem.
Es sollte so sein das ich die Monate nicht wahllos neu erstellen kann sondern wenn der Monat
Februar noch nicht erstellt ist sollte es nicht möglich sein den März oder einen anderen Monat zu erstellen.
(Der Januar ist schon vorgegeben)
Ich würde mich sehr freuen wenn mir ein Profi helfen könnte.
https://www.herber.de/bbs/user/51684.txt
Viele Grüsse
Chantal

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Code-Problem
18.04.2008 10:51:00
gerwas
Hallo
bin zwar kein Profi aber vielleicht hilft dir das hier:
(einfügen in deinen code)
Private Sub CommandButton1_Click()
Dim wks As Worksheet, lngZ As Long, VormonatIstDa As Boolean
Sheets("Hauptzähler").Unprotect Password:="Felix"
For Each wks In ActiveWorkbook.Worksheets
If wks.Name = Format(DateSerial(Year(Date), Month(Date) - 3, 1), "MMMM YYYY") Then
Unload UserForm4
UserForm7.Show
'MsgBox "Der Monat existiert schon", vbCritical + vbOKOnly, "Fehler"
Exit Sub
End If
Next
VormonatIstDa = False
For Each wks In ActiveWorkbook.Worksheets
If wks.Name = Format(DateSerial(Year(Date), Month(Date) - 4, 1), "MMMM YYYY") Then
VormonatIstDa = True
Exit For
End If
Next
If Not VormonatIstDa Then
MsgBox "Kann Blatt nicht erstellen, Vormonat fehlt"
Exit Sub

Gruß Gerwas

Anzeige
AW: Code-Problem
18.04.2008 11:39:59
Erich
Hallo Chantal,
könnte es sein, dass du den Code von hier hast? https://www.herber.de/forum/archiv/960to964/t963569.htm
Wie auch immer, so ganz verstehe ich ihn (in deiner Version) nicht.
In CommandButton1_Click() steht

ActiveSheet.Name = Format(DateSerial(Year(Date), Month(Date) - 3, 1), "MMMM YYYY")
MsgBox "Monat erfolgreich erstellt"
Sheets("Hauptzähler").Select
Range("C1").FormulaR1C1 = "Feb-2008"

Damit wird, wenn es zufällig gerade Februar ist, wegen "Month(Date) - 3" ein Blatt "November 2007" erstellt.
Darunter schreibst du aber "Feb-2008".
Ich vermute, du willst bei einem Button unabhängig vom Tagesdatum (Date) immer den selben Monat erstellen, also mit CommandButton1 immer einen Februar.
Zum zweiten ist es sehr umständlich, den (fast) gleichen Code 11 mal hinzuschreiben.
Das geht einfacher, wenn du beim CommandButtonX_Click() nur den gewünschten Monat schreibst
und damit eine andere Prozedur aufrufst, die die Arbeit macht.
So könnte das aussehen:
In den Code der Userform:


Option Explicit
Private Sub CommandButton1_Click()
LegeAn 2
End Sub
Private Sub CommandButton3_Click()
LegeAn 3
End Sub
Private Sub CommandButton4_Click()
LegeAn 4
End Sub
'usw. bis
Private Sub CommandButton12_Click()
LegeAn 12
End Sub
Private Sub CommandButton13_Click()
Unload Me   ' wenn dieser Code zur UserForm4 gehört
End Sub
Private Sub UserForm_Click()
If Val(Application.Version) >= 9 Then
hwndForm = FindWindow("ThunderDFrame", Me.Caption)
Else
hwndForm = FindWindow("ThunderXFrame", Me.Caption)
End If
bCaption = False
SetUserFormStyle
End Sub

In ein allgemeines Modul kannst du das schreiben:


Option Explicit
Sub LegeAn(intMon As Integer)
Dim lngZ As Long, intM As Integer
' Hier wird geprüft, ob die früheren Monate schon angelegt sind:
For intM = 1 To intMon - 1
If Not SheetExists(Format(DateSerial(Year(Date), intM, 1), "MMMM YYYY")) Then
Unload UserForm4
MsgBox "Der Monat " & intM & " existiert noch nicht", _
vbCritical + vbOKOnly, "Fehler"
Exit Sub
End If
Next intM
' Hier wird geprüft, ob der gewünschte Monate schon angelegt ist:
If SheetExists(Format(DateSerial(Year(Date), intMon, 1), "MMMM YYYY")) Then
Unload UserForm4
UserForm7.Show
'     MsgBox "Der Monat " & intMon & " existiert schon", _
vbCritical + vbOKOnly, "Fehler"
Exit Sub
End If
With Sheets("Hauptzähler")
.Unprotect Password:="Felix"
.Copy Before:=Sheets(1)
ActiveSheet.Name = Format(DateSerial(Year(Date), intMon, 1), "MMMM YYYY")
MsgBox "Monat erfolgreich erstellt"
.Select
Range("C1") = Format(DateSerial(Year(Date), intMon, 1), "MMM-YYYY")
For lngZ = 33 To 30 Step -1
If Not IsEmpty(Cells(lngZ, 3)) Then
Cells(lngZ, 3).Copy Cells(3, 3)
Exit For
End If
Next lngZ
Range("C4:C33").ClearContents
Range("B4").Select
ActiveCell.FormulaR1C1 = "=IF(ISNUMBER(RC[1]),RC[1]-R[-1]C[1],"""")"
Selection.AutoFill Destination:=Range("B4:B33"), Type:=xlFillDefault
Range("B34").FormulaR1C1 = "=SUM(R[-30]C:R[-1]C)"
Unload UserForm4
.Protect Password:="Felix"
End With
End Sub
Function SheetExists(strName As String) As Boolean
Dim intInd As Integer
On Error GoTo XEnd
intInd = Sheets(strName).Index
SheetExists = True
XEnd:
On Error GoTo 0
End Function

Das ist jetzt nicht getestet - ich will deine Umgebung nicht nachbauen.
Wenn es Probleme gibt, wäre eine Beispielmappe hilfreich.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Code-Problem
21.04.2008 16:40:01
Chantal
Hallo Erich,
leider hat es etwas gedauert, ich kann jetzt weiter an dem File arbeiten
melde mich noch einmal bei dir wenn ich es eingebaut habe.
Danke Chantal

AW: Code-Problem
22.04.2008 08:41:58
Chantal
Hallo Erich,
ich habe es ausprobiert es funktioniert wunderbar,
gibt es noch die Möglichkeit unten genannte Erweiterung einzubauen
wenn ich es ja so ausführe schreibt es mir immer den Monat in Zelle C1.

Private Sub CommandButton9_Click()
LegeAn 8
Range("C1").Select
ActiveCell.FormulaR1C1 = "Sep-2008"
End Sub


Vielen Dank für deine Bemühungen
Gruss
Chantal

Anzeige
AW: Code-Problem
22.04.2008 10:09:01
Erich
Hallo Chantal,
das Select ist überflüssig, oft auch schädlich.
Und du willst ja keine Formel in die Zelle schreiben, sondern einen konstanten Wert,
also ....Value = "Sep-2008" statt ....FormulaR1C1 = "Sep-2008"
Value kann man hier weglassen, das würde man dann so schreiben:

Private Sub CommandButton9_Click()
LegeAn 8
Range("C1") = "Sep-2008"
End Sub

Du schreibst "schreibt es mir immer den Monat in Zelle C1". Ist es das, was es tun soll?
In der Routine LegAn gibt es eine Zeile
Range("C1") = Format(DateSerial(Year(Date), intMon, 1), "MMM-YYYY")
Dadurch wird in C1 im Blatt "Hauptzähler" der jeweilige Monat eingetragen.
Warum also nochmal in CommandButtonX_Click()?
Noch eine Frage: Warum rufst du hier LegeAn mit dem Parameter 8 auf? Geht es hier nicht um Monat 9?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Code-Problem
22.04.2008 10:57:00
Chantal
Hallo Erich,
danke das du dich meldest,
im Tabellenblatt Hauptzähler ist in Zelle C1 "Januar 2008" schon vorgegeben
wenn ich nun den Monat Februar 2008 anlege sollte im Tabellenblatt Hauptzähler in C1 "Februar 2008" stehen.
Im Tabellenblatt "Januar 2008" das dann ja angelegt wird muss in C1 "Januar 2008" dies funktioniert.
Gruss
Chantal

AW: Code-Problem
22.04.2008 12:31:25
Erich
Hallo
das verstehe ich nicht. Mit den Zeilen (aus LegeAn)

With Sheets("Hauptzähler")
.Unprotect Password:="Felix"
.Copy Before:=Sheets(1)
ActiveSheet.Name = Format(DateSerial(Year(Date), intMon, 1), "MMMM YYYY")
MsgBox "Monat erfolgreich erstellt"
.Select
Range("C1") = Format(DateSerial(Year(Date), intMon, 1), "MMM-YYYY")

wird
- "Hauptzähler" entschützt und kopiert
- das neue Blatt (ActiveSheet) umbenannt in den Monat
- "Hauptzähler" ausgewählt (Select)
- in "Hauptzähler" die Zelle C1 mit dem Monat MMM-YYYY beschrieben.
Hast du den Code geändert eingesetzt? Vielleicht lädst du mal deine Mappe hoch.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Code-Problem
22.04.2008 14:49:00
Chantal
Hallo Erich,
da hat sich bei mir ein Fehler eingeschlichen soweit funktioniert es.
Das einzige Problem ist noch wenn ich einen oder mehrere Monate überspringe
bekomme ich eine Fehlermeldung das der vorhergegangene Monat noch nicht existiert
was auch OK ist es wird auch kein Tabellenblatt angelegt was wiederum auch Ok ist
aber in dem Tabellenblatt "Hauptzähler" wird der jeweilige Monat in C1 eingetragen.
Grüssle
Chantal

AW: Code-Problem
22.04.2008 16:50:00
Erich
Hallo Chantal,
zum 1. Teil:

Das einzige Problem ist noch wenn ich einen oder mehrere Monate überspringe
bekomme ich eine Fehlermeldung das der vorhergegangene Monat noch nicht existiert
was auch OK ist es wird auch kein Tabellenblatt angelegt was wiederum auch Ok ist"

Dann ist das doch kein Problem, oder? (Das war deine Eingangsfrage hier am 18.04.)
zum 2. Teil:


aber in dem Tabellenblatt "Hauptzähler" wird der jeweilige Monat in C1 eingetragen.

Ja, soll das denn nicht so sein?
Aus meiner Sicht ist in der Prozedur


Private Sub CommandButton9_Click()
LegeAn 8
Range("C1") = "Sep-2008"
End Sub

die Zeile
Range("C1") = "Sep-2008"
für überflüssig und schädlich. Was fehlt, wenn du sie löschst?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Code-Problem
23.04.2008 07:36:14
Chantal
Hallo Erich,
diese Zeile habe ich wieder raus genommen ( Range("C1") = "Sep-2008").
Wenn ich den Februar anlege funktioniert alles wunderbar wenn ich aber den Monat März überspringe
stattdessen versehentlich den April anlege kommt die Fehlermeldung das der Monat 2 nicht existiert
also kann er nicht angelegt werden was auch richtig ist jedoch schreibt es trotzdem den Monat
"April 2008" in die Zelle C1 was nicht korrekt ist.
Danke für deine Bemühungen
Gruss
Chantal

AW: Code-Problem
23.04.2008 12:27:00
Erich
Hi Chantal,
hast du diese Zeile in den Prozeduren zu ALLEN Monaten rausgenommen?
In der Routine LegeAn kann C1 nicht beschrieben werden, wenn kein neues Blatt angelegt wird,
weil der Vormonat fehlt oder der Monat schon erstellt ist.
In diesen Fällen wird die Routine VOR evtl. Änderungen in"Hauptzähler" per Eit Sub verlassen.
Das kann es also nicht sein.
Setz doch mal einen Haltepunkt im CommandButton6_Click und geh dann mit F8 schrittweise den Code durch.
Dabei müsstest du die Codezeile finden, die C1 beschreibt.
Alternative: Du lädst mal deine Mappe hier hoch.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Code-Problem
23.04.2008 14:31:21
Chantal
Hi Erich,
anbei die Mappe, lege bitte den Monat Februar neu an und überspringe den März
lege den April an dann wird im Tabellenblatt "Hauptzähler in C1 "April 2008"geschrieben.
https://www.herber.de/bbs/user/51792.xls
Gruss
Chantal

AW: Code-Problem
23.04.2008 18:44:00
Erich
Hi Chantal,
den Eintrag in C1 in Hauptzähler hast du hier produziert:

Private Sub CommandButton3_Click()
LegeAn 2
Sheets("Hauptzähler").Unprotect Password:="Felix"
Range("C1").Select
ActiveCell.FormulaR1C1 = "Mar-2008"
Sheets("Hauptzähler").Protect Password:="Felix"
End Sub

Ich hatte dir vorgeschlagen:


Private Sub CommandButton3_Click()
LegeAn 3
End Sub

Außerdem hatte ich dir geschrieben:


das Select ist überflüssig, oft auch schädlich.
Und du willst ja keine Formel in die Zelle schreiben, sondern einen konstanten Wert,
also ....Value = "Sep-2008" statt ....FormulaR1C1 = "Sep-2008"
Value kann man hier weglassen, das würde man dann so schreiben:
Private Sub CommandButton9_Click()
LegeAn 8
Range("C1") = "Sep-2008"
End Sub
Du schreibst "schreibt es mir immer den Monat in Zelle C1". Ist es das, was es tun soll?
In der Routine LegAn gibt es eine Zeile
Range("C1") = Format(DateSerial(Year(Date), intMon, 1), "MMM-YYYY")
Dadurch wird in C1 im Blatt "Hauptzähler" der jeweilige Monat eingetragen.
Warum also nochmal in CommandButtonX_Click()?

Geschrieben hatte ich dir auch,
dass der Aufruf von LegeAn reicht und dahinter keine Zuweisung an C1 erfolgen sollte.
Nun war ich etwas verwundert, als ich deinen aktuellen Code zu CommandButton3_Click() sah.
Schau dir diese Mappe mal an, da läuft es wohl so, wie du das möchtest:
https://www.herber.de/bbs/user/51805.xls
Noch eine allgemeine Bemerkung: Warum bietest du mit den vielen Buttons dem Benutzer
die Erstellung diverser Monate an, wo doch (höchstens) ein Monat möglich ist?
Als Benutzer würde ich meinen, dass mich da jemand foppen will...
Der nächste Monat ist doch einfach immer nur der nächste Monat.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: Code-Problem
24.04.2008 07:26:00
Chantal
Hallo Erich,
Super genial,
zu deiner Bemerkung: Es gibt Mitarbeiter die gar keine Ahnung von Excel haben
so dachte ich mir, es mit den Buttons so einfach wie möglich zu gestalten.
Noch eine Frage: Wie kann ich mit dem Button aktuelles Diagramm öffnen den aktuellen
Monat ansehen momentan zeigt es mir immer das Tabellenblatt "Hauptzähler an.
Gruss
Chantal

AW: Code-Problem
24.04.2008 09:54:00
Erich
Hallo Chantal,
im Code der UserForm5:

Private Sub UserForm_Activate()
Dim strBlatt As String
strBlatt = Format(Sheets("Hauptzähler").Cells(1, 3), "MMMM YYYY")
With Sheets(strBlatt).ChartObjects(1).Chart
.Parent.Width = Image1.Width
.Parent.Height = Image1.Height
Dateiname = ThisWorkbook.Path & Application.PathSeparator & "diagramm.gif"
.Export Filename:=Dateiname, FilterName:="GIF"
Image1.Picture = LoadPicture(Dateiname)
End With
End Sub

Zur Bemerkung:
Die Mitarbeiter müssen doch nicht mehr Ahnung von Excel haben, wenn du beim Klick auf "Neuen Monat erstellen"
einfach den nächsten Monat erstellst, statt dem User die UserForm4 zu zeigen,
auf der er bei 10 Buttons eine Fehlermeldung erhält und nur, wenn er den einen richtigen Button drückt, Erfolg hat.
Ich halte UserForm4 schlicht für überflüssig.
Und wenn du sie unbedingt haben möchtest, sollten wenigstens alle Buttons, die sowieso nichts bringen,
deaktiviert oder ausgeblendet sein.
Der Button "Neuen Monat erstellen" könnte auch gleich informativer beschriftet sein mit dem jeweiligen nächsten
Monat, etwa "Mai 2008 erstellen".
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige