VBA写函数和返回值

我正在尝试在另一个子例程中调用子例程,并希望返回一些值。 但是,它似乎没有回报任何价值。 我怎么会写这个函数? 代码如下:

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的值,但是RSTA_ISIN和所有其他参数都是空的。

首先,你的代码使用一个CallCall你的子程序,你可以使用它,但是它实际上避免了从这个函数的任何输出!

其次,如果要影响过程或函数内的参数值,则需要使用ByRef而不是ByValByVal将创buildinput参数的副本,但不会影响初始variables!

最后,你需要将第二个Sub转换成一个Function,并且定义输出的types(在这里我把它设置为一个String),然后把函数的输出赋值给一个variables,如下所示:

 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 

首先函数的声明是不同的

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

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

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

所以这一切来取代: ByVal getISIN As StringByRef getISIN As String

在这里你可以find关于程序和function的教程 。