ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 公共变量如何定义? 数组如何调用?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-6-13 21:20 | 显示全部楼层 |阅读模式
本帖最后由 664094991 于 2019-6-14 08:48 编辑

复制代码

01.png

测试.zip

13.04 KB, 下载次数: 20

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-14 09:23 | 显示全部楼层
micch 发表于 2019-6-14 09:10
我也不知道理解的对不对,简单说一下。

定义了一个公共变量,数组和常量。

对,就是这个意思!
首先是一个赋值过程,赋值给变量和数组,赋值以后他们的值已经固定。后面的过程不会再对他们赋值,但会调用他们。
我想要这样的效果,但是调用时数组会提示下标越界,变量也会成空值
怎么解决啊 ?

感谢感谢!!

TA的精华主题

TA的得分主题

发表于 2019-6-14 10:04 | 显示全部楼层
664094991 发表于 2019-6-14 09:23
对,就是这个意思!
首先是一个赋值过程,赋值给变量和数组,赋值以后他们的值已经固定。后面的过程不会 ...

赋值以后就固定不变,这个没关系,反正不影响调用。

调用时下标越界,变量a是空值,你可以查看是不是没有赋值。因为arr和a如果是空值,引用时会出现下标越界。

所以问题可能出在没有赋值上,调用公共变量的语句,必须在赋值语句之后,所以在调用前call一下赋值的子过程1.

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-6-14 11:01 | 显示全部楼层
尽可能不要使用公共全局变量,除非是常量,公共全局变量与过程是无耦合状态,
  1. Sub cs1_a(ss() As Variant, lastRow As Long, shName As String)
  2.     '过程:获取指定工作表列数据
  3.     '参数:ss()动态数组,接收返回的数组
  4.     '参数:lastRow,接收返回的指定列最大行数
  5.     '参数:shName,要操作的工作表名
  6.    
  7.     Dim sh As Worksheet
  8.     Dim i As Long
  9.    
  10.     '某种操作
  11.     Erase ss '结果数组初始化
  12.     Set sh = Sheets(shName) '实例化要操作的工作表
  13.     lastRow = sh.Range("a65536").End(xlUp).Row '某列的最大非空行
  14.     ReDim ss(1 To lastRow) As Variant '重新定义数组
  15.    
  16.     '数组赋值
  17.     For i = 1 To lastRow
  18.         ss(i) = sh.Cells(i, 1) '不要直接使用没有工作表前缀的Calls操作,容易出错
  19.     Next i
  20.     Set sh = Nothing '释放对象
  21.    
  22. End Sub

  23. Sub cs2_main()
  24.     '主过程
  25.     Dim ss() As Variant
  26.     Dim shName As String        '要操作的工作表名
  27.     Dim lastRow As Long         '接收数组最大下标
  28.     Dim i As Long
  29.    
  30.     '......
  31.     shName = "sheet1"           '要操作的工作表名
  32.     Call cs1_a(ss, lastRow, shName)
  33.     '后续操作
  34.     For i = 1 To lastRow
  35.         ss(i) = ss(i) * 2 '操作返回的结果数组
  36.     Next i
  37.     '......
  38. End Sub
复制代码
变化容易失控。应该用传递参数的方式来完成你期望的操作。

一个传递参数的例子:

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 21:31 | 显示全部楼层

求大佬们指点一下:
1、在两个子过程中都有变量a,而且重复赋值,有没有别的方法简化?
2、如何在cs2 中调用cs1 的数组arr()?

TA的精华主题

TA的得分主题

发表于 2019-6-13 21:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
arr() 已经声明过公共变量了,在后面的过程中又重复声明,结果是前面声明的公共变量不起作用了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 21:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
maditate 发表于 2019-6-13 21:35
arr() 已经声明过公共变量了,在后面的过程中又重复声明,结果是前面声明的公共变量不起作用了。

大哥,不是这个原因,刚才重新编辑了

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 21:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
都没人看么?大哥们帮帮忙

TA的精华主题

TA的得分主题

发表于 2019-6-13 21:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 ivccav 于 2019-6-13 22:01 编辑


能帮你只有这么多了
  1. Public arr, a%

  2. Sub cs1()
  3.     a = Range("A" & Rows.Count).End(3).Row
  4.     arr = Range("a1:a" & a) '生成的必定是二维数组
  5. End Sub

  6. Sub cs2()
  7.     Dim ss()
  8.     Call cs1
  9.     ReDim ss(1 To UBound(arr), 1 To 1)
  10.    For i = 1 To UBound(arr)
  11.         ss(i, 1) = arr(i, 1) * 2
  12.    Next
  13. End Sub

复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 22:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ivccav 发表于 2019-6-13 21:59
能帮你只有这么多了

感谢热心回复,但是好像还是不行,变量a重复定义赋值的问题不是你说的这种解决方法,另外数组还是会提示下标越界

TA的精华主题

TA的得分主题

发表于 2019-6-13 22:15 | 显示全部楼层
没看懂,啥意思,一个过程给arr赋值,另一个过程想直接引用arr?

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-13 22:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
micch 发表于 2019-6-13 22:15
没看懂,啥意思,一个过程给arr赋值,另一个过程想直接引用arr?

对 ,是这个意思,这样 能不能行?

TA的精华主题

TA的得分主题

发表于 2019-6-13 22:25 | 显示全部楼层
664094991 发表于 2019-6-13 22:16
对 ,是这个意思,这样 能不能行?

我也是初学,刚测试了一下,定义公共变量,数组可以直接定义固定大小,然后一个过程给数组循环赋值,另一个过程可以直接引用数组,而不需要call过程。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-25 18:21 , Processed in 0.037710 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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