2017-04-17 1 views
2

Ich bin neu in VBA und Skripting im Allgemeinen. Ich war in der Lage, Ressourcen zu ziehen und eine benutzerdefinierte Funktion in Excel zu erstellen, die die eindeutige Anzahl eines Arrays zurückgibt. Die Funktion funktioniert ordnungsgemäß, wenn ich sie in einer Zelle in Excel anrufe.VBA: So rufen Sie eine benutzerdefinierte Funktion in einem Excel-Makro

Nun möchte ich diese Funktion in einem Makro verweisen, um mir ein Meldungsfeld mit den Zählungen für zwei verschiedene Spalten bereitzustellen. Wenn ich versuche, das Makro zu verwenden, erhalte ich einen 'Type Mismatch' Fehler.

Nicht sicher, was ich falsch mache - jede Hilfe würde sehr geschätzt werden.

Bearbeiten: Enthalten den COUNTDISTINCTcol-Code.

Sub GalileoCounts() 

    Dim teachers As Long 
    Dim students As Long 

    teachers = COUNTDISTINCTcol("W2:W") 'ERROR HERE for "W2:W" 
    students = COUNTDISTINCTcol("A2:A") 'ERROR with "A2:A" as well 

    MsgBox "Teachers: " & teachers & vbNewLine & "Students: " & students, 
    vbOKOnly, "Galileo Counts" 

End Sub 
---- 
Public Function COUNTDISTINCTcol(ByRef rngToCheck As Range) As Variant 

Dim colDistinct As Collection 
Dim varValues As Variant, varValue As Variant 
Dim lngCount As Long, lngRow As Long, lngCol As Long 

On Error GoTo ErrorHandler 

varValues = rngToCheck.Value 

'if rngToCheck is more than 1 cell then 
'varValues will be a 2 dimensional array 
If IsArray(varValues) Then 

    Set colDistinct = New Collection 

    For lngRow = LBound(varValues, 1) To UBound(varValues, 1) 
     For lngCol = LBound(varValues, 2) To UBound(varValues, 2) 

      varValue = varValues(lngRow, lngCol) 

      'ignore blank cells and throw error 
      'if cell contains an error value 
      If LenB(varValue) > 0 Then 

       'if the item already exists then an error will 
       'be thrown which we want to ignore 
       On Error Resume Next 
       colDistinct.Add vbNullString, CStr(varValue) 
       On Error GoTo ErrorHandler 

      End If 

     Next lngCol 
    Next lngRow 

    lngCount = colDistinct.Count 
Else 
    If LenB(varValues) > 0 Then 
     lngCount = 1 
    End If 

End If 

COUNTDISTINCTcol = lngCount 

Exit Function 

ErrorHandler: 
    COUNTDISTINCTcol = CVErr(xlErrValue) 

End Function 
+0

Was sind die Parameter für die UDF countdistinct? – yass

+2

Können wir den Code für COUNTDISTINCTcol() sehen? –

+0

Ohne den Code zu sehen, können wir Ihnen nicht helfen. Auch wenn es für "A2: A" oder irgendeinen anderen Bereich, aber nicht für "W2: W" funktioniert, müssen wir sowohl den Funktionscode als auch das Aussehen Ihrer Daten sehen. – Masoud

Antwort

4

In GalileoCounts Sie verwenden COUNTDISTINCTcol("W2:W"). Das passiert eine String zu COUNTDISTINCTcol aber COUNTDISTINCTcol erwartet einen Range Parameter. Also, selbst wenn Sie etwas wie COUNTDISTINCTcol("W:W") setzen, würde es nicht funktionieren - es müsste COUNTDISTINCTcol(Range("W:W")) sein.

+1

Eine Nebenbemerkung - manchmal müssen meine UDFs 'myUDF-Bereich (" W: W ")' anstelle von 'myUDF (Bereich (" W: W ")) genannt werden ... .... gibt es eine Konvention, wenn Sie einen verwenden Format über dem anderen? Ist es beim Erstellen der UDF oder wie ich es nenne? – BruceWayne

+0

Die Verwendung von 'Range' is isolation ist eine implizite Referenz auf das activesheet des activeworkbooks. Es ist besser, explizit auf die Arbeitsmappe/das Arbeitsblatt und dann auf den Bereich zu verweisen. – ThunderFrame

+1

@BruceWayne - Wenn Sie einen Wert zurückgeben, verwenden Sie die Syntax 'lhs = func (parms)'. Funktionen (einschließlich UDFs) sollten normalerweise Werte zurückgeben, so dass dies die normale Syntax wäre. Wenn Sie keinen Wert zurückgeben (d. H. Ein Sub aufrufen oder eine Funktion aufrufen, aber den Rückgabewert ignorieren möchten), würden Sie eine Syntax von 'func parms' oder' Call func (parms) 'verwenden. Wenn Sie versuchen, eine 'func parms'-Syntax zu verwenden, aber versehentlich Klammern um die parms (dh' func (parms) ') setzen, dann wird VBA' pumps' ByVal statt ByRef übergeben - das wird implizit 'myUDF (Range ("W : W "))' zu 'myUDF-Bereich (" W: W "). Wert' – YowE3K

Verwandte Themen