子系统之间的VBA传递值

子系统之间的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

我正在努力学习如何在SUB之间来回传递值。我创建了几个宏sub,它们最终在它们之间反复使用相同的代码行。首先,我希望能够查找/计算列和行的数量。这是我到目前为止所做的,但它不起作用

我还想将其扩展到行,而不仅仅是cols

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()的函数吗?