Live-Forum - Die aktuellen Beiträge
Datum
Titel
19.04.2024 12:23:24
19.04.2024 11:45:34
Anzeige
Archiv - Navigation
1504to1508
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

Funkion in VBA aktualisiert sich nicht automatisch

Funkion in VBA aktualisiert sich nicht automatisch
01.08.2016 13:22:40
Juliane
Hallo,
ich erhalte aus einem automatischen System-Report als Information eine Zellfärbung.
Nun ermittle ich per Formel den excel-Farbcode, um basierend auf diesem eine Wenn-Formel zu verwenden. Details dazu findet ihr unten.
Was ist das Problem?
Das ganze funktioniert super. Außer dann, wenn ich an einem anderen Marko des gleichen Tabellenblatts arbeite. Immer wenn ich das mache, gibt mir die Formel zum Funktionsaufruf plötzlich #Wert aus und nicht mehr den Excel-Farbcode. Das ganze lässt sich beheben, wenn ich eine der Zellen auswähle und enter klicke. Diesen Schritt möchte ich aber gern vermeiden. Denn es hat sich weder an den Farben, noch an dem Code, der Formel oder wie auch immer, etwas verändert.
Formel in Excel zum Funktionsaufruf:
in G2 steht "=BGCol(F2)"
In F2 habe ich die Zellfarbe angelegt, die im Systemreport auftauchen kann
Als Ergebnis in G2 steht dann z. B. "-5" (Excel-Fabrcode für ein bestimmtes Rot)
die "-5" verwende ich dann an anderer Stelle in einer Wenn-Formel weiter.
VBA-Code der Funktion:
Function BGCol(myRef As Range)
BGCol = myRef.Interior.ColorIndex
End Function
Problem
Immer wenn ich in VBA arbeite (es gobt für das Tabellenblatt weitere Makros) dann steht anschließend statt "-5" dann "#Wert" in Zelle G2. Ich behebe das durch Auswahl der Zelle und "Enter". Dann steht wieder "-5" drin.
Ich hoffe das ist verständlich. Und ich hoffe, jemand kann mir erklären woran das liegt bzw. mir einen Rat geben, was ich verbessern kann.
Besten Dank
LG

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Funkion in VBA aktualisiert sich nicht automatisch
01.08.2016 13:46:18
Werner
Hallo Juliane,
da würde ich mal vermuten, dass es an deinem "anderen" Makro liegt, das du aber nicht zeigst.
Gruß Werner
AW: Funkion in VBA aktualisiert sich nicht automatisch
01.08.2016 14:07:42
Juliane
Hallo,
ich habe 2 andere Makros auf dem Blatt, die sind tlw. nur leider recht umfangreich (und leider klappt das mit dem Kopieren hierher nicht so gut):
Makro 1
Sub Erstausfüllung()
With Sheets("Reiter 2 Liste MP-O gefiltert")
.Range(Replace("A6:B#,D6:E#", "#", .Range("B" & .Rows.Count).End(xlUp).Row)).Copy
Sheets("MP_Punkte").Range("B12").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
.Range(Replace("J6:J#", "#", .Range("B" & .Rows.Count).End(xlUp).Row)).Copy
Sheets("MP_Punkte").Range("F12").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Sheets("MP_Punkte").Range("F12").PasteSpecial Paste:=xlPasteFormats
End With
Application.CutCopyMode = False
End Sub
Makro 2:
Public Sub main()
Dim dataRangeOriginal As Range
Dim dataRangeDestination As Range
Dim identifier1 As String
Dim identifier2 As String
Dim c1 As Range
Dim c2 As Range
Dim lastLine As Integer
Dim datasetFound As Boolean
'Intiiere die Variablen
Set dataRangeOriginal = ThisWorkbook.Worksheets(mdl_001_Constants.Original_Worksheet).Range( _
mdl_001_Constants.Relevant_Column_Vorhaben & mdl_001_Constants.First_Line_Original_Worksheet & ":" & mdl_001_Constants.Relevant_Column_Vorhaben & getLastLine(mdl_001_Constants.Original_Worksheet, mdl_001_Constants.Relevant_Column_Titel))
Set dataRangeDestination = ThisWorkbook.Worksheets(mdl_001_Constants.Destination_Worksheet). _
Range(mdl_001_Constants.Relevant_Column_Titel & mdl_001_Constants.First_Line_Destination_Worksheet & ":" & mdl_001_Constants.Relevant_Column_Titel & getLastLine(mdl_001_Constants.Destination_Worksheet, mdl_001_Constants.Relevant_Column_Titel))
Application.ScreenUpdating = False
For Each c1 In dataRangeOriginal.Cells
datasetFound = False
identifier1 = c1.Value & ThisWorkbook.Worksheets(mdl_001_Constants.Original_Worksheet). _
Cells(c1.Row, Col_Num("D")).Value
For Each c2 In dataRangeDestination.Cells
identifier2 = c2.Value & ThisWorkbook.Worksheets(mdl_001_Constants. _
Destination_Worksheet).Cells(c2.Row, Col_Num("D")).Value
If (True = compareDatasets(identifier1, identifier2)) Then
Call copyDataWF(mdl_001_Constants.Original_Worksheet, mdl_001_Constants. _
Destination_Worksheet, mdl_001_Constants.Relevant_Column_Status, c1.Row, mdl_001_Constants.Relevant_Column_StatusDest, c2.Row)
datasetFound = True
Exit For
End If
Next c2
If (Not datasetFound) Then
lastLine = getLastLine(mdl_001_Constants.Destination_Worksheet, mdl_001_Constants. _
Relevant_Column_VorhabenDest) + 1
Call copyData(mdl_001_Constants.Original_Worksheet, mdl_001_Constants. _
Destination_Worksheet, mdl_001_Constants.Relevant_Column_Vorhaben, c1.Row, mdl_001_Constants.Relevant_Column_VorhabenDest, lastLine)
Call copyData(mdl_001_Constants.Original_Worksheet, mdl_001_Constants. _
Destination_Worksheet, mdl_001_Constants.Relevant_Column_Titel, c1.Row, mdl_001_Constants.Relevant_Column_TitelDest, lastLine)
Call copyData(mdl_001_Constants.Original_Worksheet, mdl_001_Constants. _
Destination_Worksheet, mdl_001_Constants.Relevant_Column_Fahrzeugprojekt, c1.Row, mdl_001_Constants.Relevant_Column_Fahrzeugprojekt, lastLine)
Call copyData(mdl_001_Constants.Original_Worksheet, mdl_001_Constants. _
Destination_Worksheet, mdl_001_Constants.Relevant_Column_FG, c1.Row, mdl_001_Constants.Relevant_Column_FG, lastLine)
Call copyDataWF(mdl_001_Constants.Original_Worksheet, mdl_001_Constants. _
Destination_Worksheet, mdl_001_Constants.Relevant_Column_Status, c1.Row, mdl_001_Constants.Relevant_Column_StatusDest, lastLine)
End If
Next c1
Application.ScreenUpdating = True
End Sub
'Kopiere die Daten (ohne Formate)
Private Sub copyData(originalWorksheetName As String, destWorksheetName As String, srcColumn As  _
String, srcLine As Integer, destColumn As String, destLine As Integer)
ThisWorkbook.Worksheets(originalWorksheetName).Range(srcColumn & srcLine).Copy
With ThisWorkbook.Worksheets(destWorksheetName)
.Range(destColumn & destLine).PasteSpecial Paste:=xlPasteValues
End With
End Sub
'Kopiere die Daten (mit Formate)
Private Sub copyDataWF(originalWorksheetName As String, destWorksheetName As String, srcColumn  _
As String, srcLine As Integer, destColumn As String, destLine As Integer)
ThisWorkbook.Worksheets(originalWorksheetName).Range(srcColumn & srcLine).Copy
With ThisWorkbook.Worksheets(destWorksheetName)
.Range(destColumn & destLine).PasteSpecial Paste:=xlPasteValues
.Range(destColumn & destLine).PasteSpecial Paste:=xlPasteFormats
End With
End Sub
'Vergleiche die Datensätze nach Wert
Private Function compareDatasets(identifier1 As String, identifier2 As String) As Boolean
If (0 = StrComp(identifier1, identifier2, vbTextCompare)) Then
compareDatasets = True
Else
compareDatasets = False
End If
End Function
'Ermittle die letzte ungefüllte Spalte des Reiters
Private Function getLastColumn(worksheetName As String, numberOfLine As Integer) As String
With ThisWorkbook.Worksheets(worksheetName)
getLastColumn = Col_Letter(.Cells(numberOfLine, .Columns.Count).End(xlToLeft).Column +  _
1)
End With
End Function
'Ermittle die erste Zeile des Reiters
Private Function getFirstLine(worksheetName As String, columnName As String) As String
With ThisWorkbook.Worksheets(worksheetName)
getFirstLine = .Cells(1, columnName).End(xlDown).Row
End With
End Function
'Ermittle die letzte Zeile des Reiters
Private Function getLastLine(worksheetName As String, columnName As String) As String
With ThisWorkbook.Worksheets(worksheetName)
getLastLine = .Cells(.Rows.Count, columnName).End(xlUp).Row
End With
End Function
Function Col_Num(ByVal sColLetter As String) As Long
Col_Num = ActiveWorkbook.Worksheets(1).Columns(sColLetter).Column
End Function
Anzeige
AW: Funkion in VBA aktualisiert sich nicht automatisch
01.08.2016 14:23:10
Juliane
Nachtrag:
wie gesagt, das Problem tritt nicht auf, wenn ich die Makros laufen lassen (werden über Buttons gestartet), sondern nur wenn ich Änderungen im Code vornehme.
AW: Funkion in VBA aktualisiert sich nicht automatisch
01.08.2016 14:46:40
Daniel
Hi
das ist normal.
Wenn du beispielsweise im Einzelstep testest und Codes veränderst, müssen die Codes der Formeln auch nochmal durchlaufen.
wenn du das abbrichst, können die Formelergebnisse nicht angezeigt werden.
Gruß Daniel
AW: Funkion in VBA aktualisiert sich nicht automatisch
02.08.2016 07:57:03
Juliane
Guten Morgen,
das habe ich noch nicht ganz verstanden. Das heißt, wenn ich irgendwo im Code etwas verändere (in meinem Fall ist es egal auf welches Tabellenblatt sich dieser Code bezieht), dann muss die Funktion einmalig aufgerufen werden?
Und gibt es eine Möglichkeit dies zu automatisieren? Also z. b., dass immer wenn ich den Reiter öffne, die Formel, die die Funktion enthält, sich neuberechnet? Bei normalen Excle-formeln sit es doch auch so, dass sie immer autoamtisch berechnet werden.
VG
Anzeige
Eine eigene Funkion (UDF) in einer ZellFml ...
02.08.2016 17:24:49
Luc:-?
…wird auch automatisch neu berechnet (bei entsprd DateiEinstellung), Juliane,
wenn sie Argumente, die ihr im Kopf mitgegeben wdn, benötigt und diese sich ändern. Das gilt aber nicht für Formatierungen, wenn diese wie üblich geändert wdn (eine Änderung wird nur bei Format-Aufkopieren erkannt). Solche UDFs und die ohne Argumente sollten volatil sein, d.h., in der 1.KommandoZeile Application.Volatile zu stehen haben. Dann reagieren sie immer, wenn sich irgendwo im Blatt etwas ändert oder [F9] gedrückt bzw in eine Zelle geklickt wird.
Das alles gilt nicht für Function-, die von Sub-Prozeduren, die manuell gestartet wurden, aufgerufen wdn.
Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Eine eigene Funkion (UDF) in einer ZellFml ...
03.08.2016 07:56:58
Juliane
Hallo Luc,
ja genau, so ist die Funktion angelegt:
Function BGCol(myRef As Range)
Application.Volatile
BGCol = myRef.Interior.ColorIndex
End Function
Wenn ich jetzt auf einem anderen Reiter ein Makro per Button starte, dann tritt z. b. der von mir beschreibene Fehler mit #Wert auf. Wenn ich dann auf dem aktuellen Reiter (wo auch die funktion als Formel aufgerufen wird) ein Makro per Button starte, dann erfolgt anscheinend eine Neuberechnung der Formel und der Fehler hebt sich wieder auf.
Ich versuche mal eine Testdatei für das forum zum Reproduzieren des Fehlers zusammenzustellen.
Anzeige
AW: Eine eigene Funkion (UDF) in einer ZellFml ...
03.08.2016 11:53:18
Juliane
Hallo alle zusammen,
anbei eine Datei mit dem Problem.
Es geht um Reiter "MP_Punkte" Zellen G2 bis G5 (und dadurch z. auch I12). Wenn ich ein Makro auf den anderen Reitern durchführe, dann erscheint hier der Fehler #Wert. Dieser hebt sich dann wieder auf, wenn ich im Reiter "MP_Punkte" z. B. das Makro "Ersteingabe" ausführe.
Das Problem besteht komischer Weise nicht, wenn ich im Reiter "Fzg_Kritische Punkte" das dortige Makro laufen lasse. Von daher habe ich das Gefühl, dass es nicht ein Probem der Funktion ist, sondern der Makros, die ich verwende.
Ich hoffe jemand kann helfen. Ich kann mir das eifnach nicht erklären.
Vielen Dank und besten Gruß
Anzeige
AW: Eine eigene Funkion (UDF) in einer ZellFml ...
03.08.2016 11:55:40
Juliane
Ok, ich sehe gerade der Upload geht doch nicht. Kann ich wirklich nur 300 MB?
AW: Eine eigene Funkion (UDF) in einer ZellFml ...
03.08.2016 13:46:22
Daniel
wenns da steht, dann kannst du nur 300kb.
so was schreibt H. Herber ja nicht aus Spaß dahin.
die Datei benötigt an Ihnalt ja im Prinzip neben dem Code nur die eine Formel und ein paar Daten, so dass die Funktion "funktionieren" kann.
alles andere kann eigentlich gelöscht werden.
Damit solltest die 300kb locker ausreichen, um das Problem aufzuzeigen.
Gruß Daniel
Wie wär's mit ZIPpen...? owT
03.08.2016 16:13:12
Luc:-?
:-?
AW: Wie wär's mit ZIPpen...? owT
04.08.2016 07:59:03
Juliane
Guten Morgen,
vielen Dank für den Tipp.
https://www.herber.de/bbs/user/107398.zip
So, dann hoffe ich mal, dass mir jemand dieses "Mysterium" mit dem Fehler erklären kann.
Danke schonmal
VG
Anzeige
Das ist kein 'Mysterium' und ich hatte dir das ...
06.08.2016 06:06:57
Luc:-?
…bereits erklärt, Juliane;
das normale Einfärben der fml-relevanten Zellen der Spalte F des Blattes MP_Punkte löst kein Ereignis aus und lässt so auch eine volatile Fkt nicht wirksam wdn. Du müsstest dann immer noch wenigstens Taste [F9] betätigen oder in eine beliebige (auch leere) Zelle klicken. Eine ereignis­auslösende Änderung tritt dagegen dann auf, wenn das Format der passenden Status-Legende-Zelle mit dem FormatPinsel auf eine relevante Zelle in Spalte F übertragen wird. Dann reagiert die darauf bezogene ZellFml in Spalte I mit deiner UDF sofort. Du müsstest also zumindest den KommentarText in G2 entsprechend ändern!
Trotzdem halte ich es für angeraten, dir noch einige Hinweise zu geben:
1. Es ist idR günstiger, den VBEditor auf Variablendeklaration erforderlich einzustellen. So wird Option Explicit am Anfang jedes neuen Moduls automatisch eingefügt. Dann muss jede Variable (und Konstante) deklariert wdn, was Fehler vermeiden hilft.
2. Deine Fml in I12 ist unnötig „WENNig“. Die kann auch vereinfacht wdn und sähe dann (unter Berücksichtigung des 3.Hinweises so aus:
=WAHL(4-(C12="")-2*ODER(F12=""&{""."-".0.1.2.3});F12;F12;"";WENNFEHLER(VERGLEICH(BGCol(F12;F$2); BGCol(F$2:F$5);0)-1;"Signierfarbe ungültig!"))
Hierbei bin ich von größtmöglicher Variabilität bzgl F12 ausgegangen, da aus dem Blatt nicht ersichtlich ist, ob dort nun irgendeine oder die passende Zahl oder ein Text eingetragen wdn soll (Format ist Text!). Jetzt kann hier alles eingetragen wdn, die Zelle kann auch leer bleiben (dann zeigt I12 eine 0!), ein MinusZeichen oder die 4 Status-Ziffern enthalten (das zusätzliche Argument deiner UDF wird unten erklärt). Außerdem kann auch die entsprechende Status-Legenden-Zelle direkt oder nur ihr Format aufkopiert wdn. Diese Zellen sollten dann ebenfalls Rahmen, TextFormat und die gleiche SchriftArt und -Größe haben!
3. Mit einer (fast) universellen Neufassung deiner UDF wird es möglich, auf die Ermittlung der FarbIndizes in G2:G5 zu verzichten (der neue Kommentar muss dann auf F2), die ja ohnehin für den normalen Nutzer keinen relevanten AussageWert haben dürften. Außerdem sollte man ab Xl12/2007 besser die FarbCodes, nicht die redundanten Indizes, verwenden! Das macht sich hier auch dadurch seltsam bemerkbar, dass einige Indizes zwischen ihren regulären und negativen Werten hinundher springen.
Deine UDF wurde von mir dahingehend überarbeitet; du musst sie aber nicht verwenden und auch den FmlVorschlag unter 2. nicht übernehmen. Allerdings hättest du mit meinen Vorschlägen noch etliche Möglich­keiten mehr, die von deinen realen Gegeben­heiten abhängen.
So kann die UDF jetzt bspw in Argument1 auch zusammen­hängende ZellBereiche (idR nur Vektoren - 1zeilig|1spaltig!) verarbei­ten, was für MatrixFmln und auch VERGLEICH wichtig ist. Deshalb kann so auch auf G2:G5 verzichtet wdn! Fehlt Arg1, wird hier die StandortZelle (oder bei MatrixFmln deren ganzer Bereich) eingesetzt. In Arg2 kann eine Zelle angegeben wdn, die eine Farbe hat, die ggf verwendet wdn soll, wenn die Zelle(n) lt Arg1 (auch bei Ersatz durch StandortZellen!) farblos bzw weiß sind. Mit Arg3=1 bzw -1 kann die durch eine Bedingt­Format­Regel erzeugte ZellFarbe ab deiner Xl-Version ermittelt wdn:
Rem Mxfmlfähige Fkt z.Bestimmung v.Zellfarben - ab Xl14 auch aus BedFmt
'   (im Projekt in ZFmln v.Blatt MP_Punkte eingesetzt (ZFarben d.Stati)
'   Arg1: fehlt ->StandortZelle(n), sonst Zelle or ZellBereich angeben!
'   Arg2: Farbe angegebner Zelle statt farbl/weißer Arg1-Farbe vwenden!
'   Arg3: fehlt/0 DirektFarbe, ±1 Farbe aus BedFormatRgl (±2 ->Fehler)!
'   Vs1.1 -Neufassung:20160806/Luc:-? -Publikation:20160806/HerberForum
Function BGCol(Optional myRef As Range, Optional myDef As Range, _
Optional ByVal isCondCol As VbTriState)
Const hexDefCol$ = "&hFFFFFF"
Dim DefCol As Long, zix As Long, txFml As String, thisRange As Range
Application.Volatile
If CBool(isCondCol Mod 2) Then
txFml = Replace(Application.ThisCell.Formula, _
"," & CStr(isCondCol) & ")", ",2)", 1, 1)
BGCol = ActiveSheet.Evaluate(txFml)
Exit Function
End If
isCondCol = -Abs(isCondCol)
If myDef Is Nothing Then
DefCol = CLng(hexDefCol)
Else: DefCol = myDef.Interior.Color
End If
If myRef Is Nothing Then
With Application
If .ThisCell.HasArray Then
Set myRef = .Caller: GoTo ma
Else: Set myRef = .ThisCell: GoTo mc
End If
End With
ElseIf IsArray(myRef) Then
ma:     Set thisRange = myRef
ReDim bgCols(thisRange.Count) As Long
For Each myRef In thisRange
GoSub mc: bgCols(zix) = BGCol: zix = zix + 1
Next myRef
If thisRange.Rows.Count > 1 Then
BGCol = WorksheetFunction.Transpose(bgCols)
Else: BGCol = bgCols
End If
Set thisRange = Nothing
Else
mc:     If CBool(isCondCol) Then
If myRef.DisplayFormat.Interior.Color 
Feedback nicht unerwünscht!
Gruß+schöWE, Luc :-?
Besser informiert mit …
Anzeige
Ergänzung: Wenn die erweiterte UDF ...
06.08.2016 19:24:42
Luc:-?
…auch in einer SubProzedur Anwendung finden soll, wären ff Ergänzungen sinnvoll, weil dann immer ein Arg1 angegeben wdn muss:
Application.Volatile: On Error Resume Next
Nach With Application Folgendes einfügen:
If IsError(.ThisCell) Then BgCol = CVErr(xlErrRef): Exit Function
In diesem Fall sollte b.Bed in Arg3 statt ±1 ±2 verwendet wdn, um die Evaluierung zu vermeiden. In einer ZellFml ist diese aber erforderlich, um die Sperrung durch die Xl-Steuerung zu umgehen (→ #WERT!).
Und selbstverständlich ist zur Neuberechnung hier ebenfalls [F9], Klick in Zelle bzw FormatÜbertragung erforderlich, Juliane!
Luc :-?
Anzeige
AW: Das ist kein 'Mysterium' und ich hatte dir das ...
08.08.2016 09:03:51
Juliane
Guten Morgen Luc,
vielen Dank für deine ausführliche Lösung und Erläuterung. Deinen Ausführungen konnte ich halbwegs folgen, der Code übersteigt schonum einiges mein Wissen (und Interpretationskraft) ;) Wahrscheinich habe ich mir, was meinen Kenntnisstand angeht, da etwas zu viel vorgenommen.
Ich werde nachher mal deinen Lösungsvorschlag Schritt für Schritt durchgehen und schaune, ob ich das so übernehmen kann.
Auf jeden Fall leiben Dank für deine Unterstützung. Irgendwie kriege ich das hin.
Viele Grüße
Bitte sehr & viel Erfolg! owT
08.08.2016 13:36:52
Luc:-?
:-?
AW: Funkion in VBA aktualisiert sich nicht automatisch
01.08.2016 14:25:18
Daniel
Hi
bei so komplexen Zusammenhängen wäre es sinnvoller, wenn du die Datei mit den Makros hochlädst (Sensible Daten kannst du ja löschen oder anonymisieren, die Datei sollte aber im Aufbau der Originaldatei entsprechen und der Fehler muss nachvollziebar sein)
das macht uns die Arbeit leichter, weil sich ein Fehler durch ausprobieren einfacher finden lässt als die rein theoretische Analyse eines Codes und wir müssen nicht erst die Datei zusammenbauen, die du schon vorliegen hast.
gruß Daniel
Anzeige

327 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige