Sök…


Syntax

  1. 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.

  2. functionName = theVariableOrValueBeingReturned
    Om du kommer från andra programmeringsspråk, kan du bli van vid Return 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.

  3. 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:

  1. använder VBA.
  2. med hjälp av Excel C API - Genom att skapa en XLL som exporterar kompilerade funktioner till Excel.
  3. med COM-gränssnittet.

UDF - Hej världen

  1. Öppna Excel
  2. Öppna Visual Basic Editor (se Öppna Visual Basic Editor )
  3. Lägg till en ny modul genom att klicka på Infoga -> Modul:

ange bildbeskrivning här

  1. 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å :

ange bildbeskrivning här

  1. Gå tillbaka till din arbetsbok och skriv "= Hello ()" i en cell för att se "Hello World".

ange bildbeskrivning här

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*])

udf_sumifs

Ä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

samlingar



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow