Excel Can';t运行vba函数

Excel Can';t运行vba函数,excel,vba,Excel,Vba,我一直在尝试运行此函数来计算当前工作簿中每个工作表中的行数。我从前面回答的问题中得到了函数 但是,当我尝试运行它时,它会要求我创建一个宏,当我创建宏时,它会创建一个“Sub()”,当我将函数放在其中时,它会给我一个错误“Expected End Sub”,我不知道该怎么做。我尝试过各种方法重新编写代码,但都没有用 我是vba新手,不知道这里出了什么问题 Function Test_It() For Each Sheet In ThisWorkbook.Sheets Deb

我一直在尝试运行此函数来计算当前工作簿中每个工作表中的行数。我从前面回答的问题中得到了函数

但是,当我尝试运行它时,它会要求我创建一个宏,当我创建宏时,它会创建一个“Sub()”,当我将函数放在其中时,它会给我一个错误“Expected End Sub”,我不知道该怎么做。我尝试过各种方法重新编写代码,但都没有用

我是vba新手,不知道这里出了什么问题

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。等等?不,现在,当你跑步的时候