在 Excel VBA 中解析 JSON

2023-12-01

我有同样的问题Excel VBA:解析的 JSON 对象循环但找不到任何解决方案。我的 JSON 具有嵌套对象,因此建议的解决方案(如 VBJSON 和 vba-json)对我不起作用。我还修复了其中一个使其正常工作,但结果是由于 doProcess 函数的多次递归而导致调用堆栈溢出。

最好的解决方案似乎是原始帖子中看到的 jsonDecode 函数。速度非常快,效率很高;我的对象结构全部位于 JScriptTypeInfo 类型的通用 VBA 对象中。

此时的问题是我无法确定对象的结构是什么,因此,我事先不知道每个通用对象中将驻留的键。我需要循环遍历通用 VBA 对象来获取键/属性。

如果我的解析 javascript 函数可以触发 VBA 函数或子函数,那就太好了。


如果你想建立在ScriptControl,您可以添加一些辅助方法来获取所需的信息。这JScriptTypeInfo对象有点不幸:它包含所有相关信息(正如您在Watch窗口),但用 VBA 似乎不可能得到它。然而,Javascript 引擎可以帮助我们:

Option Explicit

Private ScriptEngine As ScriptControl

Public Sub InitScriptEngine()
    Set ScriptEngine = New ScriptControl
    ScriptEngine.Language = "JScript"
    ScriptEngine.AddCode "function getProperty(jsonObj, propertyName) { return jsonObj[propertyName]; } "
    ScriptEngine.AddCode "function getKeys(jsonObj) { var keys = new Array(); for (var i in jsonObj) { keys.push(i); } return keys; } "
End Sub

Public Function DecodeJsonString(ByVal JsonString As String)
    Set DecodeJsonString = ScriptEngine.Eval("(" + JsonString + ")")
End Function

Public Function GetProperty(ByVal JsonObject As Object, ByVal propertyName As String) As Variant
    GetProperty = ScriptEngine.Run("getProperty", JsonObject, propertyName)
End Function

Public Function GetObjectProperty(ByVal JsonObject As Object, ByVal propertyName As String) As Object
    Set GetObjectProperty = ScriptEngine.Run("getProperty", JsonObject, propertyName)
End Function

Public Function GetKeys(ByVal JsonObject As Object) As String()
    Dim Length As Integer
    Dim KeysArray() As String
    Dim KeysObject As Object
    Dim Index As Integer
    Dim Key As Variant

    Set KeysObject = ScriptEngine.Run("getKeys", JsonObject)
    Length = GetProperty(KeysObject, "length")
    ReDim KeysArray(Length - 1)
    Index = 0
    For Each Key In KeysObject
        KeysArray(Index) = Key
        Index = Index + 1
    Next
    GetKeys = KeysArray
End Function


Public Sub TestJsonAccess()
    Dim JsonString As String
    Dim JsonObject As Object
    Dim Keys() As String
    Dim Value As Variant
    Dim j As Variant

    InitScriptEngine

    JsonString = "{""key1"": ""val1"", ""key2"": { ""key3"": ""val3"" } }"
    Set JsonObject = DecodeJsonString(CStr(JsonString))
    Keys = GetKeys(JsonObject)

    Value = GetProperty(JsonObject, "key1")
    Set Value = GetObjectProperty(JsonObject, "key2")
End Sub

一些注意事项:

  • If the JScriptTypeInfo实例指的是 Javascript 对象,For Each ... Next行不通的。但是,如果它引用 Javascript 数组,它确实可以工作(请参阅GetKeys功能)。
  • 名称仅在运行时才知道的访问属性,请使用以下函数GetProperty and GetObjectProperty.
  • Javascript 数组提供属性length, 0, Item 0, 1, Item 1等等。使用 VBA 点符号 (jsonObject.property),只有 length 属性是可访问的,并且只有当你声明一个名为length全部为小写字母。否则大小写不匹配,就找不到它。其他属性在 VBA 中无效。所以最好使用GetProperty功能。
  • 该代码使用早期绑定。所以你必须添加对“Microsoft Script Control 1.0”的引用。
  • 你必须打电话InitScriptEngine在使用其他函数之前进行一次基本的初始化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Excel VBA 中解析 JSON 的相关文章

  • VBA getelementsbytagname问题

    早上好 我正在尝试提取 HTML 表信息并在 Excel 电子表格上整理结果 我正在使用getelementsbytagname table 0 函数来提取 HTML 表格信息 效果很好 有人可以告诉我这有什么意义吗 0 桌子之后 另外 我
  • 如何使用scrapy获取某人的关注者以及Instagram照片下的评论?

    正如您所看到的 以下 json 包含关注者数量以及评论数量 但是我如何访问每个评论中的数据以及关注者 ID 以便我可以爬取它们 logging page id profilePage 20327023 user biography null
  • twig json_encode 空 json

    我正在从 API 接收元素列表 所有元素的格式都很好 当我使用树枝转储其中一个时 我得到以下信息 Leg 2695 id null reservation null airportStart AIX LES MILLES airplaneT
  • 找不到可接受的代表

    我是 Spring Boot 的新手 我可能会犯一些愚蠢的错误 所以提前对此类问题表示歉意 我正在尝试编写接受以下 JSON 的 POST API id null a 1 3 b somestring mapJson monday 10 0
  • 为什么事件属性不容易获取?

    我有以下代码 HERE https jsfiddle net 5n2zagjc 2 是可编辑的示例 用法 在输入字段中键入并观看控制台 function test event let keys Object keys event let k
  • JSON 数据的动态表单(不同类型)

    我尝试使用 JSON 中的数据在 AngularJS 中创建动态表单 我有这个工作 HTML p p
  • 如何修复在 Excel VBA 中使用查找函数的错误

    我尝试从另一张表中搜索值 而不是使用 FIND 函数 Private Function Search rng As Range FindString As String As Range With rng Set Search Find w
  • 使用 EPPlus 打开客户端 Excel 文件

    我正在编写一个程序 该程序必须在客户端计算机上创建一个 excel 文件 然后在保存并更新该文件后 我需要再次导入它并将更改应用到我的数据库 它的导出部分工作正常 但是当我从 Web 应用程序导入时 我的工作簿中的工作表为零 如果我在我的开
  • 如何通过 HTTP POST 发送充满对象的 NSArray?

    我在 iPhone 端有一个产品 购物清单 由具有名称 product id 等的产品对象组成 我希望将此列表发送到服务器 在那里我将服务器上的列表与 iphone 中的列表进行比较 以合并所做的更改并将合并的列表发送回 iphone 如何
  • django pandas dataframe 下载为 Excel 文件

    我有一个 Django 应用程序 将放置在 Docker 容器中 该应用程序以 Dataframe 格式准备数据 我想允许用户将数据作为 Excel 文件下载到他 她的本地驱动器 我过去使用过 df to excel 但这在这种情况下不起作
  • Soundcloud API 不明确支持 json 分页

    我正在使用的具体示例 http api soundcloud com users dubstep tracks json client id YOUR CLIENT ID http api soundcloud com users dubs
  • 将 Dir 与旧文件后缀一起使用

    最近问的一个question https stackoverflow com questions 68282702包括代码 strFilename Dir fPath xls 它 成功 用于查找以xls and xlsx 我的问题是 为什么
  • 使用 PEG.js 忽略空格

    我想忽略空格 and 新线路按照我的语法 所以它们在PEG js http pegjs majda cz online输出 此外 括号内的文字应在新数组中返回 Grammar start a sep cat dog sep sep stmt
  • 不破坏“$ref”引用的 JSON 树修改

    问题与 JSON 相关 它是序列化的结果保留引用处理 set to 保留ReferencesHandling Objects 我正在寻找巧妙的方法来修改 JSON 树的分支 特别是删除或替换分支 以便引用处理不会被破坏 考虑以下 JSON
  • VBA 使用 Like 运算符删除行

    简单的事情并不简单 我试图根据具有以 2L 开头的数据的特定列删除行 所以我写了这段代码 LastRow可以理解 Sub Cleanup For i 1 To LastRow If Range F i Like 2L Then Rows i
  • VBA中如何四舍五入到小数点后两位?

    在单元格 B2 中 在进行计算之前 我的变量值为 297 123 在 VBA 中 我想将其四舍五入为 297 12 请参阅下面的代码了解我的尝试 两者都将燃油评估为 297 我做错了什么 Dim fuel As Integer Dim li
  • 如何从 500 个 .xls Excel 文件中的单元格中获取数据?

    我想问你如何从许多Excel中的几个确定的 并且总是相同的 单元格中获取数据 xls文件 即我有一个清单 xls文件位于一个文件夹中 每个文件内部都有相同的表 但具有不同的值 我想从以下位置获取数据A1 C2 E3从文件夹中的所有文件中提取
  • HTML 和 BeautifulSoup:当结构事先不知道时如何迭代解析?

    我从一个简单的 HTML 结构开始 如下所示 感谢 alecxe 的帮助 我能够创建这个 JSON 字典 u Outer List u Inner List u info 1 u info 2 u info 3 使用他的代码 from bs
  • 合法 .xlsx 文件上的 openpyxl load_workbook() 会导致 zipfile.BadZipFile 错误

    我试图做的是将数据帧数据附加到现有的合法 Excel 文件中 我使用了 openpyxl 中的 load workbook 函数 但它系统地返回错误 这是一些在我的机器上崩溃的代码 from openpyxl import load wor
  • dump() 缺少 1 个必需的位置参数:python json 中的“fp”

    我正在尝试美化 json 格式 但收到此错误 import requests as tt from bs4 import BeautifulSoup import json get url tt get https in pinterest

随机推荐

  • SessionTimeout:web.xml 与 session.maxInactiveInterval()

    我正在尝试超时Http会话在爪哇 我的容器是WebLogic 目前 我们的会话超时设置为web xml文件 像这样
  • 当我在 Web 编辑器中键入空格时,如何阻止 Visual Studio 2013 跳出引号?

    当我输入属性值并按空格键时 它会自动跳转到下一个属性 我想这在输入 id 或其他内容时是有意义的 但在输入具有多个类的类属性时确实很烦人 有谁知道改变这种行为的方法 您描述的行为是 IntelliSense 自动列出成员 功能的一个功能 您
  • 如何将 Chrome 扩展添加到 django-cors-headers 白名单?

    我正在创建一个 Chrome 扩展 允许用户 POST 到 Django 服务器 目前 我正在使用 django cors headers 并设置 CORS ORIGIN ALLOW ALL True 允许我的扩展 POST 到指定的端点
  • Spring有没有更简单的异常处理技术?

    我已经阅读了有关使用 ExceptionHandler 的基于控制器的异常 我已经阅读了有关使用 ControllerAdvice 进行全局异常处理的内容 我还阅读了有关扩展 HandlerExceptionResolver 以进行更深入的
  • 使用“lm()”进行线性回归:聚合预测值的预测区间

    我在用着predict lm fit newdata newdata interval prediction 获取新观测值的预测及其预测区间 PI 现在 我想根据附加变量 即单个家庭预测的邮政编码级别的空间聚合 对这些预测及其 PI 进行聚
  • 错误:转发端口:升级连接时出错:需要升级请求

    有谁见过这个错误Error forwarding ports error upgrading connection Upgrade request required in 库伯内斯 我以前见过这个 有几个问题需要解决 代理请求的 Nginx
  • 如何计算第二列中逗号分隔的总和

    sm agg Group 1 x 1 1001 8 2 1002 16 8 3 1003 8 4 1004 16 5 1005 5 33333333333333 8 6 1006 4 7 1007 4 8 1008 4 9 1009 5 3
  • 如何将文本拆分为单词?

    如何将文本拆分为单词 示例文本 噢 你没办法 猫说 我们都疯了 我生气了 你疯了 该行的字是 Oh you can t help that said the Cat we re all mad here I m mad You re mad
  • 为什么我必须添加Lombok插件,为什么添加依赖还不够

    我很好奇为什么我必须添加Lombok插入 为什么要添加依赖pom xml是不够的 例如Mockito 龙目岛是一个所谓的注释处理器 Mockito 只是 一个常规的 Java 库 注释处理器 定义可在 Java 代码中使用的注释 以及 当使
  • 如何在本机应用程序中处理 chrome.runtime.sendNativeMessage()

    我正在本地消息传递主机上工作 我可以使用 api 启动我的自定义应用程序 var port chrome runtime connectNative com my company my application 我可以使用 api 将消息发布
  • 通过插件命令替换 Eclipse 编辑器中选定的代码

    如何在 Eclipse 编辑器中替换选定的代码部分 通过鼠标选择选择 并仅在 selected text 通过插件 我已经设计了一个插件来在工具栏中创建一个按钮 当我单击它时 我需要它来更改所选的文本并将其放入 尝试这个片段 它应该给你足够
  • C++ 标准是否要求升级为 int?

    采取以下代码片段 short int a b 30001 c 30002 d 30003 a b c d 假设short int是16位 int是32位 这是 C 中未定义的行为吗 我对C标准的解读是b和c都必须提升为int 因此整个计算必
  • 在 VSCode 中自动在列处硬换行

    如何在 VSCode 中自动换行 我的意思是 如果一行到达指定的列 则会自动在最接近该列的单词边界处插入换行符 而不会越过 Vim 有一个设置叫做文本宽度我在编辑 Markdown 时喜欢使用它 据我所知 VSCode 似乎没有这样做 它只
  • 如何禁用 WPF 图像?

    我需要一个禁用时呈灰色的图像 IsEnabled False 可以通过将 BitmapImage 读入 FormatConvertedBitmap 来生成图像的灰色版本 如下所示here 我已经能够使用 UserControl 来实现此功能
  • 我应该如何在 Perl 中使用“my”关键字?

    我不断看到my在线示例 Perl 脚本中变量名前面的关键字 但我不知道它的含义 我尝试阅读手册页和其他在线网站 但鉴于我所看到的使用方式与手册之间的差异 我很难辨别它的用途 例如本文中用于获取数组长度的 在 Perl 中查找数组的大小 但说
  • 如何在 SQL Server 2008 中查看事务日志 [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要查看数据库的事务日志SQL Server 2008为了找到删除事务并希望将其回滚 不幸的是 我不知道从哪里开始 而且我发现很难确定哪些是goo
  • 在鼠标悬停时显示 DIV

    On mouseover这个 div 可以附加到鼠标指针 以便其内容在鼠标悬停时显示吗 div style display none div 如果是的话 这是如何完成的 div abc div div that s abc div
  • UIView 动画期间的键值观察

    我正在程序中为视图的中心属性设置动画 在动画过程中 当中心达到特定值时我需要通知 我尝试将自己添加为视图中心属性的键值观察者 但是 我只有在动画开始时才会收到通知 所以我无法检测物体是否 何时通过我的兴趣点 有没有办法通过 KVO 或任何其
  • 当键盘处于活动状态时,UITextView 自动大写功能不起作用

    目前 我正在像这样的按钮目标中设置自动大写 This method is fired when keyboard is still active IBAction changeAutoCapitalization id sender sel
  • 在 Excel VBA 中解析 JSON

    我有同样的问题Excel VBA 解析的 JSON 对象循环但找不到任何解决方案 我的 JSON 具有嵌套对象 因此建议的解决方案 如 VBJSON 和 vba json 对我不起作用 我还修复了其中一个使其正常工作 但结果是由于 doPr