“用户定义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.Match
find一个单一的比赛。
在这种情况下,如果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