ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 大灰狼1976

[分享] 【CopyMemory】截取数组的一部分赋值给另一个数组

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-8-15 09:35 | 显示全部楼层
自适应
  1. Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

  2. Sub test()   '//数组部分复制
  3.     Dim arr, brr, i&, j&
  4.     arr = [a1:d30]
  5.     ReDim brr(1 To 20, 1 To 2)
  6.     '取第2~3列的第11~20行数据给brr数组
  7.    
  8.     sArch = LCase(Environ("PROCESSOR_ARCHITECTURE"))
  9.     If sArch = "amd64" Then     ' 对于64位Office,检查PROCESSOR_ARCHITECTURE是否为amd64
  10.         num = 24
  11.     ElseIf sArch = "x86" Then   ' 对于32位Office,检查PROCESSOR_ARCHITECTURE是否为x86
  12.         num = 16
  13.     End If
  14.    
  15.     For i = 1 To 2
  16.         CopyMemory brr(1, i), arr(11, i + 1), 20 * num '单元格数组每个元素占24个字节
  17.     Next i
  18.     [f1].Resize(20, 2) = brr
  19. End Sub

复制代码

32位和64位系统。

TA的精华主题

TA的得分主题

发表于 2024-8-15 09:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
仰望中,谢谢分享!

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-15 09:37 | 显示全部楼层
我公司里也是64位,下班后家里的32位测试一下,谢谢了

TA的精华主题

TA的得分主题

发表于 2024-8-15 10:01 | 显示全部楼层
我都不敢用CopyMemory,老把程序干死机,有时候文件还莫名丢失了

TA的精华主题

TA的得分主题

发表于 2024-8-15 10:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ykcbf1100 发表于 2024-8-15 09:35
自适应
32位和64位系统。

请教一下,抬头的API定义是不是要加上#IF VBA7 THEN...

TA的精华主题

TA的得分主题

发表于 2024-8-15 10:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-8-15 10:10 | 显示全部楼层
tspliu 发表于 2024-8-15 10:01
我都不敢用CopyMemory,老把程序干死机,有时候文件还莫名丢失了

要胆大心细,了解了长度就不会干死∏了。

TA的精华主题

TA的得分主题

发表于 2024-8-15 10:20 | 显示全部楼层
morpheus126 发表于 2024-8-15 10:05
请教一下,抬头的API定义是不是要加上#IF VBA7 THEN...
  1. #If VBA7 Then
  2.     ' 64位和32位兼容的声明
  3.     Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
  4. #Else
  5.     ' 仅32位的声明
  6.     Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
  7. #End If

  8. Sub test()   '//数组部分复制
  9.     Dim arr, brr, i&, j&
  10.     arr = [a1:d30]
  11.     ReDim brr(1 To 20, 1 To 2)
  12.     '取第2~3列的第11~20行数据给brr数组
  13.    
  14.     sArch = LCase(Environ("PROCESSOR_ARCHITECTURE"))
  15.     If sArch = "amd64" Then     ' 对于64位Office,检查PROCESSOR_ARCHITECTURE是否为amd64
  16.         num = 24
  17.     ElseIf sArch = "x86" Then   ' 对于32位Office,检查PROCESSOR_ARCHITECTURE是否为x86
  18.         num = 16
  19.     End If
  20.    
  21.     For i = 1 To 2
  22.         CopyMemory brr(1, i), arr(11, i + 1), 20 * num '单元格数组每个元素占24个字节
  23.     Next i
  24.     [f1].Resize(20, 2) = brr
  25. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-8-15 10:23 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-8-15 13:33 | 显示全部楼层
  1. Sub test_2()
  2. '一维数组转为二维
  3. Dim arr(9) As Byte, brr(1 To 5, 1 To 2) As Byte, i&
  4. For i = 0 To 9
  5.   arr(i) = i
  6. Next i
  7. CopyMemory brr(1, 1), arr(0), 10 '到这里没问题
  8. '[i1].Resize(5, 2) = brr ' byte数组好像不能直接输出到单元格区域
  9. End Sub
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-4 00:57 , Processed in 0.055429 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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