Clever-Excel-Forum

Normale Version: Hilfe zur Dropdown Liste
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
(14.02.2015, 06:32)WillWissen schrieb: [ -> ]Hi Emre,

Zitat:Hättest du vielleicht eine Seite für mich um ein wenig meine VBA Kenntnisse zu verbessern ?

Hier! ;)

Im Ernst, es hilft meistens nur nach dem Problem googeln (z.B. hier) oder sich hier von den VBA-Spezis helfen lassen und zu versuchen, die Codes zu verstehen.

Das Farbige sind anklickbare Links!

Hallo WillWissen,

gegoogelt habe ich das schon und auch eine große Anzahl von Seiten gefunden! Ich dachte halt nur, dass Schauan vielleicht eine empfehlenswerte Seite hat.
Trotzdem danke :19:
Hallo Emre,

ich bin zwar auch nicht André, aber schaue z.B:

http://www.online-excel.de/excel/grusel_vba.php?f=1

http://de.wikibooks.org/wiki/VBA_in_Excel

Gruß Uwe
(13.02.2015, 20:42)schauan schrieb: [ -> ]Hallo Emre,

Du kannst diesen code in das Modul DieseArbeitsmappe einfügen. Wie das Makro funktioniert, hab ich kommentiert. Das ist jetzt erst mal der Teil mit dem Leeren der Zellen. Jetzt wäre noch die Frage, wo denn die Daten sind, damit man sie wieder einfügen kann, wenn ein bereits verwendeter Monat nochmal gewählt wird. Ich nehme mal an, dass Du dafür auch noch ein Makro brauchst. In der bereitgestellten Musterdatei war keins.

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Wenn die ersten 4 Zeichen des Blattes TEST sind
'und die geänderte Zelle C1, dann
If Left(Sh.Name, 4) = "TEST" And Target.Address = "$C$1" Then
  'Auf dem Blatt den Bereich C6:E36 leeren
  'Hinweis: ggf. Sicherheitsabfrage einabuen!
  Sh.Range("C6:E36").ClearContents
'Ende Wenn die ersten 4 Zeichen des Blattes TEST sind
'und die geänderte Zelle C1, dann
End If
End Sub

Guten Abend Schauan,

ich versuche vergebens noch eine Sicherheitsabfrage einzubauen..
Diese solle so funktionieren, dass wenn ich diese bestätige der Befehl ausgeführt wird aber wenn ich auf "Nein" drücke der Befehl abgebrochen wird und auch dieser Monat bestehen bleibt, sprich nicht auf den nächsten Monat wechselt und auch nicht die Stunden löscht.

Sub Zeile_Loeschen()
If MsgBox("Sind sie sicher?", vbYesNoCancel, "Zeilen Löschen") = vbYes Then
Selection.EntireRow.Delete
End If
End Sub
(15.02.2015, 00:43)Kuwer schrieb: [ -> ]Hallo Emre,

ich bin zwar auch nicht André, aber schaue z.B:

http://www.online-excel.de/excel/grusel_vba.php?f=1

http://de.wikibooks.org/wiki/VBA_in_Excel

Gruß Uwe

Guten Abend Kuwer,

danke dir und danke auch den anderen für eure Unterstützung :25:
Werde mir mal die Zeit nehmen und mir das alles durchlesen!
Hallo Emre,

die Abfrage muss mit in das Makro eingebaut werden. Beim jetzigen Stand kann man erst mal nur verhindern, dass die Daten gelöscht werden. Der Eintrag des neuen Monats bleibt.

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Wenn die ersten 4 Zeichen des Blattes TEST sind
'und die geänderte Zelle C1, dann
If Left(Sh.Name, 4) = "TEST" And Target.Address = "$C$1" Then
  'Sicherheitsabfrage!
  If MsgBox("Sollen die Daten entfernt werden?", vbYesNo, "Zeilen Löschen") = vbYes Then
    'Auf dem Blatt den Bereich C6:E36 leeren
    Sh.Range("C6:E36").ClearContents
  'Ende Sicherheitsabfrage!
  End If
'Ende Wenn die ersten 4 Zeichen des Blattes TEST sind
'und die geänderte Zelle C1, dann
End If
End Sub

Um zu erreichen, dass der Monatseintrag bleibt, muss sich Excel irgendwo den "alten" Monat merken. Dafür gäbe es z.B. zwei Wege
- Speicherung des Monatseintrages beim Öffnen der Mappe und beim Aktivieren des Blattes sowie beim Wechsel, wenn nicht abgebrochen wird, in einer Variable
oder
- Speicherung des Monatseintrages beim Wechsel, wenn nicht abgebrochen wird, in einer Zelle.

Den zweiten Weg fände ich sicherer, da in einigen Fällen die Variable ungewollt geleert werden kann. Dafür müsstest Du eine Zelle vorsehen.

Ich habe den Eintrag hier mal nach B1 gelegt.

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Wenn die ersten 4 Zeichen des Blattes TEST sind
'und die geänderte Zelle C1, dann
If Left(Sh.Name, 4) = "TEST" And Target.Address = "$C$1" Then
  'Sicherheitsabfrage!
  If MsgBox("Sollen die Daten entfernt werden?", vbYesNo, "Zeilen Löschen") = vbYes Then
    'Auf dem Blatt den Bereich C6:E36 leeren
    Sh.Range("C6:E36").ClearContents
    'Monat aus C1 nach B1 uebertragen
    Sh.Cells(1, 2).Value = Cells(1, 3).Value
  'Sicherheitsabfrage! Falls nein
  Else
    'Event-Aktionen ausschalten
    Application.EnableEvents = False
    'Monat aus B1 nach C1 uebertragen
    Sh.Cells(1, 3).Value = Cells(1, 2).Value
    'Event-Aktionen einschalten
    Application.EnableEvents = True
  'Ende Sicherheitsabfrage!
  End If
'Ende Wenn die ersten 4 Zeichen des Blattes TEST sind
'und die geänderte Zelle C1, dann
End If
End Sub

Du wolltest bei Auswahl eines anderen Monats aber auch noch die Daten wiederherstellen, falls es da schon welche gibt? Wie in einem anderen Post schon gesagt, da müssen die auch irgendwo gesichert werden. Und dann hast Du noch das Problem, dass Deine Formeln auf dem Blatt Stundenerfassung in jedem Monat an die gleiche Stelle gehen, du hättest also von Januar bis Dezember die gleichen Werte.
(15.02.2015, 06:50)schauan schrieb: [ -> ]Hallo Emre,

die Abfrage muss mit in das Makro eingebaut werden. Beim jetzigen Stand kann man erst mal nur verhindern, dass die Daten gelöscht werden. Der Eintrag des neuen Monats bleibt.

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Wenn die ersten 4 Zeichen des Blattes TEST sind
'und die geänderte Zelle C1, dann
If Left(Sh.Name, 4) = "TEST" And Target.Address = "$C$1" Then
  'Sicherheitsabfrage!
  If MsgBox("Sollen die Daten entfernt werden?", vbYesNo, "Zeilen Löschen") = vbYes Then
    'Auf dem Blatt den Bereich C6:E36 leeren
    Sh.Range("C6:E36").ClearContents
  'Ende Sicherheitsabfrage!
  End If
'Ende Wenn die ersten 4 Zeichen des Blattes TEST sind
'und die geänderte Zelle C1, dann
End If
End Sub

Um zu erreichen, dass der Monatseintrag bleibt, muss sich Excel irgendwo den "alten" Monat merken. Dafür gäbe es z.B. zwei Wege
- Speicherung des Monatseintrages beim Öffnen der Mappe und beim Aktivieren des Blattes sowie beim Wechsel, wenn nicht abgebrochen wird, in einer Variable
oder
- Speicherung des Monatseintrages beim Wechsel, wenn nicht abgebrochen wird, in einer Zelle.

Den zweiten Weg fände ich sicherer, da in einigen Fällen die Variable ungewollt geleert werden kann. Dafür müsstest Du eine Zelle vorsehen.

Ich habe den Eintrag hier mal nach B1 gelegt.

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Wenn die ersten 4 Zeichen des Blattes TEST sind
'und die geänderte Zelle C1, dann
If Left(Sh.Name, 4) = "TEST" And Target.Address = "$C$1" Then
  'Sicherheitsabfrage!
  If MsgBox("Sollen die Daten entfernt werden?", vbYesNo, "Zeilen Löschen") = vbYes Then
    'Auf dem Blatt den Bereich C6:E36 leeren
    Sh.Range("C6:E36").ClearContents
    'Monat aus C1 nach B1 uebertragen
    Sh.Cells(1, 2).Value = Cells(1, 3).Value
  'Sicherheitsabfrage! Falls nein
  Else
    'Event-Aktionen ausschalten
    Application.EnableEvents = False
    'Monat aus B1 nach C1 uebertragen
    Sh.Cells(1, 3).Value = Cells(1, 2).Value
    'Event-Aktionen einschalten
    Application.EnableEvents = True
  'Ende Sicherheitsabfrage!
  End If
'Ende Wenn die ersten 4 Zeichen des Blattes TEST sind
'und die geänderte Zelle C1, dann
End If
End Sub

Du wolltest bei Auswahl eines anderen Monats aber auch noch die Daten wiederherstellen, falls es da schon welche gibt? Wie in einem anderen Post schon gesagt, da müssen die auch irgendwo gesichert werden. Und dann hast Du noch das Problem, dass Deine Formeln auf dem Blatt Stundenerfassung in jedem Monat an die gleiche Stelle gehen, du hättest also von Januar bis Dezember die gleichen Werte.

Hallo André,

ich werde das dann jetzt so behalten. Danke hast mir sehr geholfen.
Ich hätte nur noch eine Frage! Es werden ja nicht nur 2 Arbeitsblätter mit "Test" geben sondern deutlich mehr, mit unterschiedlichen Namen. Wie müsste ich denn die Zeile anpassen ?
If Left(Sh.Name, 4) = "TEST" And Target.Address = "$C$1"

Außerdem hat jetzt jeder Mitarbeiter seine "eigene" Dropdown-Liste und es wird nicht mehr vom 1ten Arbeitsblatt übernommen, damit man bei jeden Arbeiter individuell jeden gewünschten Monat ändern kann.

P.S. Hab mir schon ein wenig VBA angeguckt und es sieht nach ganz viel arbeit aus! Whistle
Hallo Emre,

Wenn Du bei den Blattnamen irgendwas einheitliches und eindeutiges vorne dran stellst, ist die Programmierung am Einfachsten. Wenn das z.B. als Abkürzung für was passendes durchgeht, noch besser, z.B. EAT für Excel-AnwesenheitsTabelle - allerdings könnte dann die Frage kommen, wer wen fressen will Wink Bei "EAT" müsstest Du dann übrigens , 3 programmieren und nicht , 4, oder Du nimmst "EAT "

Ansonsten müsstest Du das If mit Or erweiteren und die jeweils kompletten Blattnamen programmieren, also z.B.
Code:
If sh.Name = "Schulze" Or sh.Name = "Meier" Or ... Then
Damit eine Zeile beim Programmieren nicht so lang wird, kann man sie auch mit _ in die nächste Zeile erweitern, z.B.
Code:
If sh.Name = "Schulze" Or _
   sh.Name = "Meier" Or _
   ... Then
(da gibt's aber auch Grenzen)

Alternativ wäre im Programm ein Array oder auf einem Blatt eine Liste möglich, wo Du alle Blattnamen einträgst und welche das Makro dann durchgeht und mit dem aktiven Blattnamen vergleicht.
(16.02.2015, 18:40)schauan schrieb: [ -> ]Hallo Emre,

Wenn Du bei den Blattnamen irgendwas einheitliches und eindeutiges vorne dran stellst, ist die Programmierung am Einfachsten. Wenn das z.B. als Abkürzung für was passendes durchgeht, noch besser, z.B. EAT für Excel-AnwesenheitsTabelle - allerdings könnte dann die Frage kommen, wer wen fressen will Wink Bei "EAT" müsstest Du dann übrigens , 3 programmieren und nicht , 4, oder Du nimmst "EAT "

Ansonsten müsstest Du das If mit Or erweiteren und die jeweils kompletten Blattnamen programmieren, also z.B.
Code:
If sh.Name = "Schulze" Or sh.Name = "Meier" Or ... Then
Damit eine Zeile beim Programmieren nicht so lang wird, kann man sie auch mit _ in die nächste Zeile erweitern, z.B.
Code:
If sh.Name = "Schulze" Or _
   sh.Name = "Meier" Or _
   ... Then
(da gibt's aber auch Grenzen)

Alternativ wäre im Programm ein Array oder auf einem Blatt eine Liste möglich, wo Du alle Blattnamen einträgst und welche das Makro dann durchgeht und mit dem aktiven Blattnamen vergleicht.

Ich hatte es auch einheitlich, hab davor MA ( Mitarbeiter) geschrieben und hat auch so funktioniert, aber wollte dort eigentlich nur den Namen stehen haben, aber dies ist mir dann doch zu umständlich. Dann lasse ich es.
Danke für deine Hilfe:28:
Hallo,

nachdem das eigentliche Thema gelöst wurde noch eine kleine Anmerkung:

Es ist normalerweise nicht notwendig den kompletten Beitrag des Vorposters zu zitieren - das macht das Ganze eher unübersichtlich.
Hallo Peter,

werde ich mir in Zukunft merken :19:
Seiten: 1 2 3