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

Function soll Zellwert ändern

Function soll Zellwert ändern
12.04.2017 20:45:01
Barbaraa
Hallo
würde gerne ein Nebenergebnis einer "Function" in eine Zelle schreiben.
Allerdings bringt "Function" einige Einschränkungen, zB Zellen verändern.
Gibt es dazu vielleicht dennoch einen Weg?
Im folgenden Beispiel gibt eine "Function" die Zelladresse rechts neben dem Suchbereich in der Fundzeile des Funktionsarguments als String zurück.
Genau dort soll aber nach jeder Suche der Wert um 1 erhöht werden, damit man sieht, wo am häufigsten etwas gefunden wurde.
Das geht aber in einer "Function" eben nicht. Aber vielleicht gibt es da einen einfachen Trick.
Function SuchenUndFinden(Ausdruck As String)
Dim Zelle As Range
Dim Bereich As Range
Dim CounterSpalte As Long
Dim CounterZeile As Long
Set Bereich = Range("K8:L12")
Set Zelle = Bereich.Find(what:=Ausdruck, LookIn:=xlValues, lookat:=xlWhole)
If Not Zelle Is Nothing Then
CounterZeile = Zelle.Row
CounterSpalte = Bereich.Columns.Count + Bereich.Column + 1
SuchenUndFinden = CounterZeile & "/" & CounterSpalte
' Die Zelle (CounterZeile,CounterSpalte) soll um 1 hochgezählt werden
Else
SuchenUndFinden = "nix gefunden"
End If
End Function
(in meinem konkreten Fall wäre diese Tabelle 8 Spalten breit und 1800 Zeilen hoch)
Freue mich auf Antworten.
Nebenfrage: Kann man mit diesem Editor auch eine Tabelle zeigen?
LG, Barbara

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Function soll Zellwert ändern
12.04.2017 22:12:28
onur
Mach doch mal eine beispieldatei.
Nebenfrage: Mit welchem Editor?
12.04.2017 22:21:24
Luc:-?
Der Sinn des Ganzen erschließt sich mir nicht, Barbara,
denn im Prinzip könnte die UDF ja auch beide Werte in nebeneinanderliegenden Zellen ausgeben und in der 3. wird dann gezählt bzw die UDF (oder eine Fml mit UDF) kumuliert auch gleich noch diese Zelle. Allerdings könnte die UDF ja auch jedesmal eine andere Zelle ermitteln, was dann…? Kommt mir doch sehr unausgereift vor!
Ansonsten könnte man so etwas schon ausnahmsweise machen, aber eben nur in Ausnahmefällen und nicht massenhaft, denn es hat einen Grund, dass ZellFmln Derartiges regulär untersagt ist (für die Einhaltung des Verbots sorgt Xl!)…
Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Nebenfrage: Mit welchem Editor?
12.04.2017 23:20:49
Barbaraa
Hallo Luc,
habe herausgefunden, und das ist auch da und dort zu lesen, dass eine Funktion keine Zellen verändern darf, wie zum Beispiel
Cells(9, 12).Value = 22
Da bricht das Makro ab, sogar eine Blockade von Excel habe ich schon deswegen erlebt, was nur mit dem Taskmanager beendet werden konnte.
Wie soll da die Funktion etwas in andere Zellen schreiben können? (dabei beziehe ich mich auf Dein "denn im Prinzip könnte die UDF ja auch beide Werte in nebeneinanderliegenden Zellen ausgeben")
"Allerdings könnte die UDF ja auch jedesmal eine andere Zelle ermitteln, was dann…?"
Ja, jeweils die Zellen rechts von einer Bereichszeile, in meinem Beispiel wären das die Zellen M8:M12. Da soll dann stehen, wie oft etwas in den jeweiligen Zeilen des Bereichs gefunden wurde. Unabhängig, in welcher Zelle die Funktion =SuchenUndFinden("abc") selbst steht (darf natürlich NICHT in diesen Zellen stehen).
Oder ein anderes Beispiel: In die Zelle A1 soll gezählt werden, wie oft die Funktion ausgeführt wurde.
Und zu meiner Nebenfrage: Mit Editor meine ich das Fenster, in das ich gerade diesen Text eintippe. Ein Code zB wird automatisch als Code dargestellt. Vielleicht kann man so ähnlich auch eine Tabelle anlegen.
LG, Barbara
Anzeige
Nebenfrage: Nicht VBA-Editor, HTML-Tools!
13.04.2017 04:39:33
Luc:-?
Morrn, Barbara;
du verwechselst da was! Funktionen können mehrere Ergebnisse auf einmal ausgeben. Dann müssen aber auch von vornherein (oder nachträglich) mehrere Zellen ausgewählt wdn. Wenn die Fml dann mit [strg][umsch][enter] abgeschlossen wird, „weiß“ Xl, dass mehrere Werte berechnet wdn müssen. Das nennt man dann Matrixformel!
Etwas anderes ist es, wenn eine Fml etwas an der Zellformatierung ändern soll oder ihr Ergebnis nicht in ihre StandortZelle, sondern ganz woanders hin ausgeben soll. Allerdings glaube ich, dass das in deinem Fall gar nicht erforderlich ist.
Wenn du ihm ein Bsp erstellst, hilft dir auch onur, den du bisher ignoriert hast, gern. Falls aber tatsächlich eine Fml mit Fernwirkung benötigt wird, hätte ich auch einen Link (nur nicht jetzt auf dem Laptop)…
Luc :-?
Anzeige
Zum Andere-Zellen-Ändern gibt es Sub
13.04.2017 08:39:50
lupo1
Eine Funktion beschreibt die Zelle, in welcher sie steht. Nicht andere. Die Zelle ist ihr Universum.
AW: Function soll Zellwert ändern
13.04.2017 00:10:22
onur
Ich hätte gern versucht zu helfen, aber offensichtlich bin ich nicht mal eine Antwort wert.
AW: Function soll Zellwert ändern
13.04.2017 21:06:17
Barbaraa
Hi onur,
hier meine Beispieldatei.
Die Funktion "=Land(Stadt)" soll das Land zurück geben, in welchem die Stadt liegt. Vorausgesetzt, die Stadt ist in Tabelle1 gelistet.
Außerdem soll ermittelt werden, wie oft nach jedem Land gesucht wurde. Das soll in der Spalte "###" stehen.
Der Aufruf von einem "Sub" aus funktioniert, aber als Funktion im Sheet geht das nicht, wie in B11 und C11 zu sehen. Und danach suche ich.
Hier die Datei:
https://www.herber.de/bbs/user/112866.xlsm
Danke für die Hilfe.
LG, Barbara
Anzeige
AW: Function soll Zellwert ändern
13.04.2017 22:52:00
onur
Hi Barbaraa,
Eine Funktion kann (und darf) zwar keine Zelle selektieren - geschweige denn verändern - , aber man kann Excel austricksen.
1) Man deklariert eine Variable public.
2) Man baut eine Timer-Sub, die bei Start der Datei mitgestartet wir und sich alle X sec. selbst neu aufruft und generiert damit sowas wie einen Interrupt-Timer.
3) Dieser Timer beobachtet die Public-Variable und verändert bei ihrer Änderung die gewünschte(n) Zelle(n) - Sozusagen ein selbst erstelltes Change-Event.
4) Man lässt durch die UDF die Public-Variable verändern.
Die Uhrzeit in A1 ist nur ein Gag zur Kontrolle des Timers, kannst du löschen.
https://www.herber.de/bbs/user/112869.xlsm
Gruß
Onur
Anzeige
AW: Function soll Zellwert ändern
14.04.2017 00:47:37
Barbaraa
Hallo onur,
oh, gute Idee. Funktioniert.
Was sagst Du zu dieser Lösung?
Die Zählerzelle als "Public Counter As Range" speichern und beim Change-Ereignis auswerten:
Sub worksheet_change(ByVal Target As Excel.Range)
Application.EnableEvents = False
If Not Counter Is Nothing Then Counter.Value = Counter.Value + 1
Set Counter = Nothing
Application.EnableEvents = True
End Sub
Und hier die Gesamtlösung
https://www.herber.de/bbs/user/112870.xlsm
Funktioniert auch, bis jetzt zumindest.
Anzeige
AW: Function soll Zellwert ändern
14.04.2017 01:03:03
onur
Hi Barbaraa,
Die Idee hatte ich auch schon, aber irgendwie wollte das Change-Event bei mir nicht durch die UDF ausgelöst werden (jedenfalls nicht zuverlässig genug), ausser wenn ich die formel mit "Enter" dazu zwang.
Gruß
Onur
Ich nehme mal an, ...
14.04.2017 02:27:18
Luc:-?
…Barbara,
dass du unbedingt eine UDF zu ungewöhnlichem Tun veranlassen willst. Meine 1.Versuche mit Derartigem liefen vor Jahren auch auf einen von der UDF gesetzten bzw ausgelösten Trigger hinaus (RECHERCHE-Stichwort physische Entkopplung). Aber inzwischen habe ich längst eine Möglichkeit zur direkten Veranlassung einer Fernwirkung einer Fml gefunden und weiterentwickelt (RECHERCHE-Stichwort selbstkorrigierende Eingabezelle).
ABER, ich halte das eigentlich alles, wie zuvor vermutet, schlicht für überflüssig! Immerhin bist du ja inzwischen auch, wie weiland ich, auf ein Ereignis verfallen. Warum dann noch der Aufwand mit der eigenen UDF? Mit einer meiner Standard-UDFs könnte das Land leicht mit einer singularen (1zellig-1wertigen) MatrixFml ermittelt wdn:
{=INDEX($B4:$B7;--VJoin(WENN(B10=Tabelle1[[Stadt1]:[Stadt3]];ZEILE(1:4);"");"";-1))}
(VJoin: letztpublizierte Version 1.4 in hochgeladenenen Dateien - kein Link, weil zZ am Laptop)
Aber wahrscheinlich läuft das Ganze doch nur auf einen KlickZähler hinaus. Dann wären auch diese beiden Zeilen überflüssig und es könnte ja auch in der defTab geklickt wdn!
Nichtsdestotrotz habe ich mal beide Varianten vorgesehen und noch dazu 2 Ereignisse verkoppelt. Was du nicht benötigst, könntest du ja entfernen bzw ändern (falls es dir nicht primär um deine Idee, sondern um das Ergebnis geht):
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Const adSuLaBer$ = "B4:B7", adSuStBer$ = "B10:D10", adTaStBer$ = "D4:F7"
Dim ZNr As Long, xZ As Range, zV As Range
If Not Intersect(Target, Me.Range(adSuStBer)) Is Nothing Then
For Each xZ In Target
ZNr = WorksheetFunction.Match(xZ.Offset(1, 0), Me.Range(adSuLaBer), 0)
Set zV = Me.Range(adSuLaBer).Cells(ZNr).Offset(0, 1)
zV = zV + 1
Next xZ
ElseIf Target.Cells.Count = 1 Then
If Not Intersect(Target, Me.Range(adTaStBer)) Is Nothing Then
If Not IsEmpty(Target) Then Set zV = Me.Cells(Target.Row, 3): zV = zV + 1
End If
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call Worksheet_Change(Target)
End Sub
Übrigens, onurs Variante bleibt mir beim Öffnen auf der OnTime-Anweisung hängen (zZ Win7.2, Xl14/2010)! Ansonsten fktioniert sie, ebenso wie deine, auch gut!
Gruß + FrOst @all, Luc :-?
Anzeige
AW: Ich nehme mal an, ...
17.04.2017 23:16:36
Barbaraa
Hallo luc,
danke für Deine Antwort.
Deine Beispiele sind interessant zu lesen und auch auszuprobieren.
Das VJoin kenne ich nicht, kann aber die Idee ungefähr erahnen. Nur, die Matrixformel bezieht sich nur auf B10.
Ja, es soll ein Zähler sein, und zwar, wie oft nach einem Land gesucht wurde. Dein folgendes Codebeispiel verstehe ich. Interessant finde ich die Variablen "adSuLaBer", "adSuStBer". Was bedeutet da das "Su"? Oder "xZ", "zV". Da steckt sicher eine durchdachte bewährte Systematik dahinter.
Dein "Worksheet_Change" funktioniert bei einer vorgegebenen regelmäßigen Anordnung der Funktionen und Funktionsargumente, was aber in meiner konkreten Sache nicht zutrifft. Das habe ich in hochgeladener Datei leider nicht verdeutlicht.
Außerdem soll die Möglichkeit bestehen, dass die bezogene Zellen, also die Städte, selbst ihren Inhalt von anderen Zellen beziehen, was in meiner Lösung berücksichtigt wird.
Dennoch danke für Deine Beispiele.
LG, Barbara
Anzeige
Nur soviel, das sind eben KEINE Variablen, ...
18.04.2017 02:55:37
Luc:-?
…Barbara,
sondern Konstanten, die im PgmVerlauf nicht geändert wdn können. Man kann sie aber inhaltlich leicht an konkrete Bedingungen anpas­sen und muss dazu nicht erst das ganze Pgm durchsuchen. Ihre Namen sind dagegen nur Kürzel → ad für Adresse, Su für Such(en), La für Land und St für Stadt. ZNr, xZ und zV sind aber tatsächlich Variablen → ZNr beinhaltet die ermittelte Zellen- bzw Zeilennr; xZ ist ein Objekt, das in einer objekt- (und variant-)orientierten For Each-Schleife quasi die Lauf­Variable ver­tritt (x.Zelle), mit dem Vorteil, dass ein konkretes Objekt, auf das sie gerade referenziert, direkt über sie geändert wdn kann (call by reference) und mit ihr auch alle Eigen­schaf­ten des Originals verwendet wdn können (hier zB .Offset); zV ist einfach nur ein Objekt, das auf die jeweils richtige ZählZelle referenziert (hätte ich auch zZ nennen können). Die „Systematik“ ist nur meine und die Namen könnten auch (und auch bei mir mal) anders lauten.
VJoin ist eine UDF (wie auch deine Fkt), für die lange eine vglbare Xl-Fkt fehlte, während VBA so etwas seit Xl9/2000 kennt. Inzwischen hat MS in den Versionen > Xl14/2010 2 ähnliche Fktt hinzugefügt (TEXTKETTE und TEXTVERKETTEN), die aber nicht allen Nutzern dieser Versionen z.V. stehen (und wohl auch nicht so flexibel sind).
Link VJoin: https://www.herber.de/bbs/user/99024.xlsm (BspDatei mit UDFs)
Im Übrigen bin ich aber immer noch der Meinung, dass ein einfacher Klick-Zähler reichen würde…
Gruß, Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige