Live-Forum - Die aktuellen Beiträge
Datum
Titel
18.04.2024 18:04:29
18.04.2024 16:33:24
Anzeige
Archiv - Navigation
1336to1340
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

Arbeitsbereich einer Funktion eingrenzen

Arbeitsbereich einer Funktion eingrenzen
09.11.2013 12:14:27
Albert
Hallo liebe VBA-Experten,
ist es möglich die untenstehende Funktion soweit zu beschränken, dass sie zB. nur mehr in Tabelle 1 den Bereich A2 bis B1000 abarbeitet? Meine Eingrenzungsversuche waren leider nicht von Erfolg gekrönt.
Public Function IsFormula(ByVal Ref As Range) As Boolean
If Ref.HasFormula = False Then
IsFormula = False
Else
IsFormula = True
End If
End Function

Ich bin dankbar für jede Information
Albert

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Arbeitsbereich einer Funktion eingrenzen
09.11.2013 12:36:19
Hajo_Zi
Hallo Albert,
es wird ja nur eine Zelle übergeben.
Option Explicit
Public Function IsFormula(ByVal Ref As Range) As String
'A2 bis B1000
If Ref.Column  1 And Ref.Row 

AW: Arbeitsbereich einer Funktion eingrenzen
09.11.2013 13:39:45
Albert
Hallo Hajo,
herzlichen Dank für Deine Hilfe, die Verarbeitung ist mit Deinem Code bereits merkbar schneller geworden.
Beim Testen habe ich jedoch jetzt entdeckt dass diese Funktion bei jeder Zelländerung aufgerufen wird. Ich möchte jedoch nur verhindern, dass Benutzer in den Zellen B12, B20, B28 ..... Werte eingeben. Sie sollen dort eine vorhandene Formel mit Zellbezug anpassen jedoch keine Werte eingeben.
Kann man nun diese Funktion soweit einschränken dass sie nur auf Änderungen in der Spalte B von Tabelle1 oder noch besser nur auf Änderungen in den genauen Zelladressen (B12, B20, B28 ..... B204) reagiert?
Ich hoffe, ich bin nicht lästig und bedanke mich nochmals für die rasche und kompetente Hilfe.
Albert

Anzeige
AW: Arbeitsbereich einer Funktion eingrenzen
09.11.2013 14:31:11
Hajo_Zi
Hallo Albert,
dass geht noch meinen Informationen nicht. An der Geschwindigkeit habe ich nichts verändert.
Gruß Hajo

Was ist das nur für ein Quatsch, ...
09.11.2013 15:01:49
Luc:-?
…Albert,
was du da verlangst. Das schlägt (universalem) Sinn und Zweck einer Fkt voll ins Gesicht. Offensichtlich hast du keine Ahnung davon, und wer dich bei deinem Ansinnen unterstützt, ebenfalls nicht! :-X
Es kommt doch 1. darauf an, wo du sie einsetzen willst → in einer ZellFml des TabBlatts oder aus einer Subprozedur heraus, und 2. wie du sie argumentierst! Ist das so schwer zu begreifen, dass einer/dieser Fkt ihr Einsatzbereich schon als Argument übergeben wird?! Das kann man übrigens auch mit Subprozeduren machen.
Ich weiß ja nicht, was da schneller geworden sein soll, aber ein Aufruf dieser Fkt mit einem falschen Bezugsargument (Ref=Bezug) ist doch wohl ohnehin absolut hirnrissig! Und wenn du mehrere voneinander getrennte Bereiche prüfen willst, musst du sie eben mehrmals aufrufen bzw mehrmals notieren, abgesehen mal davon, dass sie ohnehin nicht matrixfmltauglich ist und somit nur auf einzelne Zellen und keine Zellbereiche angewendet wdn kann. Außerdem ist sie unnötig verschwurbelt.
So würde es reichen:
Public Function IsFormula(ByVal Zelle As Range) As Boolean
IsFormula = Zelle.HasFormula
End Function
Oder für ganze Bereiche:
Public Function IsFormula(Optional ByVal Bereich As Range)
Dim xErg() As Boolean, nS As Long, nZ As Long, xS As Long, xZ As Long, xB As Range
If Bereich Is Nothing Then
If IsError(Application.Caller) Then
Set Bereich = ActiveWindow.RangeSelection
Else: IsFormula = True: Exit Function
End If
End If
With Bereich
nZ = .Rows.Count: nS = .Columns.Count
End With
ReDim xErg(nZ - 1, nS - 1)
For Each xB In Bereich
xErg(xZ, xS) = xB.HasFormula
xS = (xS + 1) Mod nS: xZ = xZ - CInt(xS = 0)
Next xB
IsFormula = xErg: Set Bereich = Nothing
End Function
Bei dieser Variante kann bei Einsatz in einer Subprozedur das Argument auch fehlen, es wird dann der selektierte Bereich des aktuellen Blattes verwendet.
Gruß Luc :-?

Anzeige
Hallo Luc
09.11.2013 15:59:14
Albert
Hallo Luc,
vielen Dank fuer die ausfuehrliche Antwort. In Deiner Argumentation hast Du leider recht, dass ich nicht viel Ahnung habe, ich bin aber dabei zu lernen und hoffe in Zukunft mich mit "gescheiteren Fragen" melden zu können.
Zur Erklärung meines Problems: der Nutzer der Tabelle soll in den Zellen B12, B20, ...... kein Datum eingeben, sondern die darin befindliche Formel anpassen (=Zellbezug zu einem Startdatum). Wenn er trotz aller Hinweise die Formel mit einem fixen Datumswert überschreibt erscheint in einer Nachbarzelle eine Meldung, dass diese Eingabe unzulässig ist. Die Meldung steuere ich über eine Zelle (hier A20) mit der Formel =IsFormula(B20) - wenn keine Formel vorhanden - FALSCH und wenn Wert FALSCH - erscheint die Meldung "Keinen Wert eingeben sondern Formel anpassen!"
Ich habe nun beim Debuggen entdeckt, dass diese Funktion bei jeder Zellveränderung in der Tabelle aufgerufen wird und viele Arbeitsschritte nötig sind, bis sie fertig abgearbeitet ist. Ich dachte mir eben, dass man die Prozessorleistung für die Dinge verwenden soll die man braucht und nicht für unnötige Schleifen zu nutzen. Mein Gedanke war nun, dass der Funktionsaufruf nur erfolgt wenn in der jeweiligen Zelle in der Spalte B eine Eingabe erfolgt und sonst unterbleibt um Rechnerkapazität zu schonen. Ist dieser Gedankengang wirklich so abwegig?
Ich bin fuer jede konstruktive Kritik dankbar.
Albert
PS: Danke fuer den ausfuehrlichen Code, ich werde ueber den gelungenen Einsatz berichten.

Anzeige
Nee, abwegig nicht, nur der falsche Weg, ...
09.11.2013 16:31:48
Luc:-?
…Albert,
denn die Fkt liefert doch nur WAHR oder FALSCH. Und wenn du sie in einer ZellFml einsetzt, musst du halt damit leben, was Xl daraus macht. Ob nun die Berechnung in der Fkt unterdrückt wird oder nicht, ist dabei völlig nebensächlich, ausgelöst wird sie trotzdem, da sie ja nun mal in einer ZellFml steht. Auf die xlCalcEngine hast du ohnehin keinen Zugriff. Wenn du hier mit DatenGültigkeit oder einer ggf eine MsgBox bzw UF zeigenden EreignisRoutine arbeiten würdest (dann brauchst du die Fkt gar nicht!), könntest du das eher steuern.
Gruß Luc :-?

Danke Luc
10.11.2013 19:14:44
Albert
Hallo Luc,
danke nochmals fuer Deine Analyse. Ich werde versuchen Deine Anregungen umzusetzen. Ich hoffe ich muss mich mit keinen weiteren Fragen zu diesem Thema melden.
Aeusserst spannend fand ich Deinen Beitrag zum 1. November. Ich habe ein wenig versucht herauszufinden wie Du das gemacht haben koenntest, bin jedoch gescheitert. Mit meinem derzeitigen Wissensstand ist mir schleierhaft, wie man das angeht. Wirst Du das Geheimnis einmal lueften?
Schoenen Abend und danke fuer die Tipps
Albert

Anzeige
Zu Halloween: Hatten wir das da nicht ...
11.11.2013 02:37:35
Luc:-?
…erklärt, Albert? ;-)
Was willst du denn konkret wissen?
Gruß Luc :-?

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige