“用户定义types未定义”错误,没有行高亮显示 – 错误是什么?

我对VBA相当陌生。 我想写一个函数,将返回包含一个值的列的数量。

因此,例如,如果“37”在列A中出现2x,在列B中出现3x,在列C中出现0x,则函数将返回2。

当我运行这个,它给了我一个错误 – “用户定义的types没有定义”。 VBA并不表示有问题的特定行。

Function countUniqueCols(toFind As Text, CASarray As Object) As Integer Dim numCols As Integer numCols = 0 Dim currentCol As Column For Each currentCol In CASarray.Columns For Each currentRow In currentCol.Rows If InStr(1, Cells(currentRow, currentCol).value, toFind) Then numCols = numCols + 1 Exit For End If Next currentRow Next currentCol countUniqueCols = numCols End Function 

思考? 非常感谢!

卫生署! 我在这个头上摸了一下,甚至试图通过代码 – 然后我突然发现它 – 文字

 Function countUniqueCols(toFind As Text, CASarray As Object) As Integer 

应该:

 Function countUniqueCols(toFind As String, CASarray As Range) As Integer 

Text不是有效的VBA数据types。

然后,当我想我解决了问题的时候,我试着再次运行它,并且find了Column ,这将需要Range ,即

 Dim currentCol As Column 

应该

 Dim currentCol As Range 

然后我发现currentRow没有定义。 而Cells(currentRow, currentCol)是错误的。

下面的代码应该可以工作:

 Function countUniqueCols(toFind As String, CASarray As Range) As Integer Dim numCols As Integer numCols = 0 Dim currentCol As Range Dim currentRow As Range For Each currentCol In CASarray.Columns For Each currentRow In currentCol.Rows If InStr(1, currentRow.Value, toFind) Then numCols = numCols + 1 Exit For End If Next currentRow Next currentCol countUniqueCols = numCols End Function 

但是Shai的代码会更好,所以我只是在这里留下来,这样就可以看到现有代码中存在的微妙的错误。

因为没有关系(根据你的post)在列中findfind多less次(只要它是> = 1),那么你可以遍历CASarray范围的列,并且对于每一列使用Application.Matchfind一个单一的比赛。

在这种情况下,如果If Not IsError(Application.Match(toFind, currentCol, 0)) Then意味着在该列中find匹配项,因此将numCols的计数添加到1。

我添加的第二个Sub是确保您使用正确的参数(和完全限定),当你调用这个函数。

函数countUniqueCols代码

 Option Explicit Function countUniqueCols(toFind As String, CASarray As Range) As Long Dim numCols As Long, currentCol As Range numCols = 0 For Each currentCol In CASarray.Columns If Not IsError(Application.Match(toFind, currentCol, 0)) Then numCols = numCols + 1 End If Next currentCol countUniqueCols = numCols End Function 

Sub Test_countUniqueCols代码 (testing函数)

 Sub Test_countUniqueCols() Dim Res As Long Res = countUniqueCols("Shai", Worksheets("Sheet1").Range("A1:D1000")) MsgBox Res End Sub