Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA单元格返回“;0“;尽管有价值_Vba_Excel_Google Api_Excel Udf - Fatal编程技术网

Excel VBA单元格返回“;0“;尽管有价值

Excel VBA单元格返回“;0“;尽管有价值,vba,excel,google-api,excel-udf,Vba,Excel,Google Api,Excel Udf,我正在执行一项任务,需要使用Google的oAuth 2.0集成从Excel中获取Google Analytics API的访问令牌 初始请求通过传入客户端id、密钥和身份验证令牌来工作,这些令牌存储在我的工作表的单元格中 我使用的UDF如下所示: Public Function GetGAAuthenticationToken _ (ByVal ClientId As String, _ ByVal Client

我正在执行一项任务,需要使用Google的oAuth 2.0集成从Excel中获取Google Analytics API的访问令牌

初始请求通过传入客户端id、密钥和身份验证令牌来工作,这些令牌存储在我的工作表的单元格中

我使用的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
如上所述,初始请求工作正常,并将访问令牌、刷新令牌和访问令牌到期日期输出到单元格B5、B6和B7中

但是,当我再次运行请求时,我希望B5、B6和B7中的值被传递到我的UDF,它们被传递为“0”。似乎它们在我触发更新和UDF执行之间被重置。有可能得到这些值吗

我遇到了这个页面,它似乎与我试图做的类似,但是它似乎是针对单个字段而不是数组

我在Excel和VBA方面没有任何经验,因此欢迎提供任何帮助


谢谢

将函数更改为使用
范围
参数,而不是字符串/日期参数。引用“B1”的自定义项传递一个
范围
对象

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)
然后声明变量并将其设置为范围对象的值:

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

注意,我更改了参数的命名,因此您不必修改变量名。当然,如果您愿意,您可以更改它。

还没有真正检查您的代码,但其中可能存在数据类型问题。尝试将传入值从“As String”更改为“As Range”,并使用调试器查看函数中的值(例如accessToken.Value)

根据我的经验,将进入UDF的内容键入范围之外的任何内容都是不安全的,因为Excel可以在单元格中存储各种数据类型。最好从函数内部的范围引用中获取值。我通过艰苦的方式学会了这一点


祝你好运

感谢您的评论,我已经尝试了您的建议,不幸的是,我仍然从
AccessToken
refreshtToken
AccessTokenExpires
单元格返回“0”。其他单元格使用您的代码返回其值。。。
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