如何将参数从子例程传递到VBA中的函数?

问题描述

我正在尝试寻找值以创建票证对帐过程的最终票证号。这是应该发生的情况:

子例程在单元格“ G x ”中查找值

  • 如果找到一个
    • 将值传递给函数去除字母,转换为数字,然后传递回子例程以放入 单元格“ A x
  • 如果没有价值
    • 将“ C x ”的值传递给函数等。

这会根据填充在单独列中的行数来遍历工作表中的数字单元格。

函数在工作表中本身可以正常工作,但是当我传递该函数时,子例程列A中的值将填充行号,即。 A37 = 37,A8 = 8。我认为我没有正确地将参数传递给函数,但是我不确定。这是该子例程和函数代码

    Sub final_ticket_number()
    Dim rw As Integer
    Dim i As Integer

    'header label
    Range("A1").Value = "Final Ticket #"

    'set number of rows for loop
    With Worksheets(1)
        rw = .Range("B2").End(xlDown).Row
    End With

    'check col G for empty,use col C as backup
    For i = 2 To rw
        If Not IsEmpty(Cells(i,"G")) Then
            'strip out letters in col G,place in col A
            Cells(i,"A").Value = getNumeric("G" & i)
        Else
            'strip out letters in col C,"A").Value = getNumeric("C" & i)
        End If
    Next i
    
    End Sub

    Function getNumeric(cellRef As String) As Long 'remove letters from ticket numbers
    Dim stringLength As Integer
    Dim i As Byte
    Dim Result As String
    stringLength = Len(cellRef)

    'loops through each character in a cell to evaluate if number or not
    For i = 1 To stringLength
        If IsNumeric(Mid(cellRef,i,1)) Then
            Result = Result & Mid(cellRef,1)
        End If
    Next i

    'convert remaining characters to number
    getNumeric = CLng(Result)

    End Function

我想念什么?

解决方法

据我了解,唯一出错的是您的Len(cellRef),在这里您仅传递范围而不是其值。看看我是如何做到的,我必须指定电子表格,然后执行相同的工作。

使用debug.print查看变量的输出。编写代码“ debug.print XvariableX”,并在立即检查(Ctrl + G)中看到分配给变量的值。祝你好运。

Sub final_ticket_number()
Dim rw As Integer
Dim i As Integer

Range("A1").Value = "Final Ticket #"

With Worksheets(1)
    rw = .Range("B2").End(xlDown).Row
End With

For i = 2 To rw
    If Not IsEmpty(Cells(i,"G")) Then
        Cells(i,"A").Value = getNumeric("G" & i)
    Else
        Cells(i,"A").Value = getNumeric("C" & i)
    End If
Next i
End Sub

Function getNumeric(cellRef As String) As Long 'remove letters from ticket numbers
Dim stringLength As Integer
Dim i As Byte
Dim Result As String

Dim Wrs As String
Wrk = ActiveWorkbook.Name
Workbooks(Wrk).Activate
Wrs = ActiveSheet.Name
stringLength = Len(Workbooks(Wrk).Worksheets(Wrs).Range(cellRef))

For i = 1 To stringLength
    If IsNumeric(Mid(Workbooks(Wrk).Worksheets(Wrs).Range(cellRef),i,1)) Then
        Result = Result & Mid(Workbooks(Wrk).Worksheets(Wrs).Range(cellRef),1)
    End If
Next i

getNumeric = CLng(Result)
End Function

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...