Anpassad funktion kanske inte beräknar förväntat värde i Excel
Artikel
Gäller för:
Microsoft Excel
Symptom
När du beräknar kalkylbladet kan vissa celler ha beräknat fel värde.
Orsak
Problemet uppstår under följande förutsättningar:
En cell i kalkylbladet innehåller en anpassad funktion.
Den anpassade funktionen innehåller ett eller flera argument som refererar till ett cellområde i kalkylbladet.
Resultatet av den anpassade funktionen beror på fler celler än det direkt refererar till.
Det här beteendet är avsiktligt för Microsoft Excel. När Excel beräknar cellen som innehåller den anpassade funktionen beräknas om alla cellområden som skickas som argument till din anpassade funktion. Om resultatet av din funktion beror på celler som inte uttryckligen refereras till av funktionen, kan dessa celler inte räknas om.
Lösning
Använd någon av följande metoder för att undvika det här problemet.
Metod 1: Ändra funktionen så att alla relevanta cellområden skickas
Ändra funktionen så att den accepterar som argument alla celler som behövs för att beräkna resultatet av funktionen.
Metod 2: Gör din anpassade funktion instabil
Microsoft tillhandahåller programmeringsexempel enbart i förklarande syfte och gör inga utfästelser, varken uttryckligen eller underförstått. Detta omfattar men begränsas inte till underförstådd garanti för säljbarhet eller lämplighet för ett visst syfte. I denna artikel förutsätts att du känner till det programmeringsspråk som demonstreras och de verktyg som används för att skapa och felsöka procedurer. Microsofts supporttekniker kan hjälpa till att förklara funktionerna i en viss procedur, men de ändrar inte dessa exempel för att tillhandahålla ytterligare funktioner eller konstruktionsprocedurer för att uppfylla dina specifika krav. Om du gör din anpassade funktion instabil uppstår inte det här problemet. Om du vill göra din anpassade funktion instabil lägger du till följande kodrad i funktionen.
VB
Application.Volatile
Anteckning
Om du gör din anpassade funktion instabil beräknas den om varje gång du gör en ändring i ett värde eller beräknar om en öppen arbetsbok. Detta kan påverka kalkylbladsmodellens prestanda.
Metod 3: Tvinga Excel att beräkna om alla öppna arbetsböcker
Tryck på CTRL+ALT+F9 för att beräkna om värdena i alla öppna arbetsböcker. I Microsoft Office Excel 2007 trycker du på CTRL+ALT+SKIFT+F9 för att beräkna om värdena i alla öppna arbetsböcker.
Mer information
Exempel på problemet
Följ dessa steg för att illustrera det här problemet:
Stäng och spara alla öppna arbetsböcker och öppna sedan en ny arbetsbok.
Starta Visual Basic-Editor (tryck på ALT+F11).
Klicka på Modul på Infoga-menyn.
Skriv följande exempelkod i modulbladet:
VB
' This function counts the number of blank cells by starting from the cell ' referred to by the rngStartCell argument and moving up the column.Function FindTextUp(rngStartCell As Range) AsSingleDim iIndex AsIntegerFor iIndex = 0To100If rngStartCell.Value <> ""Then
FindTextUp = iIndex
ExitFunctionElseSet rngStartCell = rngStartCell.Offset(-1, 0)
EndIfNext iIndex
EndFunction
Tryck på ALT+F11 för att återgå till Excel.
Skriv Test i cell A2 och tryck sedan på RETUR.
Skriv följande formel i cell A10 och tryck sedan på RETUR:
excel
=FindTextUp(A9)
Formeln returnerar värdet 7.
Skriv Ett annat test i cell A5 och tryck sedan på RETUR.
Formeln returnerar fortfarande värdet 7 när värdet 4 förväntas. I det här exemplet refererar funktionen FindTextUp uttryckligen till cell A9. Funktionen kan dock vara beroende av cellerna A1:A8, beroende på de data som anges i kalkylbladet.
Om du implementerar metod 1 i avsnittet "Lösning" i den här artikeln beräknar funktionen det förväntade resultatet. Följande kodrad visar hur du ändrar funktionen i det här exemplet så att det förväntade resultatet beräknas.
VB
Function FindTextUp(rngStartCell As Range, rngOtherCells As Range) AsSingle
Om du nu ersätter funktionsanropet i steg 7 med följande funktionsanrop returnerar funktionen alltid det förväntade resultatet.