【问题标题】:VBA write function and return valueVBA写函数和返回值
【发布时间】:2015-11-17 09:50:08
【问题描述】:

我正在尝试在另一个子例程中调用一个子例程并希望返回一些值。但是它似乎没有返回任何值。我将如何将其编写为函数?代码如下:

Sub tickersymbolchange()

 Dim RSTA_ISIN, RSTA_Currency, RSTA_Ticker As String

For Each rng In r

         ticker_wo_equity = Replace(rng.Value, " Equity", "")
         Exchangecode = Right(ticker_wo_equity, 2)

         Select Case Exchangecode
            Case "PO", "L3", "B3", "S2", "TQ", "SS"

                'MsgBox "I am in PO"

                Call getRSTA_POL3B3S2TQSSIXEB(ticker_wo_equity, RSTA_ISIN, RSTA_Currency, RSTA_Ticker)

                'Get ISIN from Rsta
                If IsEmpty(RSTA_ISIN) Then
                     rng.Offset(0, 11) = "N/A"
                Else
                     rng.Offset(0, 11) = RSTA_ISIN
                End If


                'Get Currency from Rsta
                If IsEmpty(RSTA_Currency) Then
                    rng.Offset(0, 12) = "N/A"
                Else
                    rng.Offset(0, 12) = RSTA_Currency
                End If
End select

End Sub

Sub getRSTA_POL3B3S2TQSSIXEB(ticker, Optional ByVal getISIN As String, Optional ByVal getCurrency As String, Optional ByVal getTicker As String, Optional ByVal getUS As String, Optional ByVal getTickerTicker_IBEX As String, Optional ByVal getPriceCode_GR As String)

    BBs.Send ticker & "<Equity> RSTA"
    BBs.Go
    'Application.Wait (Now + TimeValue("0:00:01"))
    'Sleep 1000

    BBs.CopyScreen

    getISIN = BBs.GetTextField(7, 2, 13)
    getCurrency = BBs.GetTextField(7, 15, 4)
    getTicker = BBs.GetTextField(7, 20, 6)
    getUS = BBs.GetTextField(7, 11, 9)
    getTickerTicker_IBEX = BBs.GetTextField(7, 2, 7)
    getPriceCode_GR = BBs.GetTextField(7, 2, 7)

End Sub

所以在这里我试图将 RSTA_ISIN 赋予函数 getRSTA_POL... 然后该函数应将 RSTA_ISIN 分配给 getISIN 的值,但是 RSTA_ISIN 和所有其他参数始终为空。

【问题讨论】:

标签: vba excel function subroutine


【解决方案1】:

首先,您的代码为您的子例程使用Call,您可以使用它,但它实际上避免了函数的任何输出!

其次,如果您想影响过程或函数内的参数值,则需要使用ByRef 而不是ByValByVal 将创建输入参数的副本,但不会影响初始变量!

最后,你需要将第二个 Sub 转换为 Function 并定义输出类型(这里我设置为 String),然后将函数输出分配给一个变量,如下所示:

Public Function test_Function() As Integer
    test = 1
End Function
Sub Test()
    Dim Result as Integer
    Result = test_Function
    MsgBox Result 
End Sub

这是您修改后的代码:

Sub tickersymbolchange()
Dim RSTA_ISIN As String, RSTA_Currency As String, RSTA_Ticker As String
For Each Rng In r
    ticker_wo_equity = Replace(Rng.Value, " Equity", "")
    Exchangecode = Right(ticker_wo_equity, 2)

    Select Case Exchangecode
       Case "PO", "L3", "B3", "S2", "TQ", "SS"
           RSTA_ISIN = getRSTA_POL3B3S2TQSSIXEB(ticker_wo_equity, RSTA_ISIN, RSTA_Currency, RSTA_Ticker)
           'Get ISIN from Rsta
           If IsEmpty(RSTA_ISIN) Then
                Rng.Offset(0, 11) = "N/A"
           Else
                Rng.Offset(0, 11) = RSTA_ISIN
           End If
           'Get Currency from Rsta
           If IsEmpty(RSTA_Currency) Then
               Rng.Offset(0, 12) = "N/A"
           Else
               Rng.Offset(0, 12) = RSTA_Currency
           End If
    End Select
Next Rng
End Sub

Function getRSTA_POL3B3S2TQSSIXEB(ticker, Optional ByRef getISIN As String, _
                            Optional ByRef getCurrency As String, _
                            Optional ByRef getTicker As String, _
                            Optional ByRef getUS As String, _
                            Optional ByRef getTickerTicker_IBEX As String, _
                            Optional ByRef getPriceCode_GR As String) As String
    BBs.Send ticker & "<Equity> RSTA"
    BBs.Go
    'Sleep 1000
    BBs.CopyScreen

    getISIN = BBs.GetTextField(7, 2, 13)
    getCurrency = BBs.GetTextField(7, 15, 4)
    getTicker = BBs.GetTextField(7, 20, 6)
    getUS = BBs.GetTextField(7, 11, 9)
    getTickerTicker_IBEX = BBs.GetTextField(7, 2, 7)
    getPriceCode_GR = BBs.GetTextField(7, 2, 7)

getRSTA_POL3B3S2TQSSIXEB = getISIN
End Function

【讨论】:

  • 如果我使用它,它会给我错误 ByRef 参数类型不匹配
  • 这是因为您没有将RSTA_ISIN, RSTA_Currency 声明为字符串。查看并测试编辑! ;)
【解决方案2】:

首先函数声明不同

Function GetLong()
   GetLong = 10
End Function

Sub GetLong()
  GetLong = 10 'WRONG!!!
End Sub

其次,你只能定义一个提供给过程的变量,如果你通过它的引用(指针)而不是值来发送它:

Sub SetLong(ByRef myLong as Long)
   myLong = 10
End Sub

所以这一切都是为了替换: ByVal getISIN As StringByRef getISIN As String

Here you can find a tutorial on Procedures vs. Functions.

【讨论】:

  • 如果我使用它,它会给我错误 ByRef 参数类型不匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多