excel-vba
Användardefinierade funktioner (UDF)
Sök…
Syntax
Funktionsfunktion Namn (argumentVariable As dataType, argumentVariable2 Som dataType, Valfritt argumentVariable3 Som dataType) Som functionReturnDataType
Grunddeklaration av en funktion. Varje funktion behöver ett namn, men det behöver inte ta några argument. Det kan ta 0 argument, eller det kan ta ett visst antal argument. Du kan också förklara ett argument som valfritt (vilket betyder att det inte spelar någon roll om du tillhandahåller det när du ringer funktionen). Det är bästa praxis att tillhandahålla den variabla typen för varje argument och på samma sätt att returnera vilken datatyp som funktionen själv kommer att returnera.functionName = theVariableOrValueBeingReturned
Om du kommer från andra programmeringsspråk, kan du bli van vidReturn
sökord. Detta används inte i VBA - istället använder vi funktionsnamnet. Du kan ställa in den på innehållet i en variabel eller till något direkt levererat värde. Observera att om du ställde in en datatyp för funktionens återgång, måste variabeln eller data du levererar den här tiden vara av den datatypen.Avsluta funktion
Obligatorisk. Anger slutet påFunction
och måste således vara i slutet. VBE levererar vanligtvis detta automatiskt när du skapar en ny funktion.
Anmärkningar
En användardefinierad funktion (aka UDF) hänvisar till en uppgiftsspecifik funktion som har skapats av användaren. Det kan kallas som en kalkylfunktion (ex: =SUM(...)
) eller användas för att returnera ett värde till en löpande process i en sub-procedur. En UDF returnerar ett värde, vanligtvis från information som skickas in i den som en eller flera parametrar.
Det kan skapas av:
- använder VBA.
- med hjälp av Excel C API - Genom att skapa en XLL som exporterar kompilerade funktioner till Excel.
- med COM-gränssnittet.
UDF - Hej världen
- Öppna Excel
- Öppna Visual Basic Editor (se Öppna Visual Basic Editor )
- Lägg till en ny modul genom att klicka på Infoga -> Modul:
- Kopiera och klistra in följande kod i den nya modulen:
Public Function Hello() As String
'Note: the output of the function is simply the function's name
Hello = "Hello, World !"
End Function
För att uppnå :
- Gå tillbaka till din arbetsbok och skriv "= Hello ()" i en cell för att se "Hello World".
Tillåt hela kolumnreferenser utan straff
Det är lättare att implementera vissa UDF: er på kalkylbladet om hela kolumnreferenser kan skickas in som parametrar. På grund av kodningens uttryckliga karaktär kan emellertid varje slinga som involverar dessa områden bearbeta hundratusentals celler som är helt tomma. Detta reducerar ditt VBA-projekt (och arbetsbok) till en frusen röra medan onödiga icke-värden behandlas.
Det är en av de långsammaste metoderna att utföra en uppgift, men ibland är det oundvikligt. Att minska det utförda arbetet till vad som faktiskt krävs är perfekt förnuftigt.
Lösningen är att avkorta hela kolumnen eller hela radreferenser till kalkylbladet.UsedRange med Intersect-metoden . Följande prov replikerar löst ett kalkylblads ursprungliga SUMIF-funktion, så att kriterierna också ändras för att passa summan, eftersom varje värde i summan måste åtföljas av ett värde i kriterierna .
Application.Caller för en UDF som används på ett kalkylblad är den cell där den finns. Cellens .Förälderegenskap är kalkylbladet. Detta kommer att användas för att definiera .UsedRange.
I ett modulkodark:
Option Explicit
Function udfMySumIf(rngA As Range, rngB As Range, _
Optional crit As Variant = "yes")
Dim c As Long, ttl As Double
With Application.Caller.Parent
Set rngA = Intersect(rngA, .UsedRange)
Set rngB = rngB.Resize(rngA.Rows.Count, rngA.Columns.Count)
End With
For c = 1 To rngA.Cells.Count
If IsNumeric(rngA.Cells(c).Value2) Then
If LCase(rngB(c).Value2) = LCase(crit) Then
ttl = ttl + rngA.Cells(c).Value2
End If
End If
Next c
udfMySumIf = ttl
End Function
Syntax:
=udfMySumIf(*sum_range*, *criteria_range*, [*criteria*])
Även om detta är ett ganska förenklat exempel, visar det på ett adekvat sätt att två fullständiga kolumnreferenser skickas (1 048 566 rader vardera) men bearbetar endast 15 rader med data och kriterier.
Länkad officiell MSDN-dokumentation av enskilda metoder och egenskaper med tillstånd av Microsoft ™.
Räkna unika värden inom räckvidd
Function countUnique(r As range) As Long
'Application.Volatile False ' optional
Set r = Intersect(r, r.Worksheet.UsedRange) ' optional if you pass entire rows or columns to the function
Dim c As New Collection, v
On Error Resume Next ' to ignore the Run-time error 457: "This key is already associated with an element of this collection".
For Each v In r.Value ' remove .Value for ranges with more than one Areas
c.Add 0, v & ""
Next
c.Remove "" ' optional to exclude blank values from the count
countUnique = c.Count
End Function