Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Nur bei leeren Zellen den Zellenschutz entfernen
#1
Hallo,

folgendes Problem mal wieder mit meiner Essenliste. Es wird durch ein Makro der neue Monat über eine Vorlage erstellt und alle Formeln eingefügt. Nun möchte ich in dem ersten Tabellenbereich des Monats Essenliste nachdem die Daten durch das einfügen gesetzt wurden sind des Tabellenschutz aktivieren was schon hinterlegt ist aber die Zellen welche in dem Bereich A5 bis A64 frei sind den Zellenschutz entfernen. Somit haben die Mitarbeiter die Möglichkeit Kinder die im Monat dazu gekommen sind nachträglich einzutragen.

Ich habe zwar den Befehl If Target <> "" Then Target.Locked = False gefunden aber bekomme diesen nicht zum laufen.

Über einen Code soll geprüft werden welche Zellen in A5 bis A64 leer sind und diese Zellen nicht schützen damit nach aktivieren des Tabellenschutz diese Zellen noch beschrieben werden können.

Wie bekomme ich das hin?

Gruß Daniel


Angehängte Dateien
.xlsm   Kopie von Essens und Mitgliederliste ab September 2015.xlsm (Größe: 456,63 KB / Downloads: 5)
Antworten Top
#2
Hallo!
Ohne jetzt die Datei herunterzuladen:
Dafür gibt es SpecialCells()
Code:
Tabelle1.Range("A5:A64").SpecialCells(xlCellTypeBlanks).Locked = False

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • Daniel Albert
Antworten Top
#3
Hi Daniel,

(08.11.2015, 20:59)Daniel Albert schrieb: Ich habe zwar den Befehl If Target <> "" Then Target.Locked = False gefunden aber bekomme diesen nicht zum laufen.

wenn du die leeren Zellen nicht schützen/sperren willst, müßte das dann nicht anders rum lauten:
If Target = "" Then Target.Locked = False
[-] Folgende(r) 1 Nutzer sagt Danke an Rabe für diesen Beitrag:
  • Daniel Albert
Antworten Top
#4
Hallo Ralf,

die Formel bringt einen Fehler. Ich habe den Code in das marko eingebaut aber es geht nicht. Dachte erst das ich den Zellbereich Markieren muss aber leider auch kein Erfolg.

Code:
 .Range("A5:A64").Select
        If Target = "" Then Target.Locked = False


Was ist falsch. ? Also es sollen alle leeren Zellen in A5 bis A64 der schreibschutz entfernt werden.



Code:
Sub SetzeFormeln()
  Dim ws As Worksheet
 
  Set ws = ActiveSheet
  With ws
     .Unprotect
   '  .Range("A5:A5").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
   '  .Range("A5:A64").FillDown
   
       .Range("A5").FormulaArray = "='aktive Mitglieder'!C5"
       .Range("A5:A64").FillDown
   
     
     .Range("A72").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF(('aktive Mitglieder'!$I$5:$I$64=""A"")*('aktive Mitglieder'!$M$5:$M$64=""x""),ROW($1:$60)),ROW(A1))),"""")"
     .Range("A72:A131").FillDown
     
     .Range("A139").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF(('aktive Mitglieder'!$I$5:$I$64=""A"")*('aktive Mitglieder'!$N$5:$N$64=""x""),ROW($1:$60)),ROW(A1))),"""")"
     .Range("A139:A198").FillDown
     
     .Range("A206").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF(('aktive Mitglieder'!$I$5:$I$64=""A"")*('aktive Mitglieder'!$O$5:$O$64=""x""),ROW($1:$60)),ROW(A1))),"""")"
     .Range("A206:A265").FillDown
     
     .Range("A273").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF(('aktive Mitglieder'!$I$5:$I$64=""A"")*('aktive Mitglieder'!$P$5:$P$64=""x""),ROW($1:$60)),ROW(A1))),"""")"
     .Range("A273:A332").FillDown
     
     .Range("A338:A338").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
     .Range("A338:A397").FillDown
     .Range("B338:B397").FormulaLocal = "=WENNFEHLER(SVERWEIS($A338;'aktive Mitglieder'!$C$5:$P$64;11;0);"""")"
     .Range("D338:D397").FormulaLocal = "=WENNFEHLER(SVERWEIS($A338;'aktive Mitglieder'!$C$5:$P$64;12;0);"""")"
     .Range("F338:F397").FormulaLocal = "=WENNFEHLER(SVERWEIS($A338;'aktive Mitglieder'!$C$5:$P$64;13;0);"""")"
     .Range("H338:H397").FormulaLocal = "=WENNFEHLER(SVERWEIS($A338;'aktive Mitglieder'!$C$5:$P$64;14;0);"""")"
     
     .Range("A403:A403").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
     .Range("A403:A462").FillDown
     
     .Range("A468:A468").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
     .Range("A468:A527").FillDown
     
     .Range("A533:A533").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
     .Range("A533:A592").FillDown
     
     .Range("A598:A598").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
     .Range("A598:A657").FillDown
     
     .Range("A5:A64").Select
        If Target = "" Then Target.Locked = False
     .Protect
  End With
  Call Formatierungen(ws)
End Sub
Antworten Top
#5
Hi!
Ich heiße zwar auch Ralf, aber da meine Antwort mit Missachtung gestraft wird, verabschiede ich mich aus der (virtuellen, nicht wertend gemeint) Kindergartengruppe.

Nur noch so viel:
Du brauchst das Target nicht auszuwerten, sondern musst den Schutz aufheben, die SpecialCells des Range "umpolen" und den Schutz wieder setzen.
(wie auch exakt so unter #2 beschrieben)

Gruß und nichts für ungut,

Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#6
Guten Morgen Ralf,

stimmt ich habe gestern vergessen darauf zu Antworten. Ich habe deine Formel ausprobiert aber bekomme schon beim hinterlegen in dem Modul eine Fehlermeldung:

Zellen nicht gefunden , Laufzeitfehler 1004

Ich habe folgendes eingetragen

.Range("A5:A64").SpecialCells(xlCellTypeBlanks).Locked = False

Gehe ich mit dem Mauszeiger über CellTypBlanks steht dort 4 Zeilen obwohl es 6 wären
Antworten Top
#7
Hallo,

(10.11.2015, 07:01)Daniel Albert schrieb: Ich habe folgendes eingetragen

.Range("A5:A64").SpecialCells(xlCellTypeBlanks).Locked = False

Gehe ich mit dem Mauszeiger über CellTypBlanks steht dort 4 Zeilen obwohl es 6 wären

mal einen Auszug aus der OH zu der SpecialCells

Zitat:Range.SpecialCells-Methode
Gibt ein Range-Objekt zurück, das alle Zellen darstellt, die mit dem angegebenen Wert übereinstimmen.
Syntax

Ausdruck.SpecialCells(Type, Value)

Ausdruck   Eine Variable, die ein Range-Objekt darstellt.

Parameter

Name Erforderlich/Optional Datentyp Beschreibung
Typ Erforderlich XlCellType Die einzuschließenden Zellen.
Wert Optional Variant Wenn Type auf xlCellTypeConstants oder auf xlCellTypeFormulas festgelegt wurde, können Sie mit diesem Argument die Typen von Zellen bestimmen, die im Ergebnis eingeschlossen werden sollen. Diese Werte können addiert werden, wenn mehrere Typen zurückgegeben werden sollen. Standardmäßig werden unabhängig vom Typ alle Konstanten oder Formeln ausgewählt.

Rückgabewert
Range

Anmerkungen


XlCellType-Konstanten Wert
xlCellTypeAllFormatConditions. Zellen mit beliebigem Format -4172
xlCellTypeAllValidation. Zellen mit Gültigkeitskriterien -4174
xlCellTypeBlanks. Leere Zellen 4
xlCellTypeComments. Zellen mit Kommentaren -4144
xlCellTypeConstants. Zellen mit Konstanten 2
xlCellTypeFormulas. Zellen mit Formeln -4123
xlCellTypeLastCell. Die letzte Zelle im verwendeten Bereich 11
xlCellTypeSameFormatConditions. Zellen mit gleichem Format -4173
xlCellTypeSameValidation. Zellen mit gleichen Gültigkeitskriterien -4175
xlCellTypeVisible. Alle sichtbaren Zellen 12

4 wird dir deshalb angezeigt, weil es sich um den Konstantenwert handelt. Deine Zellen sind nicht leer, weil sie Formeln enthalten. Und daher dürfte auch die Fehlermeldung kommen.
Gruß Stefan
Win 10 / Office 2016
Antworten Top
#8
Hallo Daniel,

man kann nicht mehrere Zellen auf einmal mit dem Ausdruck If Bereich ="" prüfen.
Hier jetzt mit einer Schleife:

Sub SetzeFormeln()
 Dim ws As Worksheet
 Dim rngZelle As Range
 
 Set ws = ActiveSheet
 With ws
    .Unprotect
  '  .Range("A5:A5").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
  '  .Range("A5:A64").FillDown
 
      .Range("A5").FormulaArray = "='aktive Mitglieder'!C5"
      .Range("A5:A64").FillDown
 
   
    .Range("A72").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF(('aktive Mitglieder'!$I$5:$I$64=""A"")*('aktive Mitglieder'!$M$5:$M$64=""x""),ROW($1:$60)),ROW(A1))),"""")"
    .Range("A72:A131").FillDown
   
    .Range("A139").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF(('aktive Mitglieder'!$I$5:$I$64=""A"")*('aktive Mitglieder'!$N$5:$N$64=""x""),ROW($1:$60)),ROW(A1))),"""")"
    .Range("A139:A198").FillDown
   
    .Range("A206").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF(('aktive Mitglieder'!$I$5:$I$64=""A"")*('aktive Mitglieder'!$O$5:$O$64=""x""),ROW($1:$60)),ROW(A1))),"""")"
    .Range("A206:A265").FillDown
   
    .Range("A273").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF(('aktive Mitglieder'!$I$5:$I$64=""A"")*('aktive Mitglieder'!$P$5:$P$64=""x""),ROW($1:$60)),ROW(A1))),"""")"
    .Range("A273:A332").FillDown
   
    .Range("A338:A338").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
    .Range("A338:A397").FillDown
    .Range("B338:B397").FormulaLocal = "=WENNFEHLER(SVERWEIS($A338;'aktive Mitglieder'!$C$5:$P$64;11;0);"""")"
    .Range("D338:D397").FormulaLocal = "=WENNFEHLER(SVERWEIS($A338;'aktive Mitglieder'!$C$5:$P$64;12;0);"""")"
    .Range("F338:F397").FormulaLocal = "=WENNFEHLER(SVERWEIS($A338;'aktive Mitglieder'!$C$5:$P$64;13;0);"""")"
    .Range("H338:H397").FormulaLocal = "=WENNFEHLER(SVERWEIS($A338;'aktive Mitglieder'!$C$5:$P$64;14;0);"""")"
   
    .Range("A403:A403").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
    .Range("A403:A462").FillDown
   
    .Range("A468:A468").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
    .Range("A468:A527").FillDown
   
    .Range("A533:A533").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
    .Range("A533:A592").FillDown
   
    .Range("A598:A598").FormulaArray = "=IFERROR(INDEX('aktive Mitglieder'!$C$5:$C$64,SMALL(IF('aktive Mitglieder'!$I$5:$I$64=""A"",ROW($1:$60)),ROW(A1))),"""")"
    .Range("A598:A657").FillDown
   
    For Each rngZelle In .Range("A5:A64")
       rngZelle.Locked = (rngZelle.Value <> "")
    Next rngZelle
   
    .Protect
 End With
 Call Formatierungen(ws)
End Sub


VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 14 - mit VBAHTML 12.6.0


Gruß Uwe
[-] Folgende(r) 1 Nutzer sagt Danke an Kuwer für diesen Beitrag:
  • Daniel Albert
Antworten Top
#9
Moin!
Aber wie verträgt sich dieses aus dem Eröffnungspost:
Zitat:Über einen Code soll geprüft werden welche Zellen in A5 bis A64 leer sind und diese Zellen nicht schützen damit nach aktivieren des Tabellenschutz diese Zellen noch beschrieben werden können.
mit der Tatsache, dass dort Formeln stehen?
Denn wenn Du sie beschreibst, sind die Formeln natürlich futsch.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
[-] Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:
  • Daniel Albert
Antworten Top
#10
Hallo ALLE,

danke für eure Ideen, habe jetzt die Formel


Code:
Sub ErsetzeFormeln(Optional ws As Worksheet)
Dim rngZelle As Range
  If ws Is Nothing Then Set ws = ActiveSheet
  With ws
     
     With .Range("A5:A64"): .Value = .Value: End With
     With .Range("A72:A131"): .Value = .Value: End With
     With .Range("A137:A198"): .Value = .Value: End With
     With .Range("A206:A265"): .Value = .Value: End With
     With .Range("A273:A332"): .Value = .Value: End With
     With .Range("A338:A397"): .Value = .Value: End With
     With .Range("A403:A462"): .Value = .Value: End With
     With .Range("A468:A527"): .Value = .Value: End With
     With .Range("A533:A592"): .Value = .Value: End With
     With .Range("A598:A657"): .Value = .Value: End With
   
     For Each rngZelle In .Range("A5:A64")
      rngZelle.Locked = (rngZelle.Value <> "0")
   Next rngZelle
   .Protect
  End With
End Sub

Bei ErsetzeFormeln eingesetzt. Zudem habe ich gesehen das in den leeren Zellen eine 0 steht.

Jetzt geht es, großen Danke an alle die mitgewirkt haben.

Gruß Daniel
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste