子系统之间的VBA传递值
我正在努力学习如何在SUB之间来回传递值。我创建了几个宏sub,它们最终在它们之间反复使用相同的代码行。首先,我希望能够查找/计算列和行的数量。这是我到目前为止所做的,但它不起作用 我还想将其扩展到行,而不仅仅是cols子系统之间的VBA传递值,vba,excel,function,user-defined-functions,Vba,Excel,Function,User Defined Functions,我正在努力学习如何在SUB之间来回传递值。我创建了几个宏sub,它们最终在它们之间反复使用相同的代码行。首先,我希望能够查找/计算列和行的数量。这是我到目前为止所做的,但它不起作用 我还想将其扩展到行,而不仅仅是cols Public Sub main() Dim lCols As Integer Dim lRows As Integer lCols = countCols(Sheet1) Sheet1.Range("M2").Value = lCols End Sub Pu
Public Sub main()
Dim lCols As Integer
Dim lRows As Integer
lCols = countCols(Sheet1)
Sheet1.Range("M2").Value = lCols
End Sub
Public Function countCols(sheetValue As Worksheet) As Variant
countCols = sheetValue.Cells(Rows.Count, 1).End(x1Up).Row
Exit Function
End Function
现在它挂在函数中。。。似乎未将“Sheet1”传递到sheetValue 几点:
lcol、lRows
声明为Integer
时,函数的返回类型也应为Integer
Public Sub main()
Dim lCols As Long, lRows As Long 'declared as long
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet2") 'change Sheet2 to your data sheet
lCols = countCols(ws)
lRows = countRows(ws)
ws.Range("M2").Value = lCols
ws.Range("N2").Value = lRows
End Sub
Public Function countCols(sheetValue As Worksheet) As Long 'should return long
countCols = sheetValue.Cells(1, sheetValue.Columns.Count).End(xlToLeft).Column
End Function
Public Function countRows(sheetValue As Worksheet) As Long 'should return long
countRows = sheetValue.Cells(sheetValue.Rows.Count, 1).End(xlUp).Row
End Function
几点:
lcol、lRows
声明为Integer
时,函数的返回类型也应为Integer
Public Sub main()
Dim lCols As Long, lRows As Long 'declared as long
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("Sheet2") 'change Sheet2 to your data sheet
lCols = countCols(ws)
lRows = countRows(ws)
ws.Range("M2").Value = lCols
ws.Range("N2").Value = lRows
End Sub
Public Function countCols(sheetValue As Worksheet) As Long 'should return long
countCols = sheetValue.Cells(1, sheetValue.Columns.Count).End(xlToLeft).Column
End Function
Public Function countRows(sheetValue As Worksheet) As Long 'should return long
countRows = sheetValue.Cells(sheetValue.Rows.Count, 1).End(xlUp).Row
End Function
x1Up
应该是xlUp
小写L
而不是1
。仅供参考,我以前已经回答过这个问题,请查看此链接:如果Scott的评论不能解决您的问题,请更新问题,详细说明“它挂起”的含义。(使用x1Up
而不是xlUp
通常会导致代码因“应用程序定义或对象定义错误”而崩溃,或者只是返回一个不正确的值,而不是挂起。)提示:以小写形式键入所有命令,如xlUp
,VBA编辑器将其更改为xlUp
。如果您没有看到更改,那么您键入了错误的内容。。。。变量也是如此。。。。定义dim lRows尽可能长时使用大写和小写
,但使用变量use all lower case…value=lcols
,编辑器将其更改为…value=lcols
。。。。如果它没有改变,那么您在键入x1Up
时出错,应该是xlUp
小写L
而不是1
。仅供参考,我以前已经回答过这个问题,请查看此链接:如果Scott的评论不能解决您的问题,请更新问题,详细说明您所说的“它挂起”是什么意思。(使用x1Up
而不是xlUp
通常会导致代码因“应用程序定义或对象定义错误”而崩溃,或者只是返回一个不正确的值,而不是挂起。)提示:以小写形式键入所有命令,如xlUp
,VBA编辑器将其更改为xlUp
。如果您没有看到更改,那么您键入了错误的内容。。。。变量也是如此。。。。定义dim lRows尽可能长时使用大写和小写
,但使用变量use all lower case…value=lcols
,编辑器将其更改为…value=lcols
。。。。如果未更改,则您在键入中出错。我应该更频繁地刷新。@c3nixon他的代码因缺少Option Explicit
和Sheet1对象而中断。countCols是否有可能变为Null或者我需要小心?@BitAccesser-如果没有包含数据的行或列,那么单元格(Rows.Count,1)。End(xlUp)。row
和单元格(1,Columns.Count)。End(xlToLeft)。如果函数返回Long
,column
将返回1
@BitAccesser,无法从中获取Null
。@LS_ᴅᴇᴠ 如果尝试将空值分配为长值,会导致错误的原因是什么。如果单元格(1,Columns.Count).End(xlToLeft).Column
可以获取Null,您必须避免将Null替换为Long(或On Error Resume Next
如果您想获取快照;-):我不熟悉Excel函数,这就是我问的原因。顺便说一句,Excel没有类似Nz()的函数吗?我应该更频繁地刷新。@c3nixon他的代码因缺少Option Explicit
和Sheet1对象而中断。countCols是否有可能变为Null或者我需要小心?@BitAccesser-如果没有包含数据的行或列,那么单元格(Rows.Count,1)。End(xlUp)。row
和单元格(1,Columns.Count)。End(xlToLeft)。如果函数返回Long
,column
将返回1
@BitAccesser,无法从中获取Null
。@LS_ᴅᴇᴠ 如果尝试将空值分配为长值,会导致错误的原因是什么。如果单元格(1,Columns.Count).End(xlToLeft).Column
可以获取Null,您必须避免将Null替换为Long(或On Error Resume Next
如果您想获取快照;-):我不熟悉Excel函数,这就是我问的原因。顺便问一下,Excel没有类似Nz()的函数吗?