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

Zellenschutz unter Bedingungen

Zellenschutz unter Bedingungen
Stein
Hallo,
ich möchte einzelne Zellen in einem Arbeitsplatz mit einem Schutz versehen, wenn bestimmte Bedingungen vorliegen. Die betroffenen Zellen sollen also zur Bearbeitung trotz aktivem Blattschutz freigegeben werden, wenn in einer anderen Zelle bestimmte Werte nicht vorhanden sind. Ansonsten bleiben auch sie gesperrt.
Gruss Stein
AW: Zellenschutz unter Bedingungen
09.02.2010 11:20:55
JoWE
Hallo Stein (?)
meinst Du so? In der aktiven Tabelle darf C2 nicht aktiviert werden wenn in E2 der Wert "Nein" steht!
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If [E2] = "Nein" And Target.Address = "$C$2" Then
[A1].Select
MsgBox "Auswahl von " & Target.Address & " unzulässig!"
[A1].Select
End If
End Sub

Gruß
Jochen
AW: Zellenschutz unter Bedingungen
09.02.2010 11:22:21
JoWE
sorry, das 2. [A1].selet ist überflüssig - ich hab's zu spät gemerkt!
AW: Zellenschutz unter Bedingungen
09.02.2010 12:51:37
Stein
Hallo Jochen,
ja, Du hast es richtig verstanden.
Danke für deine VBA-Zeilen. Aber da meine VBA-Kenntnisse ziemlich dürftig sind (um genau zu sein: keine) und das Handling der ganzen Makrogeschichte für mich Neuland ist, habe ich so meine Probleme, Deinen Vorschlag erfolgreich umzusetzen.
Ich habe nun folgendes gemacht:
-Die Zelle angeklickt, in der das Makro laufen soll
-ALT+F8 gedrückt
-es erscheint das Makro-Fenster
-oben einen Namen für das Makro eingegeben und "Erstellen" gewählt
-deine Makrozeilen kopiert und zwischen "Sub Blattschutz_bedingt ()" (=>Makro-Name) und "End Sub" eingefügt und ein paar Parameter geändert (für E2 => AC4 und für $C$2 => $AA$4):
Sub Blattschutz_bedingt()
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If [AC4] = 0 And Target.Address = "$AA$4" Then
[A1].Select
MsgBox "Auswahl von " & Target.Address & " unzulässig!"
End If
End Sub
End Sub

-über Symbolleiste gespeichert und Fenster geschlossen
-erneut Alt+F8 gedrückt, Makro "Blattschutz_bedingt" und "Ausführen" gewählt
-es erscheint eine Fehler-Meldung, dass "End Sub" erwartet wird. Die erste Zeile ist gelb hinterlegt.
Was ist mein Fehler?
Gruß
Stein
Anzeige
AW: Zellenschutz unter Bedingungen
09.02.2010 13:16:40
Björn
Hallo Stein,
Lass in Deinem Code die erste und letzte Zeile weg. Nimm nur das, was Jochen geschrieben hat.
Also von "Private sub..." bis zum ersten "End sub".
Das Makro wird jedes Mal ausgeführt, wenn Du die Selektion in dem Blatt änderst. Daher auch der Name des Makros "Worksheet_SelectionChange"
Gruß
Björn B.
AW: Zellenschutz unter Bedingungen
09.02.2010 13:34:26
Stein
Hallo Björn,
Lass in Deinem Code die erste und letzte Zeile weg. Nimm nur das, was Jochen geschrieben hat.
Also von "Private sub..." bis zum ersten "End sub".
Gut, aber in der ersten Zeile steht doch der Name des Makros. Ich hatte das auch schon probiert, aber nach dem Aufrufen (Alt+F8) steht dann nichts mehr in der Makro-Auswahlliste. Und passieren tut nix. Allerdings gibt es auch keine Fehlermeldung mehr! :-)
Das Makro wird jedes Mal ausgeführt, wenn Du die Selektion in dem Blatt änderst. Daher auch der Name des Makros "Worksheet_SelectionChange"
Selektion bedeutet, sobald ich eine andere Zelle anwähle?
Wird das Makro automatisch mit kopiert, wenn ich eine dieser Zellen kopiere bzw. wie kann ich das Makro an die nächste(n) Zelle(n) weitergeben?
Gruß
Stein
Anzeige
AW: Zellenschutz unter Bedingungen
09.02.2010 13:42:57
Björn
Oh je, wo fangen wir da am besten an.
Also, wenn du im VBE (Visual Basic Editor) bist, ist dann der ProjektExplorer zu sehen? Mit Strg+R kannst du den sichtbar machen.
In ihm siehst du dann die Elemente Deiner Mappe.
Du solltest jetzt einen Doppelklick auf die Tabelle machen, in der der Code stehen soll.
Dann geht das eigentlich Editor Feld der Tabelle auf (schau mal in die Teitelleiste, hier steht immer, was grad aktiv ist). Dort kopierst du nun den Code von Jochen rein.
Da ist in der ersten Zeile schon eine Name für das Makro oder besser gesagt die Prozedur. Bei End sub hört diese dann wieder auf.
Du hast jetzt versucht, um diese Prozedur eine weitere Prozedur du basteln. Das geht aber nicht. In einer Prozedur kann keine Prozedur stehen, man kann aber in einer Prozedur eine andere aufrufen (mit CALL), das brauchst du hier aber nicht.
Selektion bedeutet, sobald ich eine andere Zelle anwähle?

Fast, ein Zusatz noch: Wenn Du eine andere Zelle, einen anderen Bereich (mehrere Zellen) in diesem einen Blatt wählst. DAs gilt dann für alle Zellen in dem Blatt (Register, nicht zu verwechseln mit der Mappe).
Makros werden niemals kopiert, wenn du Zellen kopierst. Wenn Du dagegen ein ganzes Blatt kopierst, wird auch alles andere (inkl. Buttons, Code, usw) kopiert.
Wenn Du den Code auch in einem anderen Blatt haben möchtest, musst du ihn da auch wieder einfügen.
Gruß
Björn B.
Anzeige
AW: Zellenschutz unter Bedingungen
09.02.2010 14:22:04
Stein
Ja, ich weiß, dass es ein bisschen kompliziert wird, da ich mich bislang noch nicht viel bis garnicht mit VBE beschäftigt habe. Danke schon mal für Deine Versuche/Bemühungen. Ich hoffe, sie werden von Erfolg gekrönt sein. :-)
..., wenn du im VBE (Visual Basic Editor) bist, ist dann der ProjektExplorer zu sehen? ...
In ihm siehst du dann die Elemente Deiner Mappe.
Du solltest jetzt einen Doppelklick auf die Tabelle machen, in der der Code stehen soll.
Dann geht das eigentlich Editor Feld der Tabelle auf (schau mal in die Teitelleiste, hier steht immer, was grad aktiv ist). Dort kopierst du nun den Code von Jochen rein.

Den Editor habe ich gefunden und auch das Editor-Feld ging auf. Habe nun den Code hineinkopiert und das Ganze gespeichert. Die Funktion ist zwar immer noch nicht da, allerdings gibt es im Kontextmenü unter "Zellen formatieren" nicht mehr den Reiter "Schutz".
Da ist in der ersten Zeile schon ein Name für das Makro oder besser gesagt die Prozedur.

Warum finde ich ihn in der Auflistung im Makro-Fenster (Alt+F8) nicht wieder? Wie heißt er beim Code von Jochen?
Fast, ein Zusatz noch: Wenn Du eine andere Zelle, einen anderen Bereich (mehrere Zellen) in diesem einen Blatt wählst. DAs gilt dann für alle Zellen in dem Blatt (Register, nicht zu verwechseln mit der Mappe).

Das bedeutet, wenn die Bedingung (AC4=0) erfüllt ist, werden alle bislang geschützten Zellen dieses Registers nicht mehr geschützt? Anders gefragt, heisst das, dass ich keine einzelne Zelle innerhalb eines Arbeitsblattes vom Schutz befreien kann, sondern nur alle oder keine?
Ich habe folgendes vor: Ich will in einem Blatt, in einer Spalte A Daten ggf. eintragen können. Neben dieser Spalte befindet sich noch eine zweite Spalte B, in der automatisch Daten aus einer anderen Tabelle eingetragen werden. Sind für diese Zeile in Spalte B keine Daten vorhanden, wird eine "0" eingetragen. Nur unter dieser Bedingung soll dann der Schutz der Nachbarzelle in der Spalte A aufgehoben werden. Diese Funktion soll dann aber für jede Reihe (Zeile) separat generiert werden. Also, wenn Zelle B3=0 dann Schutz nur für Zelle A3 aufgehoben. Wenn Zelle B4>0 dann Schutz nur für Zelle A4 beibehalten. Usw.
Gruß
Stein
Anzeige
AW: Zellenschutz unter Bedingungen
09.02.2010 15:15:11
JoWE
Steinchen,
klicke mit der rechten Maustatste auf den Tabellenreiter der Tabelle, in der das alles passieren soll und im Kontextmenü dann auf Code anzeigen. Im Vbe befindest Du dich dann im Klassenmodul der Tabelle.
Dort kopierst du den Code
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If [E2] = "Nein" And Target.Address = "$C$2" Then
[A1].Select
MsgBox "Auswahl von " & Target.Address & " unzulässig!"
End If
End Sub

in den weißen Bereich rechts oben.
So wie im dem Bild hier unten. Danach aktivierst du Deine Tabelle. Wenn dort in E2 das Wort 'Nein' steht und Du jetzt in C2 klickst wirst Du sehen was geschieht.
Jochen
Userbild
Anzeige
AW: Zellenschutz unter Bedingungen
09.02.2010 16:45:15
Stein
Hey JoWE,
habe ich gemacht.
Ich habe mir jetzt mal eine neue Mappe angelegt, wie Du auch, und dort Deine Anweisungen wiederholt. Für die Zelle E2 habe ich den Blattschutz herausgenommen und dann für das Tabellenblatt den Schutz aktiviert (Extras - Schutz - Blatt schützen). Die einzig zur Verfügung stehende Zelle ist E2. Schreibe ich dort "Nein" hinein, bleibt C2 weiterhin gesperrt und nicht zugänglich. Ich habe die Excel-Datei mal auf den Server geladen:

Die Datei https://www.herber.de/bbs/user/67862.xls wurde aus Datenschutzgründen gelöscht


Ich wollte sie zwar so anzeigen, wie Du, weiß aber nicht wie. Denn Screenshot und Einfügen funktioniert irgendwie in diesem Formular nicht.
Gruß
Stein
Anzeige
AW: Zellenschutz unter Bedingungen
09.02.2010 20:10:49
JOWE
für die Funktionalität meines Vorschlags ist der Blattschutz überflüssig.
Es handelt sich nur um ein Beispiel, wie eine Zelle nicht mehr angwählt werden kann, wenn eine bestimmte Bedingung zutrifft. In diesem Fall eben der Wert 'Nein' in E2.
Das hat gar nichts mit Blatt- oder Zellschutz zu tun!
AW: Zellenschutz unter Bedingungen
09.02.2010 22:35:20
Stein
Habe ich das richtig verstanden, dass in Deinem Vorschlag die Zelle C2 nicht mehr angewählt werden können dürfte, wenn in E2 "Nein" steht?
Wenn ich das in meiner Datei ausprobiere, passiert nix. Ich kann trotzdem alle Zellen anwählen (den Blattschutz habe ich dabei aufgehoben). Was ist da falsch?
Gruss Stein
Anzeige
AW: Zellenschutz unter Bedingungen
10.02.2010 08:48:32
Stein
Oder habe ich das mit dem "Tabelle aktivieren" noch nicht richtig verstanden? Wie geht das?
Gruss Stein
3 Fragen noch
10.02.2010 10:33:43
Stein

Manno - ...
Aber ich hab doch (noch) keine Ahnung davon, wie man mit eigenen Makros umgeht bzw. sie programmiert. Noch nicht. Fange gerade erst damit an.
Habe meine Datei geschlossen und nach dem erneuten Öffnen kam dann auch die Frage zum Aktivieren des Makros. Es klappt. Danke für die Hilfe.
Drei Fragen aber habe ich noch:
1. Kann ich das Makro auch über einen Befehl aus der Menüleiste ohne vorheriges Schließen und wieder Öffnen der Datei aktivieren?
2. Kann ich das VBA-Programm so modifizieren, dass ich jede Zelle innerhalb eines Tabellenblattes definiert sperren bzw. freigeben kann, also E2 sperrt C2, E3 sperrt C3 usw.? Oder wird das zu programmieraufwendig?
3. Wie müsste die Änderung im Code aussehen, wenn ich die Bedingung ändern will, z.B. Sperren, wenn der Inhalt von E2>0 ist?
Gruß
Stein
Anzeige
Erweiterung des VBA-Code auf mehrere Zeilen
11.02.2010 08:57:37
Stein
Hallo,
ich habe mal ein bisschen herumgebastelt. Bin mit der Lösung von JoWE als Grundlage ganz zufrieden. Dank an JoWE - auch wenn es Nerven gekostet hat. :-)
Habe die Meldung, "$C$2 ist gesperrt" herausgenommen, den Wert in E2 indirekt über G2 (Eingabezelle) eintragen lassen (E2=G2) und die Sprungadresse zurück auf die Eingabezelle (G2) geändert. Funktioniert.
Aber warum muss ich die Zellenangabe $C$2 mit den $-Zeichen angeben?
Jetzt möchte ich in der nächsten Zeile das gleiche machen. Ich habe den Code einfach kopiert und die Parameter geändert. Funktioniert auch. Hier mein Code für 2 Zeilen:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If [$E2] >= 5 And Target.Address = "$C$2" Then
[G2].Select
End If
If [$E3] >= 5 And Target.Address = "$C$3" Then
[G3].Select
End If
End Sub
Jetzt benötige ich diese Funktion in insgesamt 20 Zeilen ~f~(wenn G2 > 0 dann C2 > 0, wenn G3 > 0 dann C3 > 0, usw.)~f~.
Gibt es eine Vereinfachung oder muss ich den Code jetzt 20x schreiben/kopieren und die entsprechenden Parameter jeweils anpassen?
Noch was anderes: Ich habe die Sicherheitseinstellungen für Makros auf "Mittel - Auswählen, ob das Makro ausgeführt werden soll oder nicht" stehen. Dazu meine Frage(n):
-Muss ich, um das Makro zu aktivieren, die Sicherheitseinstellungen auf "niedrig" ändern, damit neue Makros sofort übernommen werden?
-Oder muss ich bei der Stufe "Mittel" immer die Mappe schließen und dann wieder neu öffnen, damit das Auswahlfenster erscheint?
-Oder gibt es noch eine andere Mlöglichkeit, neue Makros sofort zu übernehmen?
Gruss Stein
Anzeige
AW: Erweiterung des VBA-Code auf mehrere Zeilen
11.02.2010 10:14:43
Björn
Hallo Stein,
ja es gibt eine Vereinfachung, z.B. über CASE (schau dazu mal in die Hilfe).
Oder Du überlegst dir eine Logik, wie du alle abfragen kannst, mit Variablen.
Also z.B. folgende Aufgabe:
Prüfe Zellen A1 bis A10, ob der Wert größer 3 ist, kannst du entweder jede Zelle einzeln schreiben:
If [A1] > 3 then...
If [A2] > 3 then...
Oder du kannst dir eine Schleife basteln, die das für mich macht.
Spalte bleibt immer gleich, Zeile von 1 bis 10 durchzählen.
Schau bitte in der Hilfe wie CELLS funktioniert.

Dim i as integer 'wir definieren uns eine Variable, die als Zähler und gleichzeitig als  _
Zeilennummer fungiert
'jetzt fängt die schleife an
For i = 1 to 10
if Cells(i,1).Value > 3 then .....
Next i
Und das war es dann. Die Schleife läuft dann die 10 Zellen durch und prüft.
__________________________
Zu deiner 2. Frage, Aktivierung der MAkros.
Wenn Du einen Code im VBE hast, dann kannst du ihn auch ausführen, da muss nix mehr aktiviert werden.
Die Frage, die beim Öffnen der Datei kommt, dient ja nur Deiner Sicherheit, da manche Makros mit dem Start der Datei automatisch ausgeführt werden.
Ich verstehe nicht ganz, was du mit "neue Makros sofort übernommen werden" meinst.
Sobald der Code da steht, kann er benutzt werden.
Gruß
Björn B.
AW: Erweiterung des VBA-Code auf mehrere Zeilen
11.02.2010 10:54:05
Stein
Hallo Björn,
ich habe den Code mal vervielfältig, so wie ich ihn brauche:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If [$AE4] > 0 And Target.Address = "$AC$4" Then
[AC5].Select
End If
If [$AE5] > 0 And Target.Address = "$AC$5" Then
[AC6].Select
End If
If [$AE6] > 0 And Target.Address = "$AC$6" Then
[AC7].Select
End If
If [$AE7] > 0 And Target.Address = "$AC$7" Then
[AC8].Select
End If
If [$AE8] > 0 And Target.Address = "$AC$8" Then
[AC9].Select
End If
If [$AE9] > 0 And Target.Address = "$AC$9" Then
[AC10].Select
End If
If [$AE10] > 0 And Target.Address = "$AC$10" Then
[AC11].Select
End If
If [$AE11] > 0 And Target.Address = "$AC$11" Then
[AC12].Select
End If
If [$AE12] > 0 And Target.Address = "$AC$12" Then
[AC13].Select
End If
If [$AE13] > 0 And Target.Address = "$AC$13" Then
[AC14].Select
End If
If [$AE14] > 0 And Target.Address = "$AC$14" Then
[AC15].Select
End If
If [$AE15] > 0 And Target.Address = "$AC$15" Then
[AC16].Select
End If
If [$AE16] > 0 And Target.Address = "$AC$16" Then
[AC17].Select
End If
If [$AE17] > 0 And Target.Address = "$AC$17" Then
[AC18].Select
End If
If [$AE18] > 0 And Target.Address = "$AC$18" Then
[AC19].Select
End If
If [$AE19] > 0 And Target.Address = "$AC$19" Then
[AC20].Select
End If
If [$AE20] > 0 And Target.Address = "$AC$20" Then
[AC21].Select
End If
If [$AE21] > 0 And Target.Address = "$AC$21" Then
[AC22].Select
End If
If [$AE22] > 0 And Target.Address = "$AC$22" Then
[AC23].Select
End If
If [$AE23] > 0 And Target.Address = "$AC$23" Then
[AC24].Select
End If
If [$AE24] > 0 And Target.Address = "$AC$24" Then
[AC25].Select
End If
If [$AE25] > 0 And Target.Address = "$AC$25" Then
[AC26].Select
End If
If [$AE26] > 0 And Target.Address = "$AC$26" Then
[AC27].Select
End If
If [$AE27] > 0 And Target.Address = "$AC$27" Then
[AC28].Select
End If
If [$AE28] > 0 And Target.Address = "$AC$28" Then
[AC29].Select
End If
If [$AE29] > 0 And Target.Address = "$AC$29" Then
[AC30].Select
End If
If [$AE30] > 0 And Target.Address = "$AC$30" Then
[AC31].Select
End If
If [$AE31] > 0 And Target.Address = "$AC$31" Then
[AC32].Select
End If
If [$AE32] > 0 And Target.Address = "$AC$32" Then
[AC33].Select
End If
If [$AE33] > 0 And Target.Address = "$AC$33" Then
[AC34].Select
End If
If [$AE34] > 0 And Target.Address = "$AC$34" Then
[AC35].Select
End If
If [$AE35] > 0 And Target.Address = "$AC$35" Then
[AC36].Select
End If
If [$AE36] > 0 And Target.Address = "$AC$36" Then
[AC37].Select
End If
If [$AE37] > 0 And Target.Address = "$AC$37" Then
[AC38].Select
End If
If [$AE38] > 0 And Target.Address = "$AC$38" Then
[AC39].Select
End If
If [$AE39] > 0 And Target.Address = "$AC$39" Then
[AC40].Select
End If
If [$AE40] > 0 And Target.Address = "$AC$40" Then
[AC41].Select
End If
If [$AE41] > 0 And Target.Address = "$AC$41" Then
[AC42].Select
End If
If [$AE42] > 0 And Target.Address = "$AC$42" Then
[AC43].Select
End If
If [$AE43] > 0 And Target.Address = "$AC$43" Then
[AC44].Select
End If
If [$AE44] > 0 And Target.Address = "$AC$44" Then
[AC45].Select
End If
If [$AE45] > 0 And Target.Address = "$AC$45" Then
[AC46].Select
End If
If [$AE46] > 0 And Target.Address = "$AC$46" Then
[AC47].Select
End If
If [$AE47] > 0 And Target.Address = "$AC$47" Then
[AC48].Select
End If
If [$AE48] > 0 And Target.Address = "$AC$48" Then
[AC49].Select
End If
If [$AE49] > 0 And Target.Address = "$AC$49" Then
[AC50].Select
End If
If [$AE50] > 0 And Target.Address = "$AC$50" Then
[AC51].Select
End If
If [$AE51] > 0 And Target.Address = "$AC$51" Then
[AC52].Select
End If
If [$AE52] > 0 And Target.Address = "$AC$52" Then
[AC53].Select
End If
If [$AE53] > 0 And Target.Address = "$AC$53" Then
[AC54].Select
End If
If [$AE54] > 0 And Target.Address = "$AC$54" Then
[AC55].Select
End If
If [$AE55] > 0 And Target.Address = "$AC$55" Then
[AC56].Select
End If
If [$AE56] > 0 And Target.Address = "$AC$56" Then
[AC57].Select
End If
If [$AE57] > 0 And Target.Address = "$AC$57" Then
[AC58].Select
End If
If [$AE58] > 0 And Target.Address = "$AC$58" Then
[AC59].Select
End If
If [$AE59] > 0 And Target.Address = "$AC$59" Then
[AC60].Select
End If
If [$AE60] > 0 And Target.Address = "$AC$60" Then
[AC61].Select
End If
If [$AE61] > 0 And Target.Address = "$AC$61" Then
[AC62].Select
End If
If [$AE62] > 0 And Target.Address = "$AC$62" Then
[AC63].Select
End If
If [$AE63] > 0 And Target.Address = "$AC$63" Then
[Y4].Select
End If
End Sub
So funktioniert er wie gewünscht. Wenn also eine Zelle in AC gesperrt wird, weil die Bedingung ">0" erfüllt ist, soll er auf die nächste Zelle in AC springen, deren Bedingung noch nicht erfüllt ist.
Ich habe versucht, deine Vorgabe für mein Ziel umzusetzen:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
For i = AC4 to AC63
if Cells(i,AC4).Value > 0 And Target.Address = cells(i,$AC$4) then
cells[i,AC5].Select
Next i
End If
End Sub
Habe aber ein oder mehrere Fehler dabei drin. Schon die erste Zeile "Private..." moniert der Kompiler.
Gruß
Stein
AW: Erweiterung des VBA-Code auf mehrere Zeilen
11.02.2010 11:43:12
Björn
Hallo,
zuerst mal der funktionierende Code:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim irow As Integer
irow = Target.row
If Target.Rows.Count + Target.Columns.Count > 2 Then Exit Sub 'ist mehr als 1 Zelle markiert?
If irow > 3 And irow  0 Then Cells(irow + 1, 29).Select
End If
End Sub
War ein kleiner Fehler von mir, du brauchst hier keine Schleife und zwar deshalb.
Mein Makro prüft nun, ob die mehr als 1 Zelle selektiert wurde, falls ja wird MAkri beendet.
Wenn nur 1 Zelle markiert ist, wird geprüft ob die Zeile der Markierung größer 3 und klener 64 ist. Also alle Werte von Zeile 4-63. Danach wird die Spalte geprüft, ob sie 29 ist, also AC.
Wenn das alles zutrifft, wird geprüft, ob der Wert in Spalte 31 (AE) der markierten Zeile größer 0 ist.
Trifft das auch zu, dann wird die Zelle unter AC markiert. Also irow+1 in Spalte AC.
Durch diese Markierung wird also die Selektion geändert. Diese ruft dann wieder das Selection_Change Makro auf.
Somit brauchst du das nur einmal prüfen, da die nächste Zeile durch den erneuten aufruf geprüft wird.
Es kann also sein, dass du z.B. AC5 markierst und dann das Makro x-mal aufgerufen wird, bis du in AC13 landest.
_____________________
Was hast du nun alles falsch gemacht bei Deinem Versuch...
Dein größter Fehler war glaube ich, dass du nicht das getan hast, was ich dir geschrieben habe.
Ich nehme mir hier viel Zeit, werde dir aber nicht alles erklären, was schon wo anders erklärt ist. Wenn ich dir sage, du sollst in die hilfe schauen, und CELLS durchlesen, wie man das anwendet, dann tu das bitte.
Wenn du das getan hättest, würdest du nciht sowas schreiben: Cells(i,AC4)
Vielleicht ist es am besten, wenn du dir mal ein VBA-Buch kaufst oder im Internet nach Grundlagen suchst und dir das einfach mal durchliest.
Kein Mensch setzt sich an das Steuer eines Jets, nur weil er schon mal in den Urlaub geflogen ist und vielleicht auch schon ein paar mal einen Knopf gedrückt hat ;-)
Schon klar, der Pilot drückt auch nur Knöpfe, schiebt ein paar Regler hin und her. Das ist ja nicht schwer....
Ist es eigentlich auch nicht, man muss eben nur wissen, welcher Knopf was macht bzw. um wieder auf Excel/VBA zurückzukommen, welche Befehl was macht und wie man ihn anwendet.
Also, aller Anfang ist schwer, aber wenn du wirklich Interesse an VBA-Programmierung hast, dann nimm dir die Zeit, dich mit den Grundlagen vertraut zu machen.
Du willst ja irgendwann selber was programmieren können und nicht immer irgendwelche Code-Schnipsel zusammenkopieren, oder?
Daher bringt es eigentlich nix, wenn ich dir den fertigen Code gebe, (was ich ja schon getan habe) und du den dann nicht verstehst, geschweige denn einfache Anpassungen machen kannst.
Du darfst hier natürlich gerne fragen, nur darfst du nicht erwarten, dass hier jede Antwort so ausführlich ausfällt.
Also dann wünsche ich Dir viel Erfolg.
Gruß
Björn B.
AW: Erweiterung des VBA-Code auf mehrere Zeilen
11.02.2010 13:43:21
Stein
Danke erstmal für deinen Aufwand!!! Es funktioniert einwandfrei!
Nur zur Klärung:
Mir geht es nicht darum, von dir oder jemanden anderes nur einen fertigen funktionsfähigen Code zu erhalten, den ich dann einsetze und fertig.
Da ich bislang kaum Ahnung von VBE-Programmierung habe, versuche ich auch, diese Codes nachzuvollziehen. Sicherlich kann ich mit den einzelnen Begriffen wie "Target.Row", "Target.Rows.Count", "Target.Columns.Count", usw. noch nicht viel anfangen, weil mir einfach zu viel Hintergrundwissen fehlt. Doch versuche ich so z.B. anhand deiner Beschreibung deinen Gedankengang, den Algorithmus zu verstehen: Warum macht er das so? Wie werden bestimmte Befehle geschrieben? Wie ist die Anordnung innerhalb einer Zeile?
Was mir auch nicht immer gelingt. Z.B., warum muss vorher überprüft werden, ob mehr als eine Zelle selektiert wurde?
Mit den fertigen Codes kann ich jedoch erstmal ohne zeitlich großen Aufwand, gerade auch als Neuling, bestimmte Dinge anschließend selber meinen Wünschen anpassen. So ist ja auch mein langer Code (s.o.) entstanden (siehe meine Änderungen und Erweiterungen).
Sicher, diese Form der Wissenerweiterung ersetzt kein Lehrbuch. Besonders, wenn es um die Begriffe und deren Besonderheiten, Parametereigenschaften u.ä. geht. Also um das Basiswissen. Aber ich lerne schneller mit Nachvollziehen als nur mit Lesen und Probieren (und der Hoffnung, dass es dann funktioniert). Auch das Ergebnis habe ich natürlich schneller - weil ihr es geschrieben habt. Was in diesem Fall auch ein Grund ist. Aber ich kann und will, wenn eine ähnliche Frage wieder auftreten sollte, mir diese Bauteile dann auch selber "zurecht basteln".
Ich möchte den Code auch noch ein bisschen erweitert haben: So soll, wenn der Bereich bis 63 durchgefahren wurde, wieder von vorn bei 4 angefangen werden. Gibt es innerhalb des Spaltenbereichs (AC4-AC63) keine Zelle, die die Bedingungen erfüllt, soll eine andere, bestimmte Zelle (Y4) "angefahren" werden.
Ich werde versuchen, selber zu einer Lösung zu kommen. Da es ja erstmal so läuft, drängt die Zeit auch nicht so. Aber um daran weiter experimentieren zu können, setzt es erstmal voraus, dass ich nachvollziehen kann, was du geschrieben hast und warum.
Gruß
Stein
einen Teil beantwortet...
12.02.2010 09:08:40
Björn
Hallo Stein,
meine Ausführungen waren/sind in keinster Weise böse gemeint. Ich sag das nur mal so zur Sicherheit, bevor Du was falsch verstehst.
Ich bin sehr beruhigt, dass Du auch "verstehen" willst, freut mich.
Sicherlich kann ich mit den einzelnen Begriffen wie "Target.Row", "Target.Rows.Count", "Target.Columns.Count", usw. noch nicht viel anfangen

Also erst mal "Target": Das wird automatisch in das Makro "Worksheet_SelectionChange" übergeben. Wenn Du Dir die erste Zeile ansiehst, steht da in Klammern (ByVal Target As Range).
Es handelt sich also um eine Range (einen Bereich). Excel übergibt also an dieses Makro die Adresse der neuen Selektion. Verstanden?
Target.Row: .Row gibt dir die Zeile des Objekts. Objekt ist in diesem Fall Target. Als Ergebnis erhälst du also die Zeile der neuen Selektion. Wenn es mehrere Zeilen beinhaltet, gibt Row die aktivierte Zeile zurück.
Zur Erklärung, selektieren kann man mehrere Zellen, aktiviert ist aber immer nur eine. MArkiere mal mehrere Zellen, oder einen großen Bereich und drücke dann die Tab-Taste. Diese verändert dann die aktivierte Zelle, nicht aber die Selektion.
Target.Rows.Count Rows sind dann alle Zeilen des Objekts (hier wieder Target). Count kannst Du selber übersetzen. Hier werden also alle Zeilen der Selektion gezählt.
Target.Columns.Count Columns sind Spalten, Es werden alle Spalten gezählt.
warum muss vorher überprüft werden, ob mehr als eine Zelle selektiert wurde?

Muss nicht unbedingt, ich dachte nur, dass es vielleicht sinnvoll ist. Das kannst du auch weglassen.
Musst Du selber entscheiden, ob das für Deinen Fall was bringt oder nicht. Auf jeden Fall spart es Performance, deshalb mach ich das fast immer rein bei Selection_Change.
Mach mal den Test: Lass die Zeile mal weg und MArkiere dann mehrere Spalten. Das kann dann schon ein paar Sekunden brauchen, bis hier jede Zelle geprüft wurde. Wenn aber gleich zu Beginn diese Prüfung drin ist, dann dauert es eben nicht lange.
Wie gesagt, Du musst selber entscheiden, ob in Deiner Anwendung auch dann die Markierung nach unten springen soll, wenn einer einen ganzen Bereich markiert (das macht man ja normal nicht, wenn man was eintragen möchte).
_________________________
Mit dem Hinweis, dir ein Buch kaufen bzw. dir die Grundlagen anzueignen wollte ich Dir helfen. ICh habe auch mal so angefangen wie du und mir irgendwoher immer eine Lösung kopiert und gebastelt und im Laufe der Zeit dann festgestellt, dass ich am Anfang einfach zu wenig wusste.
Um "gut" zu programmieren, wirst du nicht drum rumkommen, dir das mal anzueignen. Sonst wirst Du Dich hinterher nur ärgern, weil Du dann Sachen doppelt machst. Diese Zeit kannst du auch in die Grundlagen stecken, dann bist du am Ende gleich schnell :-)
____________________
Mit Deinen Anpassungen lass ich dich mal allein (wolltest du ja ;-)).
Falls Du nicht weiter kommst, einfach noch mal melden.
Gruß
Björn B.
AW: einen Teil beantwortet...
15.02.2010 08:51:49
Stein
Hallo Björn,
danke für deine erklärenden Antworten.
Ich hatte bis vor 4 Jahren in meiner Techikerschule auch das Prüfungsfach "Delphi-Programmierung". Aber da hatte ich auch schon das Problem, dass ich zwar meine Vorstellungen hatte, wie was passieren sollte, aber nie richtig wusste, wie das in Programmcode umzusetzen ist. Und VBA ist ja vom Konstrukt her ähnlich. Nur die Schreibweise bzw. Formulierung ist teilweise anders.
So kann ich zwar einiges verstehen, aber nicht immer unbedingt nachvollziehen. Und erst recht nicht mal selber schnell programmieren.
Von daher sind mir deine Ausführungen schon sehr hilfreich!
Ich habe auch schon ein Buch über VBA. Aber aus zeitlichen Gründen stand das immer nur im Regal. Werde zusehen, dass ich dafür mehr Zeit investiere. :-)
Zumal ich auch noch ein anderes Projekt habe, in welchem noch ein bisschen programmiert werden muss: Eine Tabelle soll automatisch um 40 Zeilen incl. Formeln und Formate erweitert werden, wenn die letzte Zeile der bisherigen Tabelle ausgefüllt worden ist. Und auch der Bereich in einer Zählenwenn-Funktion in einem anderen Tabellenblatt muss dann entsprechend angepasst werden.
AW: Makros aktivieren
11.02.2010 11:23:10
Stein
Habe ich noch vergessen, zu beantworten:
Wenn Du einen Code im VBE hast, dann kannst du ihn auch ausführen, da muss nix mehr aktiviert werden. Die Frage, die beim Öffnen der Datei kommt, dient ja nur Deiner Sicherheit, da manche Makros mit dem Start der Datei automatisch ausgeführt werden.
Das ist bei mir auch so.
Ich verstehe nicht ganz, was du mit "neue Makros sofort übernommen werden" meinst.
Sobald der Code da steht, kann er benutzt werden.
Macht er jetzt auch so. Komisch. Gestern hatte ich in meine Versuchs-Excelmappe den Code von JoWE reinkopiert. Aber den wollte er nicht nehmen. Erst nachdem ich die Mappe gespeichert, geschlossen und dann wieder (mit Makroaktivierung) geöffnet hatte, funktionierte es.
Habe es jetzt nochmal probiert. Es läuft. keine Ahnung, was da war. Diese Frage hat sich also erledigt.
Gruß
Stein

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige