ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1089|回复: 18

[原创] VB/VBA数组Transpose转置DLL,32位/64位均可用

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-7-9 15:36 | 显示全部楼层 |阅读模式
转置规则:
  1、一维数组转置后为多行一列(列标为1)的二维数组;
  2、多行一列的二维数组转置后为一维数组;
  3、一行多列的二维数组转置后为多行一列的二维数组;
  4、R行C列二维数组转置后为C行R列的二维数组。

特性:
  1、原地转置;
  2、支持Byte, Integer, Long, ..., UDT等所有VB/VBA能定义出的数组;
  3、不限制行列数;
  4、不改变原数据类型;
  5、不改变原上下标;
  6、速度尚可!

不能转置的情形:
  1、空数组(未初始化或不能识别为SAFEARRAY安全数组);
  2、超过2维的数组(只能对1维/2维数组转置);
  3、固定大小的静态数组;
  4、目标数组已被锁定(引用)。

使用方法:
  1、除String数组、包含数组的Variant外,直接使用:
    Call Transpose(ary())
  2、String数组、Variant,先获取数组SAFEARRAY结构地址再使用:
    Call TransposePtr(ArrayPtrV(sArr())) 'String数组
    Call TransposePtr(ArrayPtrV(vArr(1))) '包含数组的Variant

API声明:
API_Declare.png

转置示例:
非String.png

String.png

Var.png

不支持的情形:
不支持.png

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-9 15:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 jz_l 于 2023-7-16 15:35 编辑

DLL及使用示例。。
230716更新,修复了1个Bug。

TransposeAPI_230716.rar

54.83 KB, 下载次数: 23

TA的精华主题

TA的得分主题

发表于 2023-7-9 19:16 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
UnmanagedExports

c#编译的吗?

TA的精华主题

TA的得分主题

发表于 2023-7-9 20:56 | 显示全部楼层
请问原地转置的的意思是?~~目标变量直接转置?

TA的精华主题

TA的得分主题

发表于 2023-7-10 10:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zpy2 发表于 2023-7-9 19:16
UnmanagedExports

c#编译的吗?

UnmanagedExports不是非托管吗?应该是C/C++的吧?记得大佬说过他不用C#的,哈哈

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-7-10 10:56 来自手机 | 显示全部楼层
wodewan 发表于 2023-7-10 10:39
UnmanagedExports不是非托管吗?应该是C/C++的吧?记得大佬说过他不用C#的,哈哈

只搜到一个这个c#

https://www.cnblogs.com/aipeli/p/6196303.html

可以生成非托管的dll

https://club.excelhome.net/forum.php?mod=viewthread&tid=1482161&extra=&mobile=&_dsign=bb547adf
以前写个dll,外挂,全局hook模拟ctr+c,只能c语言注入方式,非常麻烦。本来想是bstr传到dll,在dll里直接处理代码缩进,后来,传入不了,总报错,不行只能vb6从剪贴板读取,然后再vb6格式化,没在dll里处理缩进字符串。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-10 11:15 | 显示全部楼层
morpheus126 发表于 2023-7-9 20:56
请问原地转置的的意思是?~~目标变量直接转置?

原地转置,即尽量不使用额外内存空间,调整原数组内各元素的位置
可以在剩余内存较少的情况下转置较大的数组

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-10 11:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wodewan 发表于 2023-7-10 10:39
UnmanagedExports不是非托管吗?应该是C/C++的吧?记得大佬说过他不用C#的,哈哈

是不会,所以不会用哈

TA的精华主题

TA的得分主题

发表于 2023-7-10 11:31 | 显示全部楼层
jz_l 发表于 2023-7-10 11:17
是不会,所以不会用哈

,本来也想搞个类似的,无奈初学,看的出来大佬对C/C++和VB的数据转换,内存结构很精通啊,有没啥学习资料推荐下。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-10 11:40 | 显示全部楼层
实际上会优先尝试申请额外的内存来进行转置,可用内存不足时才会使用原地转置的方法。
有足够的可用内存总是会更快点。
比如:一个50万行*1000列的Long型数组,占用内存为1.86G
在32位VBA中剩余可用内存不足,就会使用原地转置;
在64位VBA中如果可用内存足够,就会使用额外内存,速度就会快很多。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-21 03:29 , Processed in 0.034863 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表