Excel Can';t运行vba函数
我一直在尝试运行此函数来计算当前工作簿中每个工作表中的行数。我从前面回答的问题中得到了函数 但是,当我尝试运行它时,它会要求我创建一个宏,当我创建宏时,它会创建一个“Sub()”,当我将函数放在其中时,它会给我一个错误“Expected End Sub”,我不知道该怎么做。我尝试过各种方法重新编写代码,但都没有用 我是vba新手,不知道这里出了什么问题Excel Can';t运行vba函数,excel,vba,Excel,Vba,我一直在尝试运行此函数来计算当前工作簿中每个工作表中的行数。我从前面回答的问题中得到了函数 但是,当我尝试运行它时,它会要求我创建一个宏,当我创建宏时,它会创建一个“Sub()”,当我将函数放在其中时,它会给我一个错误“Expected End Sub”,我不知道该怎么做。我尝试过各种方法重新编写代码,但都没有用 我是vba新手,不知道这里出了什么问题 Function Test_It() For Each Sheet In ThisWorkbook.Sheets Deb
Function Test_It()
For Each Sheet In ThisWorkbook.Sheets
Debug.Print Sheet.Name & vbTab & CountMyRows(Sheet.Name)
Next Sheet
End Function
Function CountMyRows(SName) As Long '# where SName is the name of a sheet
Dim rowCount As Long
rowCount = Worksheets(SName).UsedRange.Rows.Count
CountMyRows = rowCount
End Function
在子系统中使用功能
- 请注意,
工作表
集合(属于工作簿
对象)还包括没有UsedRange
的图表
- 编写引用对象的函数时,最好将该对象用作参数。例如,在您的函数版本中,您使用的是不合格的
工作表(SName)
,我们不知道它属于哪个工作簿。因此,如果Sub
中的ThisWorkbook
未激活,则该函数可能会失败或无法写入正确的结果
选项显式
子测试_It()
将ws设置为工作表
对于此工作簿中的每个ws。工作表
Debug.Print ws.Name&vbTab&CountMyRows(ws)
'没有函数(函数有点无用):
'Debug.Print ws.Name&vbTab&ws.UsedRange.Rows.Count
下一个ws
端接头
函数CountMyRows(ByVal ws作为工作表)的长度
如果ws为Nothing,则退出函数
CountMyRows=ws.UsedRange.Rows.Count
端函数
编辑
一个更实际的例子
下面将工作表名称和此工作簿
(包含此代码的工作簿)的相应“已用范围行数”写入新工作簿的第一个工作表
Sub testRowsCount()
' Add a new (destination) workbook and create a reference
' to its first (destination) worksheet.
Dim dws As Worksheet: Set dws = Workbooks.Add.Worksheets(1)
' Write headers.
dws.Cells(1, "A").Value = "Name"
dws.Cells(1, "B").Value = "RowsCount"
' Define destination rows counter.
Dim n As Long: n = 1
Dim sws As Worksheet
' Loop through the worksheets collection (all worksheets)
' of the Source Workbook and write the names and used range
' rows counts to the Destination Worksheet.
For Each sws In ThisWorkbook.Worksheets
n = n + 1
dws.Cells(n, "A").Value = sws.Name
dws.Cells(n, "B").Value = CountMyRows(sws)
Next sws
dws.Parent.Saved = True ' for easy closing only.
End Sub
在子系统中使用功能
- 请注意,
工作表
集合(属于工作簿
对象)还包括没有UsedRange
的图表
- 编写引用对象的函数时,最好将该对象用作参数。例如,在您的函数版本中,您使用的是不合格的
工作表(SName)
,我们不知道它属于哪个工作簿。因此,如果Sub
中的ThisWorkbook
未激活,则该函数可能会失败或无法写入正确的结果
选项显式
子测试_It()
将ws设置为工作表
对于此工作簿中的每个ws。工作表
Debug.Print ws.Name&vbTab&CountMyRows(ws)
'没有函数(函数有点无用):
'Debug.Print ws.Name&vbTab&ws.UsedRange.Rows.Count
下一个ws
端接头
函数CountMyRows(ByVal ws作为工作表)的长度
如果ws为Nothing,则退出函数
CountMyRows=ws.UsedRange.Rows.Count
端函数
编辑
一个更实际的例子
下面将工作表名称和此工作簿
(包含此代码的工作簿)的相应“已用范围行数”写入新工作簿的第一个工作表
Sub testRowsCount()
' Add a new (destination) workbook and create a reference
' to its first (destination) worksheet.
Dim dws As Worksheet: Set dws = Workbooks.Add.Worksheets(1)
' Write headers.
dws.Cells(1, "A").Value = "Name"
dws.Cells(1, "B").Value = "RowsCount"
' Define destination rows counter.
Dim n As Long: n = 1
Dim sws As Worksheet
' Loop through the worksheets collection (all worksheets)
' of the Source Workbook and write the names and used range
' rows counts to the Destination Worksheet.
For Each sws In ThisWorkbook.Worksheets
n = n + 1
dws.Cells(n, "A").Value = sws.Name
dws.Cells(n, "B").Value = CountMyRows(sws)
Next sws
dws.Parent.Saved = True ' for easy closing only.
End Sub
Test\u It
不会返回值,因此它应该是一个sub。阅读文章并理解其中的差异
Sub Test_It()
For Each Sheet In ThisWorkbook.Sheets
Debug.Print Sheet.Name & vbTab & CountMyRows(Sheet.Name)
Next Sheet
End Function
Function CountMyRows(SName) As Long '# where SName is the name of a sheet
Dim rowCount As Long
rowCount = Worksheets(SName).UsedRange.Rows.Count
CountMyRows = rowCount
End Function
那就行了。如果要将计数输入工作簿中的单元格,可以采用以下方法:
Function Test_It()
Test_It = CountMyRows(ActiveSheet.Name)
End Function
Function CountMyRows(SName) As Long '# where SName is the name of a sheet
Dim rowCount As Long
CountMyRows = Worksheets(SName).UsedRange.Rows.Count
End Function
只需将=Test\u It()
放入一个单元格,您就可以得到计数。Test\u It
不会返回值,因此它应该是一个sub。阅读文章并理解其中的差异
Sub Test_It()
For Each Sheet In ThisWorkbook.Sheets
Debug.Print Sheet.Name & vbTab & CountMyRows(Sheet.Name)
Next Sheet
End Function
Function CountMyRows(SName) As Long '# where SName is the name of a sheet
Dim rowCount As Long
rowCount = Worksheets(SName).UsedRange.Rows.Count
CountMyRows = rowCount
End Function
那就行了。如果要将计数输入工作簿中的单元格,可以采用以下方法:
Function Test_It()
Test_It = CountMyRows(ActiveSheet.Name)
End Function
Function CountMyRows(SName) As Long '# where SName is the name of a sheet
Dim rowCount As Long
CountMyRows = Worksheets(SName).UsedRange.Rows.Count
End Function
只需将=Test\u It()
放入一个单元格,就可以得到计数。Test\u它是一个子函数,而不是一个函数,因为它不返回值。试着读读VBA中定义函数和子函数之间的区别。也许您应该学习VBA教程。你还需要告诉我们你是如何运行你的宏的。还有,为什么你需要一个单独的小函数来实现这一点?只需将Debug.Print Sheet.Name&vbTab&CountMyRows(Sheet.Name)
更改为Debug.Print Sheet.Name&vbTab&Sheet.UsedRange.Rows.Count
?测试它是一个子函数,而不是一个函数,因为它不返回值。试着读读VBA中定义函数和子函数之间的区别。也许您应该学习VBA教程。你还需要告诉我们你是如何运行你的宏的。还有,为什么你需要一个单独的小函数来实现这一点?只需将Debug.Print Sheet.Name&vbTab&CountMyRows(Sheet.Name)
更改为Debug.Print Sheet.Name&vbTab&Sheet.UsedRange.Rows.Count
?很好地解释了谢谢你的解释,我对逻辑有点了解不,但它仍然不起作用。该函数不运行。在一张特定的纸上或另一张空白的纸上。它不应该计算每张纸上的行数并将它们写在最后一张纸上吗?比如287082。等等?否。此时,当您运行子
时,它正在将结果写入VBE的
(Alt+F11
)即时窗口
(Ctrl+G
)。您尚未指定任何范围(要写入的第一个单元格)、工作表或工作簿来写入结果。详细说明一下(最终工作表?在哪里?),我会添加一个合适的解决方案。我希望它写在最终工作表中,从A1开始,一直到XX。谢谢,非常感谢,你帮了我大忙。非常感谢。很好的解释谢谢你的解释,我更了解逻辑不,但它仍然不起作用。该函数不运行。在一张特定的纸上或另一张空白的纸上。它不应该计算每张纸上的行数并将它们写在最后一张纸上吗?比如287082。等等?不,现在,当你跑步的时候