【问题标题】:VBA Pass value between subs潜艇之间的VBA传递值
【发布时间】:2017-10-02 04:23:48
【问题描述】:

我正在尝试学习如何在 subs 之间来回传递值。我创建了几个宏子,它们最终在它们之间一遍又一遍地使用相同的代码行。首先,我希望能够查找/计算列数和行数。这是我到目前为止所拥有的,但它不起作用。

我还想将它从列扩展到行。

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。

【问题讨论】:

  • x1Up 应该是 xlUp 小写 L 而不是 1
  • 仅供参考,我之前已经回答过这个问题,请参阅此链接:stackoverflow.com/questions/17998773/…
  • 如果 Scott 的评论不能解决您的问题,请更新问题,详细说明您所说的“挂起”是什么意思。 (使用x1Up 而不是xlUp 通常会使代码崩溃并出现“应用程序定义的或对象定义的错误”,或者只是返回一个不正确的值,而不是挂起。)
  • 提示:输入所有小写命令,如xlup,VBA 编辑器会将其更改为xlUp。如果您没有看到更改,则说明您输入错误 .... 与变量相同 .... 在定义 dim lRows As long 时使用大写和小写,但是当您使用变量时使用全部小写 ....value = lcols,编辑器会将其更改为.....Value = lCols .... 如果它没有更改,那么您输入错误

标签: vba excel function user-defined-functions


【解决方案1】:

几点:

  1. 最好声明行变量和列变量一样长。见this
  2. 当您将变量lCols, lRows 声明为Integer 时,函数的返回类型也应该是Integer
  3. 在您的情况下无需使用Exit FunctionExit Function 用于退出函数并执行函数调用之后的语句。但是,在您的情况下,函数本身在那里结束,因此不需要退出。

尝试关注

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

【讨论】:

  • 我应该更频繁地刷新..@c3nixon 他的代码因为缺少Option Explicitand Sheet1 对象而中断。 countCols 是否有机会获得 Null 或我要小心?
  • @BitAccesser - 如果没有包含数据的行或列,则 Cells(Rows.Count, 1).End(xlUp).RowCells(1, Columns.Count).End(xlToLeft).Column 将返回 1
  • @BitAccesser 如果函数返回Long,则无法从中获取Null
  • @LS_ᴅᴇᴠ 如果您尝试将 Null 值分配给 Long 会导致错误。如果Cells(1, Columns.Count).End(xlToLeft).Column 可以得到 Null,你必须通过用 Long 替换 Null(或 On Error Resume Next,如果你想被击中 ;-))来避免 assing Null:我不熟悉 Excel 函数,这就是我问的原因。顺便说一句,Excel 没有类似 Nz() 的函数吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
相关资源
最近更新 更多