Excel VBA单元尽pipe有价值返回“0”

我正在开展一项工作,我需要使用Google的oAuth 2.0集成function从Excel中获取Google Analytics API的访问令牌。

最初的请求通过传递存储在我的工作表单元中的客户端ID,密钥和身份validation令牌起作用。

我正在使用的UDF看起来像这样:

Public Function GetGAAuthenticationToken _ (ByVal ClientId As String, _ ByVal ClientSecret As String, _ ByVal code As String, _ accessToken As String, _ RefreshToken As String, _ accessTokenExpires As Date) 'Has token expire? If not, don't renew the access token. Dim Token(2, 0) Dim Refresh As Boolean: Refresh = True If Now < accessTokenExpires Then Token(0, 0) = accessToken Token(1, 0) = RefreshToken Token(2, 0) = accessTokenExpires Refresh = False End If Dim objhttp As Object Dim ResponseText As String If Refresh Then If RefreshToken = "" Or RefreshToken = "0" Then 'Initial authorization code=GetGAAuthenticationToken(B1, B2, B4, B6, B7, B8) Set objhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0") URL = "https://accounts.google.com/o/oauth2/token" objhttp.Open "POST", URL, False objhttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded" objhttp.setTimeouts 1000000, 1000000, 1000000, 1000000 objhttp.send ("code=" & code & "&client_id=" & ClientId & "&client_secret=" _ & ClientSecret _ & "&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2%2E0%3Aoob&grant_type=authorization_code") ResponseText = objhttp.ResponseText Else 'Refresh Token Set objhttp = CreateObject("MSXML2.ServerXMLHTTP.6.0") URL = "https://accounts.google.com/o/oauth2/token" objhttp.Open "POST", URL, False objhttp.setRequestHeader "Content-type", "application/x-www-form-urlencoded" objhttp.setTimeouts 1000000, 1000000, 1000000, 1000000 objhttp.send _ ("client_id=" & ClientId _ & "&client_secret=" & ClientSecret & "&refresh_token=" _ & RefreshToken & "&grant_type=refresh_token") ResponseText = objhttp.ResponseText End If Dim XMLResponse: Set XMLResponse = JSONtoXML(ResponseText) Dim XMLResult: Set XMLResult = XMLResponse.SelectSingleNode("//XML") If Not IsNull(XMLResult.GetAttribute("access_token")) Then Token(0, 0) = XMLResult.GetAttribute("access_token") End If If Not IsNull(XMLResult.GetAttribute("refresh_token")) Then Token(1, 0) = XMLResult.GetAttribute("refresh_token") Else Token(2, 0) = RefreshToken End If If Not IsNull(XMLResult.GetAttribute("expires_in")) Then If IsNumeric(XMLResult.GetAttribute("expires_in")) Then Token(2, 0) = DateAdd("s", CInt(XMLResult.GetAttribute("expires_in")), Now) Else Token(2, 0) = DateAdd("s", 3600, Now) End If Else Token(2, 0) = DateAdd("s", 3600, Now) End If End If GetGAAuthenticationToken = Token End Function 

在我的工作表中,我有一个调用函数的单元格数组:

 =GetGAAuthenticationToken(B1, B2, B4, B5, B6, B7) 

如上所述,初始请求正常工作,并将访问令牌,刷新令牌和访问令牌过期date输出到单元格B5,B6和B7中。

但是,当我再次运行请求时,我期望B5,B6和B7的值传递给我的UDF,它们通过“0”。 好像他们正在重新触发更新和UDF执行。 是否有可能获得这些价值?

我遇到了这个页面http://fastexcel.wordpress.com/2012/01/08/writing-efficient-vba-udfs-part-8-getting-the-previously-calculated-value-from-the-calling -cells /这似乎是我想要做的,但是这似乎是一个单一的领域,而不是一个数组?

我在Excel和VBA方面都不是很有经验,所以任何帮助都是值得欢迎的。

谢谢!

改变你的函数来获取Range参数,而不是string/date参数。 引用“B1”的UDF传递一个Range对象。

 Public Function GetGAAuthenticationToken(ByVal p_ClientId As Range, ByVal p_ClientSecret As Range, ByVal p_code As Range, p_accessToken As Range, _ p_RefreshToken As Range, p_accessTokenExpires As Range) 

然后声明你的variables,并将它们设置为范围对象的值:

 Dim ClientId As String Dim ClientSecret As String Dim code As String Dim accessToken As String Dim RefreshToken As String Dim accessTokenExpires As Date ClientId = p_ClientId.value ClientSecret = p_ClientSecret.value code = p_code.value accessToken = p_accessToken.value RefreshToken = p_RefreshToken.value accessTokenExpires = p_accessTokenExpires.value 

注意我改变了你的参数的命名,所以你不必修改你的variables名称。 你当然可以改变这个,如果你想。

还没有真正检查过你的代码,但是在那里可能有一个数据types的问题。 尝试将传入值从“As String”更改为“As Range”,并使用debugging器查看函数内部的值(例如accessToken.Value)。

根据我的经验,将Rangeinput到UDF中是不安全的,因为Excel可以将各种数据types存储在单元格中。 最好从函数内部的范围引用中获取值。 我经过惨痛的教训才学到这个….

祝你好运!