ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-6-14 07:46 来自手机 | 显示全部楼层
664094991 发表于 2019-6-13 22:05
感谢热心回复,但是好像还是不行,变量a重复定义赋值的问题不是你说的这种解决方法,另外数组还是会提示 ...

不懂别装懂。你首先要有把问题说清楚的能力(目前看来你不具备这种能力,不知是不是基础太差的原因),其次你得有附件

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-14 08:50 | 显示全部楼层
micch 发表于 2019-6-13 22:44
呃,直接运行test2,结果都是空值,很正常啊,定义了变量不赋值,当然变量是空值啊,公共变量也得赋值啊 ...

感谢热心回复 ,我重新编辑了,你看看我上传的文字说明吧。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-14 08:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
renkangjizhen 发表于 2019-6-14 05:38
到底想达到啥目的?把诉求说明白,大家才能帮你!你是对引用二维数组的值的方法不明白,还是对引用公共变量 ...

感谢热心回复 ,我重新编辑了,你看看我上传的文字说明吧。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-14 08:53 | 显示全部楼层
ivccav 发表于 2019-6-14 07:46
不懂别装懂。你首先要有把问题说清楚的能力(目前看来你不具备这种能力,不知是不是基础太差的原因),其次 ...

有附件了的 ,麻烦下载看看, 另外我重新编辑了,你看看我上传的文字说明吧。

TA的精华主题

TA的得分主题

发表于 2019-6-14 09:10 | 显示全部楼层
本帖最后由 micch 于 2019-6-14 09:17 编辑
664094991 发表于 2019-6-14 08:50
感谢热心回复 ,我重新编辑了,你看看我上传的文字说明吧。

我也不知道理解的对不对,简单说一下。

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

你想在多个过程中调用,但是这两个变量的值需要一个过程来赋值。那么你就需要运行赋值的子过程1,否则直接运行调用公共变量的过程,公共变量还没赋值就是空值。

所以执行任意子过程之前需要调用一次赋值的子过程,这样公共变量才是有值的。然后再执行任意子过程时,公共变量都是有值的,并且在子过程2执行时改变了公共变量的值,在子过程3执行时调用的公共变量的值就是子过程2改变后的值。

如果子过程2没对公共变量进行改变,那么子过程3调用时值还是赋值过程对公共变量赋值的结果。

执行程序肯定有个先后,如果想第一个执行子过程2,那么公共变量还没有赋值,所以需要call子过程1进行赋值,之后执行子过程3,4,5等等就不需要再call了。

如果你只有两个过程,那就不用麻烦了,合一个过程吧。如果有很多过程,如果每个过程都是单独执行,互不联系,那么每个过程执行前都需要call子过程1,赋值,然后再执行本过程。如果是很多过程一起执行,那么保证执行的顺序,第一个是子过程1赋值,后面不需要call了。如果执行顺序里没有子过程1,那么执行的第一个子过程需要加call子过程1的步骤

TA的精华主题

TA的得分主题

发表于 2019-6-14 09:18 | 显示全部楼层
664094991 发表于 2019-6-13 22:05
感谢热心回复,但是好像还是不行,变量a重复定义赋值的问题不是你说的这种解决方法,另外数组还是会提示 ...

1、我看了你代码,下标出界是指ss这个数组出界,你没有定义任何数组元素,你的代码:
    Dim ss()
    a = Range("A" & Rows.Count).End(3).Row
    Call cs1
    For i = 1 To UBound(arr)
         ss(i) = arr(i) * 2         '这个地方明显不行
    Next

2、定义公共变量用public,你定义的没问题。把你的代码修改下就可以通过了
    Dim ss()
    ReDim ss(1 To a)      ’这里的a会使用cs1过程里设定的参数值
    Call cs1
    For i = 1 To UBound(arr)
         ss(i) = arr(i) * 2
    Next

TA的精华主题

TA的得分主题

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

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

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

感谢感谢!!

TA的精华主题

TA的得分主题

发表于 2019-6-14 10:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
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-14 11:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lipton 发表于 2019-6-14 11:01
尽可能不要使用公共全局变量,除非是常量,公共全局变量与过程是无耦合状态,变化容易失控。应该用传递参数 ...

非常感谢您的热心回复!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 07:43 , Processed in 0.036433 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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