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

Excel Liste mittels Makro erstellen

Excel Liste mittels Makro erstellen
03.11.2023 12:54:08
Klaus Schön
Ich möchte eine Tabelle erzeugen, die sich selbst "heilen" kann. Die meisten Zellen enthalten Formeln. Andere dageben sind Listenfelder. So kann ich mittels Listenfeld beispielsweise einen Artikel auswählen und der dazu hinterlegte Arbeitswert wird zur weiteren Berechnung herangezogen. Also grundsätzlich alles einfache Sachen. Ich möchte nun verhindern, dass andere Anwender die Tabelle "zerstören" können. Deswegen habe ich Worksheet_Change Prozeduren angelegt. Löscht man eine der Formeln, wird die Zelle automatisch mittels Makro wieder mit der Formel gefüllt. Ich kann also die Formel mit einem Zahlenwert überschreiben. Lösche ich den Zahlenwert, wird die Formel wieder hergestellt. Es ist eigentlich nicht vorgesehen, die Formel zu überschreiben, aber es kommt vor.... Letztendlich ist das aber egal. Jetzt hat es aber jemand geschafft, dass so ein Listenfeld "zerstört" wurde. Durch löschen des Feldinhaltes passiert das ja nicht, ich kann danach wieder einen Wert aus der Liste auswählen. Ich vermute hier wurde eventuell durch versehentliches "Herunterkopieren" die Listenfunktion entfernt. Die Zellen sind nun einfach nur leer.... kein Verweis mehr auf die Liste. Deswegen suche ich nun einen Weg, wie dich diese Listenfunktion ebenfalls beim Löschen des Feldinhaltes wieder herstellen kann...

Hier ist mein Code, damit eine Formel nach deren Löschung wieder hergestellt wird:
Dim objRange11 As Range, objCell11 As Range
Set objRange11 = Intersect(Target, Range("V5:V99"))
On Error Resume Next
If Not objRange11 Is Nothing Then
For Each objCell11 In objRange11
With objCell11
Select Case UCase$(.Value)
Case Is = "": .FormulaLocal = "=WENNFEHLER(WENN(ODER(INDIREKT(""U""&ZEILE())="""";INDIREKT(""T""&ZEILE())="""");0;AUFRUNDEN((INDIREKT(""u""&ZEILE())-INDIREKT(""T""&ZEILE()))*24;0));0)"
End Select
End With
Next
Set objRange11 = Nothing
On Error GoTo 0
End If

Das funktioniert also soweit.

Nun habe ich ja aber auch Listenfelder.....

Ich habe konkret in einem Tabellenblatt eine Mitarbeiterliste (sind nur 4 Stück). Auf diese verweise ich in der Haupttabelle mittels Listenfeld =WENN(B5>"";Monteure!$B$2:$B$5;"leer").

Gibt es eine Möglichkeit dieses Listenfeld automatisch (neu) zu erstellen, wenn der Feldinhalt gelöscht wird?

27
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel Liste mittels Makro erstellen
03.11.2023 13:52:43
Max
Wozu ein Makro dass bei Änderung Formeln wiederherstellt, wenn keine Änderung in entsprechender Zeile vorgesehen ist?
Warum werden die Zeilen nicht einfach gegen Änderung gesperrt?
AW: Excel Liste mittels Makro erstellen
04.11.2023 16:04:08
Oberschlumpf
Hi Klaus,

wenn ich lese (oder so ähnlich wie):"...Dachte das wäre klar, hätte den Code des Listenfeldes ja schon gepostet.... (hätte soll wohl hatte heißen?), dann muss ich oft grinsen.
Nein! Ich lache dich, oder andere mit ähnlichen Formulierungen nicht aus! Ich muss in solchen Fällen halt nur grinsen - das ist von mir nicht böse gemeint!
Denn ihr meint eure Fragen mit diversen Formulierungen ja auch nicht böse.

a) jemand hat eine Frage, weil er/sie die allein nicht beantworten kann. Dieser jemand hat zu der Frage auch eine Datei mit Daten - kann eine Frage trotzdem noch nicht allein beantworten. Aber dann wird mit einem Hinweis wie "...dachte das wäre klar..." erwartet, dass mögliche Antworter all das auch ohne Datei verstehen. :-))

b) Deine sich selbst wiederherstellende Formel beinhaltet viele Bedingungen - bitte wie, ohne Datei, soll denn ein Antworter wissen, welche Werte (Zahlen?/Texte?) in welchen Zellen stehen sollen?

So schließe ich mich Max an, und auch ich bitte dich, uns bitte mal per Upload eine Excel-Bsp-Datei mit genügend Bsp-Daten und deinem Code zu zeigen.

Ciao
Thorsten
Anzeige
AW: Excel Liste mittels Makro erstellen
04.11.2023 18:53:36
Klaus
Hallo Max,
Hallo Thorsten,

sorry, wenn ich mich unklar ausgedrückt habe. Ich hatte als Beispiel einmal einen Code gepostet, der eine normale Formel (ja, die hat diverse wenn/dann Varianten, da könnte aber bei formula auch nur A1 X B1 stehen, also was total simples) beinhaltet. Es ging grundsätzlich aber nur darum, was passiert da. Dieser Code bewirkt, das im Falle einer Löschung der Formel in der Zelle, diese wieder hergestellt wird. Auf diese Weise habe ich alle Zellen mit normalen Formeln abgesichert. Ich kann jetzt nicht sagen, ob die Berechnung dieser Formeln weiterhin funktioniert, wenn diese Zellen gesperrt werden und der Blattschutz aktiviert wird. Vermute aber das ist nicht so, sonst hätte ich das ja einfach so machen und mir diese Wiederherstellungsoption sparen können. Mit normalen Formeln funktioniert also alles, so wie ich es wollte.

Jetzt gibt es aber eben auch Zellen mit Listenfunktion. Hier weiß ich definitiv: Sperre ich diese Zellen, funktioniert die Listenfunktion nicht mehr. Also habe ich die Zellen nicht gesperrt. Und nun kommt die Tage einer der Nutzer.... "Bei mir ist dieser Pfeil verschwunden, ich kann da nichts mehr auswählen". Ergebnis.... die Zellen sind jetzt alle leer. Irgendwie hat der das geschafft. Ich weiß, das die Listenfunktion beim einfachen Löschen des Zellinhalts normalerweise nicht verloren geht.

Max: Das Löschen hat bei mir also auch keine Zerstörung der Listenfunktion zur Folge.

Trotzdem wurde es geschafft. Ich habe versuchsweise mittels ziehen und kopieren den Zellinhalt (die ist leer) der Nachbarzelle in die Listenfeldzelle gezogen. Und siehe da, die Listenfunktion ist futsch. Es gibt also Wege das auch unbewusst zu schaffen....

Der einfachste Weg für mich wäre, wenn bei der Blattschutzaktivierung auch die Zulässigkeit der Veränderung nur durch Listenfeldeinträge auswählbar wäre. Aber das gibt's ja nicht. Ergo suche ich jetzt nach der Möglichkeit der Wiederherstellung mittels Makro. Es ist da sicherlich egal, wo die Daten für die Liste stehen. Die könnten auch im gleichen Blatt stehen. Es geht einfach nur darum: Wie lässt sich so ein Listenfeld gegen versehentliche Zerstörung schützen?
Anzeige
bitte wer anders
04.11.2023 20:13:35
Oberschlumpf
Hi Klaus,

ok, du willst uns keine Bsp-Datei zeigen - so will auch ich nich weiter helfen...aber grinsen muss ich weiterhin.

Ciao
Thorsten
AW: bitte wer anders
04.11.2023 20:49:35
Klaus
Hallo Thorsten,
ich schicke eine Datei. Wann kann ich noch nicht sagen. Kann ein paar Tage dauern, liege seit einigen Tagen mit schwerer Erkältung flach. Wie soll die denn aussehen? In meiner Datei liegen sensible Kundendaten. Die kann/darf ich nicht rausgeben. Ich suche ja eine allgemeine Lösung für jedes xbeliebige Listenfeld. Ich kann natürlich jetzt eine Datei erstellen, die das bereits gepostet Feld enthält. Also ein Listenfeld, das 4 Kürzel von Monteurnamen enthält. Solange das Feld nicht "zerstört" wird, kann man da also lediglich einen der 4 Einträge wählen. Aber da ist ja dann Nullkommanichts drin enthalten, was die gesuchte Wiederherstellung betrifft!? Deswegen kapiere ich es nicht so richtig, was die Datei bringen soll. Aber OK....

Anzeige
AW: bitte wer anders
04.11.2023 21:21:21
Mullit
Hallo,

viell mal kurz zw.-durch, weil du ja schon ein Chg Event hast, da gäbe es auch was für Deinen Listen-Fall, zur Wiederherst.
Option Explicit


Private Sub Worksheet_Change(ByVal Target As Range)
Dim objRange As Range
If Target.Address = "$D$1" Then '// Hier Deine Datenüberpr./Listenzelle anpassen...!!!
On Error Resume Next
Set objRange = Target.SpecialCells(xlCellTypeSameValidation)
On Error GoTo 0
If objRange Is Nothing Then
With Target.Validation
Call .Add(Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=$A$1:$A$10") '// Hier Dein Listenbereich anpassen...!!!
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
Else
Set objRange = Nothing
End If
End If
End Sub

Gruß, Mullit
Anzeige
AW: bitte wer anders
04.11.2023 21:29:29
Klaus
Hallo Mullit,

denke das ist was ich suche. Danke!!!
AW: bitte wer anders
05.11.2023 06:59:06
Oberschlumpf
Moin Klaus,

auch wenn dein Problem gelöst zu sein scheint, möchte ich trotzdem noch deine Frage an mich beantworten - "Wieso ich ne Datei haben wollte?".

Du schreibst von Anfang bis zu deinem Beitrag an mich von einem Listenfeld.

ICH verstehe unter "Listenfeld" DAS hier:

Userbild

...weil nämlich MS DAS genau auch als solches bezeichnet❗

DU aber meintest die ganze Zeit (erkenn ich im Code von Mullit, der ja nach deiner Antwort "zu passen" scheint), DAS hier:

Userbild

...DAS ist kein Listenfeld, sondern eine Datengültigkeitsliste (Nein! Das ist nicht das Gleiche!)

Und genau deshalb ist mir eine gezeigte Bsp-Datei immer lieber als nur das "erklärende Wort" - denn Dinge beim falschen Namen zu nennen, ist schon viel zu oft passiert.

Ciao
Thorsten
Anzeige
AW: bitte wer anders
05.11.2023 09:34:14
Klaus
Hallo Thorsten,
sorry, mein Fehler. Da bin ich wohl schon früher falsch geleitet worden. Diese Datengültigkeitsliste habe ich damals beim Googeln nach "Excel Listenfeld" (erschien mir damals als Beschreibung eigentlich logisch) im Netz gefunden. Zudem ging ich davon aus, dass der Code, den ich dazu in einem meiner anfänglichen Posts geschickt habe, genau beschreibt, was ich da habe. Es sei den ein MS-Listenfeld hätte jetzt den gleichen Codeaufbau.

Also Asche auf mein Haupt....

LG, Klaus
AW: bitte wer anders
05.11.2023 10:04:15
Oberschlumpf
Hi Klaus,

ja, leider hast du recht mit dem "fehlgeleitet".
Ich schrieb ja auch nicht, dass nur du (falsche) Wörter für etwas verwendest, was eigtl ganz anders heißt.

Na ja, wieso ich dir erneut antworte: Wieder schreibst du...
"...Zudem ging ich davon aus, dass der Code, den ich dazu in einem meiner anfänglichen Posts geschickt habe, genau beschreibt, was ich da habe...."

a) in deinem (mehr oder weniger vollständig) gezeigten Code wird "nur" eine Formel wiederhergestellt

b) als zusätzlichen Codeschnipsel zeigst du noch:
"Auf diese verweise ich in der Haupttabelle mittels Listenfeld =WENN(B5>"";Monteure!$B$2:$B$5;"leer")."

Du verwendest wieder die Bezeichnung "Listenfeld", was mich irritierte, und ich fragte mich: "Wie funktioniert das mit einem Listenfeld (das Echte!)???"
Ich wollte aber nicht selbst eine Bsp-Datei erstellen, um genau das auszuprobieren, weil ja von dir NULL Daten gezeigt wurden. respektive was (Daten) genau wo (in welchen Zellen) steht - die mageren Infos "B2:B5" waren mir zu wenig.

Nun denn, du hast deine Meinung - ich hab meine. Und es war für mich wichtig, dass ich dir erneut antworte.

Ciao
Thorsten
Anzeige
AW: bitte wer anders
05.11.2023 11:32:14
Klaus
Hallo Thorsten,

ich habe doch nicht geschrieben "ich gehe davon aus" sondern "ich ging davon aus". Meine Aussage bezog sich also auf den Zeitpunkt bevor Du mir den Unterschied zwischen einem Listenfeld und einer Datengültigkeitsliste erläutert hast. In meiner Annahme, dass der Code meiner "Datengültigkeitsliste" jeden Profi hier im Forum sofort erkennen lässt, von was ich rede, habe ich den gepostet. OK, wenn dieser Code natürlich auch für diverse andere Funktionen/Listen/usw. verwendet werden und somit nicht eindeutig dieser Datengültigkeistliste zugeordnet werden kann, funktioniert das natürlich nicht. Da habe ich dann mit meiner Absicht, das jeder gleich erkennt, was ich meine, wohl ins Klo gegriffen.

Sorry, ich erstelle zu 99% meine Makros mit dem Recorder. Danach bastle ich dann oft viele Tage daran, um mein Ziel zu erreichen. Und wenn es dann mal funktioniert kann es gut sein, dass ich ein zwei Jahre überhaupt keine Makros mehr basteln muss. Dann ist das für mich wie ein totaler Neuanfang.

Aber da Du ja nun weißt, nach was ich hier suche, kannst Du mir ja vielleicht weiterhelfen..... wenn nicht eventuell ja Mullit???

Meine Tabelle ist wie folgt aufgebaut: In den Zeilen 1-4 habe ich Nur ein paar Textangaben und die Spaltenüberschriften.
Der Eingabebereich beginnt in Zeile 5 und endet in Zeile 99. Ich brauche also keine Tausende von Datensätzen. Meistens reichen 30 im Monat. Habe halt mal bis Zeile 99 die Formeln reinkopiert. Beim Ausdrucken wird geprüft, bis wohin was drin steht und der Druckbereich angepasst. In Spalte B steht das Arbeitsdatum. Hier wollte ich bewirken, dass ohne Datum nichts geht. Ich rufe also bei fast allen Formeln in der Tabelle zunächst ab, ob in der Spalte B was steht. Steht da nix drin, kann in andere Spalten auch nichts eingegeben werden bzw. es wird nichts angezeigt oder halt eine leere Zelle. Der Datenbereich von 5 bis 99 findet sich in meinem Code für die Wiederherstellung eines Formelfeldes. Das war der längere Codeschnipsel. Hier habe ich ja den Bereich irgendwie festgelegt und die Formel selbst enthält mittels Indirekt + Zeile() ja einen variablen Bezug. Damit funktioniert der Code egal in welcher Zeile (5-99). Ähnlich so wie wenn man eine Formel durch Ziehen runterkopiert. Da werden ja die Zellbezüge automatisch angepasst (solange die keine $$ haben).

Dieses Datengültigkeitslistenfeld = DGF gibt es logischerweise nun auch in den Zeilen 5-99. Hier hatte ich mit Ziehen und Runterkopieren gearbeitet. Hat soweit funktioniert.

Ein Fehler wird dagegen angezeigt, wenn ich versuche in dieses DGF =WENN(INDIREKT("B"&ZEILE())>"";Monteure!$B$2:$B$5;"leer") einzutragen. Ich bekomme die Formel zwar mit Ignorieren des Fehlers rein, aber das DGF funktioniert dann nicht. Geht das so generell nicht oder ist mein Code falsch?


Wenn es generell nicht geht, hat sich die weitere Frage erledigt. Wenn nicht.....

Der Code, den mir Mullit gepostet hat, ist wohl fix auf eine einzelne DGF Zelle gedacht. Ich brauche aber eine analoge Lösung wie die für eine Formel. Das ich also alle Zellen damit abdecke (in meinem Fall V5-V99). Oder muss ich den Code von Mullit für jede einzelen Zelle erstellen (iiihhhhh)?

Hoffentlich habe ich jetzt nicht schon wieder irgendwas geschrieben, dass kritisiert werden müsste....
Anzeige
AW: bitte wer anders
05.11.2023 11:58:50
Oberschlumpf
Hi Klaus,

ich versuch gern zu helfen, wenn du uns bitte per Upload eine Bsp-Datei zeigst, die alles enthält, was erforderlich ist, um dein Problem zu verstehen.
Diese Bitte nach Bsp-Datei gilt nur für mich!

Du musst das also nicht tun. Mullit, oder vllt auch wer anders, kann ja vllt wieder helfen.

Ciao
Thorsten
AW: bitte wer anders
05.11.2023 13:11:51
Klaus
Hallo Thorsten,

hier also meine Datei in abgespeckter Form. Habe alle schützenswerten Daten rausgenommen oder geändert. Alles allgemein gehalten.

Wir haben diverse Auftraggeber aus dem gleichen Tätigkeitsfeld. Jeder hat andere Vergütungen. Zeitaufwand rechnet der einen je halbe Stunde ab, der nächste zahlt die erste Stunde voll und dann viertelstündlich usw. usw.

Ich habe deshalb so eine Exceltabelle angelegt, bei der dann alle Preislisten enthalten sind. Ändern sich die Preise, muss ich nur diese Tabelle ändern und alles passt wieder. Zeit wird automatisch über Ankunft Abfahrt ermittelt usw. usw.

Datumsfeld ist zwingend. Dort kein Datum rein, geht es nicht weiter (wenn ich was übersehen habe vielleicht doch, sollte aber nicht sein).

Einige Felder sind einfache Textfelder, wie Kundenname, Auftragsnummer usw.
Eigentlich sollen Eingaben nur in grüne Spalten erfolgen (die gelben rechnen selbst). Aber manchmal kommt es vor, dass wir doch einen Spezialpreis haben, der nicht über die Datenliste bezogen werden kann. Deswegen sperre ich die Felder nicht komplett, so dass man trotzdem was anderes reinschreiben könnte. Macht man da einen Fehler, einfach Feldinhalt löschen und der Makro erzeugt die Formel neu. Das war der Hintergedanke.

Jetzt gibt es in der Tabelle mehrere solcher wie Du Sie nennst Datengültigkeitslistenzellen (wenn ich es richtig sehe, nennt man die Dropdown-Feld - wird jedenfalls beim Googeln so angezeigt. Ist ja aber egal, wir wissen ja was gemeint ist....

Ich muss hier nochmal was einschieben, kann es mir nicht erklären.... wenn ich den Blattschutz aktiviere, funktioniert so eine DGF auf einmal einwandfrei. Warum das zuvor nicht ging (da kam ja eine Meldung hoch, wenn ich aus der Liste einen anderen zulässigen Wert ausgewählt habe - das dies nicht zulässig sei) kapiere ich nicht. Ich bin aber mit dem Problem wohl nicht alleine. Habe beim Googeln Beiträge gefunden, die das genauso schildern.... sonst wäre ich ja überhaupt nicht auf die Idee gekommen......

Wie dem auch sei. Du siehts sicherlich anhand meines Codes, dass alle Formelfelder über die gleiche Weise wiederherstellbar sind. Ich suche nun also den Code, wie das analog mit so einem DGF funktioniert. Es ist mir nicht gelungen, den Code des DGF mit Indirekt und Zeile() so hinzubekommen, dass er grundsätzlich funktioniert. Entweder es geht einfach da nicht oder ich bau den Code falsch zusammen. Die Formeln sind alle mit Indirekt und Zeile() versehen. Man kann die ganzen Zellen so einer Spalte leeren und dann füllt der Makro sie wieder auf....

Genauso sollte dies auf für die DGF funktionieren.

Ich kann es mir immer noch nicht erklären. Selbst wenn der Blattschutz aus ist, leert man diese Zellen bleibt trotzdem die DGF Funktion erhalten. Keine Ahnung, wie man die zerstören konnte, aber irgendwie schafft es immer einer..... mir ist es auch schon ab und an passiert, dass ich mit der Maus über ein Tabellenblatt fahre und vielleicht zu früh klicke. Anstelle eine Zelle zu aktivieren treffe ich dieses kleine Quadrat an der rechtenn unteren Zellecke und zieh die Maus noch zwei cm weiter und schon habe ich was kopiert, was ich gar nicht wollte....
Anzeige
AW: bitte wer anders
05.11.2023 17:10:28
Oberschlumpf
Hi Klaus,

der Link zur Datei fehlt.
- Datei bitte noch mal uploaden
- vor Schließen des Upload-Fenster Link-Text komplett markieren, kopieren
- in deiner nächsten Antwort einfügen

Ciao
Thorsten
AW: bitte wer anders
05.11.2023 20:15:18
Mullit
Hallo,

 Oder muss ich den Code von Mullit für jede einzelen Zelle erstellen (iiihhhhh)? 

das wollen wir nicht hoffen...;-)...einfach den Target Bereich oben anpassen, ich hab den Code noch etwas gekürzt, da sowieso On Error verw. wird, geht aber beides...
Option Explicit


Private Sub Worksheet_Change(ByVal Target As Range)
Dim enmXlDVType As XlDVType
If Not Intersect(Target, Range(Cells(5, 22), Cells(99, 22))) Is Nothing Then '// Hier jetzt Dein Bereich V5-V99...!!!
On Error Resume Next
enmXlDVType = Target.Validation.Type
If Err.Number > 0 Then
On Error GoTo 0
With Target.Validation
Call .Add(Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=$A$1:$A$10") '// Hier Dein Listenbereich anpassen...!!!
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If
End If
End Sub

Gruß, Mullit
Anzeige
AW: bitte wer anders
05.11.2023 21:27:46
Klaus
Hallo Mullit, erstmal vielen Dank für den Code. Habe aber noch ein weiteres Problemchen. Meine Listendeklaration hat ja noch eine Wenn Abfrage. Damit möchte ich eine Auswahl eines Listeneintrages verhindern, wenn in Spalte B in der entsprechenden Zeile nichts steht. Mein Feld habe ich durch ziehen/kopieren von Zelle Y5 bis Zelle Y99 herunter kopiert. So steht in y5 jetzt "=wenn(B5>""....." in Y6 steht "=wenn(B6....... usw.

Bei Deinem Code würde doch jetzt in jeder Zeile die Zelle B5 abgefragt, richtig? Bei meinen normalen Formelzellen habe ich ja mit indirekt und Zeile() gearbeitet, damit die Berechnung sich immer auf die Werte der jeweiligen Zeile beziehen. Ich habe es aber nicht geschafft mit indirekt und Zeile () in der Listendeklaration zu arbeiten. Das gab eine Fehlermeldung. Geht das so generell nicht bei so einer Listen oder ist mein Code falsch?

Sinngemäß wäre mein Code: =WENN(INDIREKT("B"&ZEILE())>"";Monteure!$B$2:$B$5;"leer")

Aber der führt zu einem Fehler. Ich kann zwar die Fehlermeldung ignorieren, dann wird das "Listenfeld" so erzeugt, aber es funktioniert nicht, ich kann also keine Listenelemente auswählen.
AW: bitte wer anders
05.11.2023 21:57:31
Mullit
Hallo,
Bei Deinem Code würde doch jetzt in jeder Zeile die Zelle B5 abgefragt, richtig?

NEIN!!! in meinem Bsp setz ich erstmal eine einfache 10 Zeilen Liste im Formula1 Param voraus, Spalte V Zeile 5-99 wie zuerst von Dir angegeb., wird geprüft und einfach die Liste wieder hergestellt.
Für andere Spalten, oder Zeilen musst Du im Rangebereich über die Zeilen-und Spaltennummern erweitern...
If Not Intersect(Target, Range(Cells(5, 22), Cells(99, 22))) Is Nothing Then '// Hier jetzt Dein Bereich V5-V99...!!!

Wenn Du die Listen mit Formeln fütterst, müsstest Du den Formula1:= Parameter im Code anpassen, versuch das mal selbst mit dem Makrorekorder, laufen lassen und eine Datenüberpr. mit Formel erstellen, dann das ganze in Dein Chg Event packen...
Mehr kann ich erstmal auch nicht sagen...

Gruß, Mullit
AW: bitte wer anders
06.11.2023 10:07:39
Klaus
Hallo Mullit,

ich fürchte, ich habe mich wieder nicht richtig ausgedrückt. Ich habe schon gesehen, dass Du den Code so angepasst hast, dass er die Zellen V5 - V99 berücksichtigt. Grundsätzlich löst das also das "Hauptthema".

Solange die Listendefinition - in Deinem Code a1 bis a10 - lediglich bzw. nur als Bereich defininiert wird, funktioniert das sicherlich so.

Ich haber aber ja in meiner Listendefinition eine wenn-Abfrage eingebaut. Ebenso wie in allen Formelfeldern. Da frage ich immer erst ab, ob in der Spalte B der jeweiligen Zeile (5-99) ein Eintrag vorhanden ist (da steht das Datum des Arbeitseinsatzes drin).

Die Berechnungsformeln sind allesamt so aufgebaut, dass bei Fehlen eines Datums in Spalte B die Zellinhalte der Formelfelder geleert werden oder halt auf "" gesetzt werden.
Den gleichen Effekt wollte ich auch bei diesem Listenfeld bewirken. Also lautet mein Code für die Listendefinition in Zelle Y5 =WENN(B5>"";Monteure!$B$2:$B$5;"leer").

Das Problem dabei ist halt, dass ich hier konstant auf die Zelle B5 Bezug nehme (was ja für die Zeile 5 stimmt. Aufpassen dieses B5 bezieht sich ja auf die Zelle in diesem Tabellenblatt und nicht auf die Listeneinträge - die liegen ja in einem separaten Blatt "Monteure....." und da gibt es zufällig auch B5!!!

Wenn ich also nun Deinen Beispiel a1-a10 mit meinem Code =WENN(B5>"";Monteure!$B$2:$B$5;"leer") ersetze, funktioniert das doch nur für die Zelle Y5 korrekt. In der Zelle Y6 müsste ja aber =WENN(B6>"";Monteure!$B$2:$B$5;"leer") stehen. Der Code würde mir die Listendefinition in alle Zellen mit der B5-Abfrage eintragen....

Ich suche also noch den Weg, wie ich den Zellbezug "B5" variabel definieren kann. In meinen Formelfeldern steht deswegen ja immer beispielsweise
=WENN(ISTLEER(INDIREKT("B"&ZEILE()));"";"Auftraggeber1")

Die Zeilennummer ist hier variabel über die Funktion "Zeile()" eingebaut.

Das gleiche versuche ich nun mit der Listendefinition zu erreichen.

Anstelle von bisher =WENN(B5>"";Monteure!$B$2:$B$5;"leer") müsste da so etwas rein wie =WENN(INDIREKT("B"&Zeile())>"";Monteure!$B$2:$B$5;"leer")

Aber dieser Code funktioniert nicht.

Deswegen die Frage: Geht das so mit Indirekt und Zeile() in der Listendefinitionsformel überhaupt nicht, oder ist mein Code nur falsch (mit diesem Indirekt habe ich auch noch so meine Probleme wo/was in Anführungszeichen gesetzt werden muss und was nicht).

Mit dem Makroeditor wird das vermutlich nicht hinhauen, oder? Denn dazu müsste ich ja die korrekte Formel kennen. Meine wird ja als fehlerhaft bemägelt. Ich kann die Fehlermeldung zwar ignorieren, wenn ich die Liste so erstelle, aber die Formel funktioniert dann nicht - es sind keine Listeneinträge sichtbar wenn ich auf den DropDownPfeil klicke.

LG, Klaus




AW: bitte wer anders
06.11.2023 12:50:15
Klaus
Hallo Mullit,
jetzt bin ich ganz ratlos.
Offensichtlich hatte ich bereits eine Lösung für das "indirekt & Zeile()" Problem gefunden. Ist schon so lange her.... wusste ich überhaupt nicht mehr. Allerdings kann ich nicht sagen, wie mir das gelungen ist....

Ich habe in der Tabelle mehrere Dropdowns in die man nur "ja" eintragen kann, also entweder leer oder ja.

Der Listeneintrag "ja" steht in der Tabelle in einer eigenen Zelle AZ2. Da steht also nur der Text ja drin.

Die Dropdowns funktionieren einwandfrei. Als ich nun bei meinen Versuchen darauf gestossen bin und mich schon gefreut habe kam die Ernüchterung....

Wenn ich die Einstellungen so eines Ja-Dropdowns öffene und mit OK wieder schließen möchte, kommt: Der angegebene benannte Bereich wurde nicht gefunden.
Dabei ist die Zelle AZ2 markiert indem ja eingetragen ist.
Habe nach diesem Fehler gegoogelt. Bereich/Name könnte falsch sein. Jedoch: Ich habe überhaupt keine Namen vergeben. Im Namensmanager wird kein einziger Name angezeigt.

Die Formel sieht wie folgt aus: =WENN(ISTLEER(_xlfn.SINGLE(INDIREKT("B"&ZEILE())));"";$AZ$2:$AZ$2)

Unter diesem SINGLE habe ich was gefunden von wegen es wird Code verwendet, der in jüngeren Excelversionen als 2007 nicht funktioniert. Das wäre mir relativ egal. Jüngste Version ist 2010 bei mir irgendwo im Einsatz.

Es ist schon eine ganze Weile her aber ich kann mich dunkel erinnern, dass ich schon mal Probleme mit der Eingabe einer Formel in eine Dropdown hatte. Irgendwo hatte ich dazu einen Tipp gefunden, von wegen erst Formel eingeben aber nicht die Listenfunktion wählen. Wurde die dann akzeptiert als Liste umstellen. Glaube ich zumindest. Kann mich aber auch irren....

Die Formel oben macht ja eigentlich was sie soll. Nur wenn ich die jetzt versuche für meine Monteurliste zu verwenden, komme ich an der Fehlermeldung nicht vorbei. Es ist echt zu Haare raufen...


AW: bitte wer anders
08.11.2023 19:42:45
Mullit
Hallo,

ah ok sorry, da hatte ich dich tatsäch. missverstanden, wenn's Dir immer noch ums resetten der Listen geht, brauchst Du im Event Code ja nur die ZeilenNr Deiner Formel abfragen, etwa so:
Option Explicit


Private Sub Worksheet_Change(ByVal Target As Range)
Dim enmXlDVType As XlDVType
If Not Intersect(Target, Range(Cells(5, 25), Cells(99, 25))) Is Nothing Then '// Hier jetzt Dein Bereich Y5-Y99...!!!
On Error Resume Next
enmXlDVType = Target.Validation.Type
If Err.Number > 0 Then
On Error GoTo 0
With Target.Validation
Call .Add(Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=IF(B" & Target.Row & ">"""",$A$1:$A$10,"""")") '// Hier Dein Listenbereich Tabelle anpassen...!!!
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End If
End If
End Sub

Gruß, Mullit
AW: Excel Liste mittels Makro erstellen
03.11.2023 14:28:31
Klaus Schön
Zellen schützen führt dazu, dass die Listenfunktion nicht funktioniert eben weil sie gesperrt sind. Oder kann man das auch so einstellen, dass Listenelemente auswählbar sind? Da kann man ja bei der Aktivierung des Blattschutzes jede Menge Optionen aktivieren. Vielleicht muss ich da nur irgendwo einen Haken mehr setzten, wenn ja, welchen?
AW: Excel Liste mittels Makro erstellen
03.11.2023 16:04:50
Max
Ja kann man einfach die Zelle in der ausgewählt wird nicht sperren
AW: Excel Liste mittels Makro erstellen
03.11.2023 18:44:11
Klaus
Ja aber das ist genau das was ich nicht möchte. Denn offensichtlich war das der Grund weshalb mir mittlerweile schon wieder einer diese Zellen kaputt gemacht hat, anstelle der Auswahlliste sind die Zellen jetzt leer. Das passiert sicherlich nicht absichtlich da wird irgendwas auf die schnelle reingetippt und man erwischt vielleicht aus Versehen irgendeine Tastenkombination und schon ist es passiert. Ich suche also eine Lösung dafür wie ich dieses versehentliche Löschen oder Entfernen der Listen Eigenschaft verhindern kann und trotzdem die listenfähigkeit erhalte.
AW: Excel Liste mittels Makro erstellen
04.11.2023 14:56:20
Max
Wo stehen de Werte deiner Auswahlliste?
AW: Excel Liste mittels Makro erstellen
04.11.2023 15:05:33
Klaus
In einem eigenen Tabellenblatt "Monteure" B2:B5. Dort ist nicht gesperrt und das Blatt auch nicht geschützt. Das blende ich aus. Dachte das wäre klar, hätte den Code des Listenfeldes ja schon gepostet.
AW: Excel Liste mittels Makro erstellen
04.11.2023 15:18:47
Max
Also bei mir löscht sich da nichts solange alles gesperrt ist, bis auf das Auswahlfeld.
Lade am besten mal eine Beispieldatei hoch.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige