有这里发生了一些事情。首先,你应该避免使用Integers
而不是Longs
。指定Integer
的值大于32,767。如果你试图给它一个32,768的值,你将得到一个运行时Overflow
错误(错误编号8)。
修复该第一位应该是这样的:
Function max_column()
Dim i As Long
Dim max_col As Long
For i = 1 To 200
If Worksheets("Sheet1").Cells(2, i) = "" Then max_col = i: Exit For
Next i
max_column() = max_col
Exit Function
End Function
当然,这并不解决问题,它只是摆脱一个常见的错误,往往会导致问题。在这里有一些更加险恶的事情可能是问题。首先,您正在使用不合格的Worksheets
参考,这意味着您依赖于ActiveWorkbook
,无论这是否是预期的目标。
第二个问题是:
字符。这表示一个换行符,实际上并没有换行符!多么方便......除非你错过了你的逻辑问题。
For i = 1 To 200
If Worksheets("Sheet1").Cells(2, i) = "" Then max_col = i: Exit For
Next i
是真的:
For i = 1 To 200
If Worksheets("Sheet1").Cells(2, i) = "" Then
max_col = i
End If
Exit For
Next i
所有这个循环将永远做的是返回1或0,因为无论是第二行中的第一个单元格为空,或者退出循环。
最后,你的函数返回调用再次被调用,这是造成堆栈溢出错误(因为它保持调用和调用和调用....)。
修复max_colum
真的应该是GetTheFirstColumnOnTheActiveSheetThatHasANullStringValueInTheSecondRow
(请注意,实际功能不是简单的max_column
)。
有了这些改变你的代码变成:
Function max_column()
Dim i As Long
Dim max_col As Long
For i = 1 To 200
If Worksheets("Sheet1").Cells(2, i) = "" Then
max_col = i
Exit For
End If
Next i
max_column = max_col
Exit Function
End Function
并与最后的调整,以避免其他错误:
Public Function GetMaxColumn() as Long
Dim i As Long
For i = 1 To 200
If ActiveWorkbook.Worksheets("Sheet1").Cells(2, i) = vbNullString Then
GetMaxColumn = i
Exit Function
End If
Next i
End Function
瞧!一个完美的功能函数。
从'if'语句中删除'max_col = i:'(注意冒号也被删除)...将第3行从结尾更改为'max_column()= i' ....删除'Exit Function' .. 。删除'Dim max_col As Integer' – jsotola