Office 板


LINE

Function abc(X As Range) Dim XR As Integer, XC As Integer XR = X.Row XC = X.Column abc = Application.Average(Range(Cells(XR - 2, XC), Cells(XR, XC))) 我发现他不会自动重算! 在活页F10输入abc(E10) 他会计算E8:E10的平均 可是更动E8或E9的数值 他不会自动重算! 只有更改E10 或F10重新输入 才会自动重算 即使按 立即重算 也不会重算 修改资料 但公式不会重算…… 在这简单案例中 我知道直接拉公式比较快 但我的资料计算很复杂 公式会打一堆 一更动就很难维护 要怎麽做比较好呢? --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.239.149.248 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Office/M.1618317619.A.BC2.html
1F:→ rafaiero: 是否使用储存格变动方式,会比较适合? 04/13 21:21
是说乖乖在储存格打公式吗?我是把公式拆成两格计算
2F:→ soyoso: 加上 application.volatile 04/13 21:52
这个就可以自动重算,但其他无关的变化,也会让这个公式重算? 如果这个公式用太多,可能会很慢?
3F:→ soyoso: 任何储存格变更值时,就会重新计算。也因会重新计算,因此 04/14 10:53
4F:→ soyoso: 频繁的变更值下有可能感觉效能不好。 04/14 10:53
5F:→ soyoso: 回文写"使用储存格变动方式"来看,应该是触发事件 04/14 11:09
6F:→ soyoso: worksheet_change,执行application.calculatefull,不要 04/14 11:09
7F:→ soyoso: 储存格变更值就执行重新运算的动作,就写个判断来限缩执行 04/14 11:09
8F:→ soyoso: 动作的范围 04/14 11:09
在这例子,「事件」可能比 application.volatile 还要差? 限定范围是在公式写 if 范围内有变动 就重算 吗?这个程式码应该怎麽写呢? 另一种方法,我已经把excel公式拆成两格,那就写两个自订公式,公式搬进VBA就好 至少维护不用担心公式跑掉,也会自动重算
9F:→ soyoso: 有限缩触发事件范围的话,不会 04/14 14:19
10F:→ soyoso: 限缩不是写在公式function内,而是触发事件内 04/14 14:19
11F:→ soyoso: 看要range.row、range.column、range.address或是 04/14 14:19
12F:→ soyoso: intersect 04/14 14:19
我想了一下,在我的情境,这样写法跟原本差不多@@现在卡在另一个 Function bcd(X As Range) XR = X.Row XC = X.Column y1 = X * 2 y2 = X * 3 bcd = y1 Cells(XR, XC + 2) = y2 是否无法这样写,只能sub然後 Set X = Application.InputBox(prompt:="输入X的储存格", Type:=8) 用sub似乎就没那麽多问题,可是好像只能一个一个做,大量资料就要用阵列?
13F:→ soyoso: 不要一个一个做的话,也可以回圈,取出自订函数bcd括号内 04/15 11:10
14F:→ soyoso: 的储存格字串range.formula 04/15 11:10
Range.Formula类似「拉公式」?回圈我会好好想
15F:推 waiter337: 我给个特别操作 04/15 15:32
16F:→ waiter337: Function abc(X As Range) 04/15 15:32
17F:→ waiter337: Dim XR As Integer, XC As Integer 04/15 15:32
18F:→ waiter337: XR = X.Row + 2 04/15 15:32
19F:→ waiter337: XC = X.Column 04/15 15:33
20F:→ waiter337: abc = Application.Average(Range(Cells(XR - 2, XC), 04/15 15:33
21F:→ waiter337: Cells(XR, XC))) 04/15 15:33
22F:→ waiter337: End Function 04/15 15:33
23F:→ waiter337: 然後 04/15 15:33
24F:→ waiter337: 储存格F10 =abc(E8:E10) 04/15 15:34
这个方法确实可行,但我不太懂为何他只有一个range,而且是第一个的range 如果要保留3个range,是否要用阵列?
25F:→ waiter337: 不过还是给建议 别用这种方法 04/15 15:35
26F:→ waiter337: 像s大的建议一样 既然都用vba 就别在储存格工作表上用 04/15 15:35
27F:→ waiter337: 自订函数了 04/15 15:35
28F:→ waiter337: 其实自订函数是个很肌肋的功能 04/15 15:36
29F:→ waiter337: 写了vba三年多 自订函数的功能 也只有今天用上而已 04/15 15:37
30F:→ waiter337: 使用率其实非常低 而且就如同s大所说的 04/15 15:37
31F:→ waiter337: 你现在会卡死不能变更储存格规划好的位置 04/15 15:38
32F:→ waiter337: 就是因为你用vba 又套 储存格公式 所才变得碍手碍脚 04/15 15:39
33F:→ waiter337: 建议直接往纯vba的方向靠拢 04/15 15:39
34F:→ waiter337: 另外这段我自身也有经历过 04/15 15:40
35F:→ waiter337: 要改成纯vba操作反而很快 yt线上课程看看 一星期就能 04/15 15:40
36F:→ waiter337: 整个习惯改变成功 并且vba套储存格函数 很容易出现 04/15 15:41
37F:→ waiter337: 未知的bug 并且更容易出错 比如你这次碰上的状况 04/15 15:41
38F:→ waiter337: 其实还有3~5种你还没碰到=,= 我都碰过 04/15 15:42
39F:→ waiter337: 山不转路转 祝你顺利 04/15 15:42
因为我的资料满复杂的,而且格式也还没确定,自订函数好处是很好挪,用VBA写要先规 划好?我的阵列跟回圈要想很久,之前写两三个都是卡很久才成功运作@@ 我公式的x要输入4个,x1 x2 x3 x4,输出的y可以有5种,5种y的算式大多相同,少部份 是正负号相反,乘法变除法。之前写自订函数,真的就拆成5个公式,y1公式y2公式... 现在是用一个公式,然後多一个x5,x5输入y1y2...得到对应的y。 有时候5种y都要用到,等於很多运算都是重复的,这就应该写成sub?写到一半发现我只 是只是把function从活页搬进sub而已...计算还是一样大量重复,如果把原公式输入进 去,程式码就会变得很多行,看起来怪怪的,这反而是正常? 这篇格子问题,其实就是不知道怎麽处理这个问题,function可以一次算5种y,可是只 能输出一个y,sub可以输出多个,但输入就不能用拉的,好像要用回圈?我还没想通, 放假要好好想想怎麽做。
40F:推 waiter337: 你汇入的范围 就属於触发的范围 没有这样设定 04/16 16:57
41F:→ waiter337: 当你操作了其他储存格 他并不会触发 04/16 16:57
这个问题是:输入E8到E10,为何VBA这边只会保留一个格子,而非三个,而且这个格子 是E8而不是E10或E9。之前我有问另一个很像的,一连串的格子,大於0的有很多个,要 找出最後一个大於0的数值,我弄出来都是第一个,而soyoso的解法,我觉得很讶异,到 现在还是觉得怪怪的,应该有别的方法。
42F:→ waiter337: 顺便回复你的回答 04/16 16:58
43F:→ waiter337: 这种情况就是美丽的误会 04/16 16:58
44F:→ waiter337: 因为就是人会有禀赋效应 04/16 16:59
45F:→ waiter337: 所以更难看清 未来如果拥有了更新的技术 会发生甚麽事 04/16 16:59
46F:→ waiter337: 而我们已经完全用vba的人 其实以前也是很喜欢用储存格 04/16 17:00
47F:→ waiter337: 但正是因为 当时被储存格公式虐到过一次大条的 04/16 17:01
48F:→ waiter337: 所以就靠拢纯vba 才发现纯vba很好用 04/16 17:01
49F:→ waiter337: 依照你目前的例子 其实换作用纯vba操作的人来判断 04/16 17:02
50F:→ waiter337: 反而会觉得你目前的做法 是更复杂更难的 04/16 17:02
51F:→ waiter337: 反之若一直不尝试靠拢过来 就会永远不知道那份感觉 04/16 17:05
52F:→ waiter337: 不然站内 可以帮你看看怎麽规划解决 04/16 17:06
53F:→ waiter337: 如果真的要给条界线 04/16 17:07
54F:→ waiter337: 大概如下 一个过程 资料>运算>结果 算一阶 04/16 17:08
55F:→ waiter337: 如果你的结果是必须要达到3阶以上的状态才能得到 04/16 17:08
56F:→ waiter337: 那麽vba才会是好的方向 因为不知道未来还有多远的运用 04/16 17:09
57F:→ waiter337: 如果当下只有小范围1~2阶段 那就用公式函数解决 04/16 17:09
58F:→ waiter337: 另外 储存格公式的档案 就整个都用储存格公式 别用vba 04/16 17:10
59F:→ waiter337: 反之用vba巨集 就单纯用vba巨集 别用储存格公式 04/16 17:11
60F:→ waiter337: 这两者混用 基本上就是冲突的开始 04/16 17:11
简单的自订函数,我想还是可以啦,我看过一个老档案,他一个统计学的公式,写了一 大串,连Pi=3.14...居然要写成Const放在最前面。现在excel已经有内建这些公式了 资料最低阶的处理,我已经做出来了,用VBA算是节省效能和练习写程式吧 但是再高阶的应用,碍於我的数学程度,还没想清楚要怎麽弄出来,目前想到的做法,运 算量不小,但最搞笑的是,我不知道这样计算是否正确,也不知道如何验算答案...
61F:→ waiter337: 另外储存格阵列 跟 vba阵列是不太相同的做法 04/16 17:14
62F:→ waiter337: 我无法判断你说的阵列是哪种 但我觉得建议别在这里用 04/16 17:14
63F:→ waiter337: 先学vba的一般阵列会比较好 04/16 17:14
64F:→ waiter337: 最後给你个愿景八 如果你开始往vba靠拢 一键解决是没问 04/16 17:17
65F:→ waiter337: 题的 一个按钮就搞定这样 04/16 17:17
目前的规划:从网路抓csv档,转置excel,输入vba并计算,输出excel,人工选取需要的 资料并存在excel。是否需要csv直通vba不经过excel呢? 目前我卡在阵列: Option Base 1 Sub testar2() Dim i As Integer, j As Integer, ar(5, 4) As Integer For i = 1 To 5 For j = 1 To 4 ar(i, j) = i * j Next Next Range("A6").Resize(5, 4) = ar 二维阵列没问题 Sub testar() Dim i As Integer, ar(5) As Integer For i = 1 To 5 ar(i) = i ^ 2 Next Range("A6").Resize(5, 1) = ar End Sub 一维阵列这样只会得到5个1,好奇怪 Range("A6").Resize(1, 5) = ar 数值正常,但他是横的,要如何变成直的? 另外我的阵列输入这样写对吗?输入B2:B11 For i = 1 To 10 ar(i) = Range("B" & i + 1) --- ar = Range("B2:B11") 我本来是这样写,但跑不出来...看网路范例都这样呀?
66F:→ soyoso: 转置,worksheetfunction.transpose(ar) 04/17 11:08
67F:→ soyoso: 要ar = Range("B2:B11")不以回圈的话 04/17 11:12
68F:→ soyoso: 宣告dim ar或dim ar as variant 04/17 11:12
用回圈跟不用,两者哪个比较好呢?不用回圈的,就会变成二维阵列? 运算式本来写 ar(i)=ar(i)*2 变成 ar(i,1)=ar(i,1)*2 不能写ar=ar*2? 如果输入100列2栏,输出3栏,我是把每1栏都写成1个一维,总共5个 是否写成输入阵列(100,2),和输出阵列(100,3),这样比较好? 或是直接一个阵列(100,5)就好了?那这个的输出写法是 Range("C2").Resize(100,1) = ar(100,3) Range("D2").Resize(100,1) = ar(100,4) Range("E2").Resize(100,1) = ar(100,5) ?这三行写成一行有办法吗?或是分成输入输出阵列 Range("C2").Resize(100,3) = ar2
69F:→ soyoso: 我先回原po回文「还有"soyoso的解法,我觉得很讶异,到现 04/17 14:08
70F:→ soyoso: 在还是觉得怪怪的,应该有别的方法。"」 04/17 14:08
71F:→ soyoso: 哪个解法?请提出,如果指range.formula,我并没有回文写 04/17 14:08
72F:→ soyoso: 这是拉公式 04/17 14:08
那个例子是这篇 #1WBA_rjh 。拉公式是我的理解
73F:→ soyoso: 原po回文写"sub似乎就没那麽多问题,可是好像只能一个一个 04/17 14:08
74F:→ soyoso: 做" 04/17 14:08
75F:→ soyoso: 我写了"不要一个一个做的话,也可以回圈,取出自订函数bcd 04/17 14:08
76F:→ soyoso: 括号内储存格字串range.formula" 04/17 14:08
77F:→ soyoso: 要如何取得储存格字串,就以range.formula,为什麽要取得 04/17 14:08
78F:→ soyoso: 这个公式,因为括号内有储存格字串 04/17 14:08
79F:→ soyoso: 有这个字串可以干嘛,就可以回圈执行Cells(XR, XC + 2) = 04/17 14:08
80F:→ soyoso: y2这个动作,只不过用的是range 04/17 14:08
81F:→ soyoso: 接着回12:20:07的回文 04/17 14:08
82F:→ soyoso: 两个哪个比较好?以实际资料自行测试就会知道了。 04/17 14:08
我只有简单测试。本来用一维写了几十列,改成二维有点麻烦,就没直接试。之前在图 书馆看书时,提到 Range("A1").Resize(i,j) = ar 优於 在回圈内 cells(i,j) 放入阵列值(i,j) (应该是吧?) 但在这问题,是两三个阵列好,还是一个好,似乎差不多?
83F:→ soyoso: 要一维的话,一样转置,同上回文写法,改转置储存格范围 04/17 14:08
84F:→ soyoso: 可以一起写,用application.index的方式 04/17 14:08
85F:→ soyoso: 要每栏写成1个一维或是二维(维度下限大小的不同)就看哪个 04/17 14:08
86F:→ soyoso: 原po目前所知且是可以达成要的结果,就以该方式达成 04/17 14:08
application.index用法查网路看不太懂@@ 如果其他差不多,维度我觉得一栏一个一维打法比较简单,二维(i,1)跟(i,2)代表哪栏, 需要另外记名字,一维就有自己的名字。
87F:→ soyoso: 回文"那个例子是这篇 #1WBA_rjh",所以哪里怪了,函数有函 04/17 17:24
88F:→ soyoso: 数的特性,怪在哪?又不可能每个函数都相同 04/17 17:24
如果是vba阵列,直觉是用UBound查最後一个 刚刚我试了後,发现卡在如何筛选不要的元素 囧
89F:→ soyoso: 我还是同04/17 14:08回文"看哪个原po目前所知且是可以达成 04/17 17:24
90F:→ soyoso: 要的结果,就以该方式达成。" 04/17 17:24
91F:→ soyoso: 原po觉得一栏一个一维打法比较简单,且这方面可以理解,又 04/17 17:24
92F:→ soyoso: 可以达成要的结果,那就以该方式达成;那要问两三个阵列好 04/17 17:24
93F:→ soyoso: ,还是一个好,这要看实际资料和实际要执行的动作来测试, 04/17 17:24
94F:→ soyoso: 有测试才有数据,才能说这二则之间,"差不多"的程度是否是 04/17 17:24
95F:→ soyoso: 原po可以接受的,毕竟"差不多"本身是因人而异的不是吗? 04/17 17:24
其实我也不知道怎麽测试,有的速度差异很明显,这种我想看不出来 刚刚想了一下,如果阵列用回圈输出到活页,比较没效率,那麽活页用回圈输入到阵列, 应该也不好。那麽一栏一个二维阵列,似乎比较好?因为只有二维阵列可以一次输入
96F:→ soyoso: 筛选最後一笔符合的话,回圈反序step 负数,判断,符合时跳 04/17 20:24
97F:→ soyoso: 出回圈 04/17 20:24
居然这麽简单!!!如果要筛选特定元素应该怎麽写呢? Option Base 1 Dim ar, br ar = Range("A1:A10")(数值1到10) For i = 1 To 10 If ar(i, 1) > 5 Then br = ar(i, 1) End If Next 比如说br应该有5个元素,上面那样写,br是10,而br(i,1)跑不出来,若写成 redim br(10,1) br(i, 1) = ar(i, 1) 则会有5个「空格」,要如何让这些空格消掉?使br只有5个元素
98F:→ soyoso: 测试上可提供实际的资料档案和说明实际要执行的动作 04/17 20:27
99F:→ soyoso: 效率上是回文写到的一次输入比较好 04/17 20:38
100F:→ soyoso: br,redim一维,二维的话br(1,10),判断内设个变数累加, 04/17 22:17
101F:→ soyoso: 变数=变数+1,br(变数)/br(1,变数)=ar(i,1),回圈结束後 04/17 22:17
102F:→ soyoso: 再redim preserve,阵列大小就以变数 04/17 22:17
br(1,10)反过来写成br(10,1)就卡住,为什麽呀?变数的方法真的很酷 Dim ar, br, count As Integer ReDim br(10) count = 0 ar = Range("A1:A10") For i = 1 To 10 If ar(i, 1) > 5 Then count = count + 1 br(count) = ar(i, 1) End If Next ReDim Preserve br(count) 但如果删除第二行的redim,第一行改为dim br(10),为什麽就会卡住呢? 我觉得阵列这部份最难搞懂,搞不清楚他的规则,每次不知道为什麽卡住@@
103F:→ soyoso: 这方面查redim,注解内都有写 04/18 11:24
104F:→ soyoso: ReDim语句是用来大小或重设已正式宣告的动态阵列...或Dim* 04/18 11:24
105F:→ soyoso: * 语句 (不含维度下标) 04/18 11:24
106F:→ soyoso: 如果您使用Preserve关键字, 您只能调整最後一个阵列维度的 04/18 11:24
107F:→ soyoso: 大小, 而且您无法变更所有维度的数目。 04/18 11:24
用Debug.Print IsArray(br)看,dim br()有括号是阵列,没括号就不是 但如果dim括号有数字,则无法用redim,是这样吗?这让我想到 Dim quantity As Integer = 10 这种写法,官网有这个范例,但我的vba跑不出来 只能 Dim quantity As Integer 然後 quantity =10 redim是这种关系,但用於阵列?
108F:→ soyoso: 回文写了"不含维度下标",原po测试就知道有数字,redim可 04/18 12:42
109F:→ soyoso: 否使了不是吗? 04/18 12:42
110F:→ soyoso: ^用 04/18 12:42
刚刚我大概把(不含维度下标)想成别的东西
111F:→ soyoso: Dim quantity As Integer = 10 这种写法 04/18 12:45
112F:→ soyoso: 请看 https://i.imgur.com/OncnrnJ.jpeg 上面不就写了VB, 04/18 12:45
113F:→ soyoso: 并没有写vba啊,有些通用,但不表示vba内就可以使用好吗 04/18 12:45
以後我会注意这种差异了@@
114F:→ soyoso: 应以这个才是 https://i.imgur.com/zpdHwUB.jpeg 04/18 13:03
115F:推 waiter337: 为什麽redim删除会卡住 04/19 16:48
116F:→ waiter337: 不用告诉你原因 你直接开个新sub 04/19 16:48
117F:→ waiter337: 然後用 f8 去执行 然後新增监看式br 04/19 16:49
118F:→ waiter337: 看看会发生甚麽事情 就明白了 我反而会说的你很乱 04/19 16:49
119F:推 waiter337: Sub test() 04/19 16:52
120F:→ waiter337: Dim ar 04/19 16:52
121F:→ waiter337: ReDim ar(3) 04/19 16:52
122F:→ waiter337: ReDim ar(2, 1) 04/19 16:52
123F:→ waiter337: ar(0, 0) = 123 04/19 16:52
124F:→ waiter337: ReDim ar(2, 1) 04/19 16:52
125F:→ waiter337: ar(0, 0) = 123 04/19 16:52
126F:→ waiter337: ReDim Preserve ar(2, 1) 04/19 16:52
127F:→ waiter337: ReDim Preserve ar(2, 2) 04/19 16:53
128F:→ waiter337: ReDim ar(2, 3) 04/19 16:53
129F:→ waiter337: End Sub 04/19 16:53
130F:→ waiter337: 一个个看有甚麽变化就懂了,要新增监看把 田ar 展开 04/19 16:54
131F:→ waiter337: 看看 格子的数量 阶层 内容 有甚麽变化 04/19 16:55
132F:→ waiter337: 初学阵列基本上就跟工作表摆放格子一样 不用想的太麻烦 04/19 16:56
133F:→ waiter337: 除非未来有机会碰到3维在继续进一步思考 04/19 16:56
134F:→ waiter337: 或者多维 04/19 16:57
135F:→ waiter337: 工作表是他EXCEL预设好了格子 04/19 17:43
136F:→ waiter337: 而阵列就是你要多少格子 你自己摆 04/19 17:43
137F:→ waiter337: redim 基本上就是全部清空重来 所以要怎麽改都可以 04/19 17:45
138F:→ waiter337: 改多改少改宽改窄都可以 04/19 17:45
139F:→ waiter337: 但如果用上preserve 就会保留原始资料 只能多不能少 04/19 17:46
140F:→ waiter337: 虽然说是成功保留原始资料 但也是清空重刷过後了唷 04/19 17:47
141F:→ waiter337: 但因为有资料 所以你不能改小 04/19 17:47
142F:→ waiter337: 如果是一开始学 可以只练习用redim 一次开好就好 04/19 17:49
143F:→ waiter337: 尽量不碰保留 反正久了就会了 04/19 17:50
144F:→ waiter337: 补充 如果资料量庞大 用了preserve 很容易会变慢 04/19 17:50
何时会用redim更改阵列维度呢?感觉用两个阵列来处理比较简单吧? 应该说redim preserve的删除只能是最後一维,这点有点讨厌,在上面的案例,在二维就 出现了@@ 没用过二维以上的,变慢是因为要从前面的维度一个一个进出,然後增减最 後一维度?有点像用回圈存取活页?
145F:推 waiter337: 最後一句没解释清楚 用回圈一直触发preserve 会变慢 04/20 16:14
146F:→ waiter337: 关於为何要用二维阵列这个问题 04/20 16:15
147F:→ waiter337: 在於必须先了解数据的基本组成概念 04/20 16:15
148F:→ waiter337: 但白话的说 04/20 16:16
149F:→ waiter337: 就是如果今天你的单笔资料 就有十个属性 04/20 16:16
150F:→ waiter337: 比如 姓名 电话 地址 日期 新增人 备注 手机 email 04/20 16:17
151F:→ waiter337: 那麽 你就得创很多个一维阵列 04/20 16:17
152F:→ waiter337: 但如果用2维阵列 你只要打个数字 就能一次创好 04/20 16:18
153F:→ waiter337: 不过这个问题很好 一维阵列 跟二维阵列 使用时机 04/20 16:18
154F:→ waiter337: 并没有很局限 你可以依照自己的习惯 或者学习经验 04/20 16:19
155F:→ waiter337: 慢慢尝试 找到你最喜欢的写法 04/20 16:19
156F:→ waiter337: 另外preserve变慢的原因是 是旧的资料要转移到新的阵列 04/20 16:21
1000列10个属性,用10个一维(1000)和1个二维(1000,10),差异是什麽呢?不过在命名 上,我想10个比较好,因为(i,7)属性是什麽?还要去查一下。但是一维不能一次从活 页输入资料,所以变成二维(1000,1)。那麽10个二维(1000,1)和1个二维(1000,10)哪个 好?如果没差,我觉得10个比较好,至少名字很清楚。 redim preserve 我大概只用在前面删空格的问题,如果本质是旧阵列搬到新阵列,而 我只是输出到活页,那麽更简洁的写法,应该是不用删除空格,只输出前面的元素就好 -- 後来我想到,10个属性从活页搬进10个二维,那麽就要做10次,而1个二维只要1次,输 出也一样。如果真的很多,我想10个可能要减少成2~4个,1个我觉得除非都做好了,最 後再来修成这个版本吧,不适合边写边改。
157F:推 waiter337: 没有好不好 只有习不习惯的问题 主要是看资料的分布状 04/20 22:47
158F:→ waiter337: 况 这麽说好了 04/20 22:47
159F:→ waiter337: 只用一维阵列 总有天会碰到要用二维的方式 04/20 22:47
160F:→ waiter337: 而相反 只用二维 总有天也会需要碰到一维 没有好不好 04/20 22:47
161F:→ waiter337: 只有适不适合 04/20 22:47
162F:→ waiter337: 比如你说的要设定名称的概念 04/20 22:47
163F:→ waiter337: 就跟你有10个员工 但你也可以用编号给予编号 这个没有 04/20 22:47
164F:→ waiter337: 任何问题 04/20 22:47
165F:→ waiter337: 但如果有1000个员工呢 就肯定会用上编号 依照目前你的 04/20 22:47
166F:→ waiter337: 状况 就算用编号 也不会造成出错 就能用编号 反之就设 04/20 22:47
167F:→ waiter337: 定名称 甚至 一部分编号 一部分名称 都是可以的 04/20 22:47
并非座号这种,而是有名字的属性变成数字流水号 (1,2)=43 (1,3)=65 (1,4)=87 这三个属性有时间、高度、重量,你觉得哪个编号是哪个属性?对我来说,那样的程式 码真的不会想看第二次,最多只能都做好了,不会再改了,才能改成这样。
168F:推 waiter337: 另外问 什麽是删空格? 如果你只要6-10列 04/20 23:14
169F:→ waiter337: 你只要redim ar(6 to 10) 04/20 23:14
170F:→ waiter337: 这样就不用担心还要加减调整位置去符合储存格栏列号 04/20 23:15
保留资料,删除没有资料的索引,比如ar5个索引(空,2,4,8,空),我只想留(2,4,8) ReDim Preserve ar(1 To 4) 可以跑 ReDim Preserve ar(2 To 4) 不行 而 ReDim ar(2 To 4) 会变成3个索引的空阵列,索引没有0和1 我应该用不太到这种,而且感觉很难用@@应该只会用上面筛选那边的方法 ReDim br(10) ar = Range("A1:A10") For i = 1 To 10 If ar(i, 1) > 5 Then count = count + 1 br(count) = ar(i, 1) End If Next ReDim Preserve br(count)
171F:推 waiter337: 1.的回答 有种东西叫做"注解" 04/21 19:07
不论是'注解,或萤幕旁边贴便条,我还是不太喜欢这种写法,也许是资料类型不同
172F:→ waiter337: 第二段 因为不是这样用 04/21 19:07
173F:→ waiter337: 1 to 4 是针对 让储存格跟阵列能够保持同栏列号用的 04/21 19:09
174F:→ waiter337: dim ar 04/21 19:11
175F:→ waiter337: redim ar(1 to 10) 04/21 19:12
176F:→ waiter337: for i = 1 to 10 04/21 19:12
177F:→ waiter337: ar(i) = cells(i,1) 04/21 19:12
178F:→ waiter337: next 04/21 19:12
179F:→ waiter337: 更正一下好了 04/21 19:13
180F:→ waiter337: dim ar 04/21 19:13
181F:→ waiter337: redim ar(1 to 10) 04/21 19:13
182F:→ waiter337: for i = 1 to 10 04/21 19:13
183F:→ waiter337: 打错了 更正一下好了 04/21 19:14
184F:→ waiter337: dim ar 04/21 19:14
185F:→ waiter337: redim ar(1 to 10) :w=1 04/21 19:14
186F:→ waiter337: for i = 1 to 10 04/21 19:15
187F:→ waiter337: if cells(i,1)>5 then ar(w)=cells(i,1):w=w+1 04/21 19:15
188F:→ waiter337: next i 04/21 19:15
189F:→ waiter337: end sub 04/21 19:15
190F:→ waiter337: 跟你的意思一样 这样才是为什麽用 1 to 10 的原因 04/21 19:16
用回圈一个一个输入,这写法不好,我觉得不需要活页列号跟阵列位置相同
191F:→ waiter337: 还有一个概念 阵列尽量在可行的状况下 设越多越好 04/21 19:22
192F:→ waiter337: 不用省 主要因素是 当你真的有空去省的情况 04/21 19:22
193F:→ waiter337: 1.你程式不省记忆体绝对不够用 只能省 04/21 19:22
194F:→ waiter337: 2.已经能完美运行了 优化他的状况 04/21 19:23
195F:→ waiter337: 更多的问题并不是浪费记忆体资源 而是当初开得不够用 04/21 19:23
196F:→ waiter337: 为了後者遇到的状况而提早杞人忧天 反而会影响你写程序 04/21 19:24
197F:→ waiter337: 的练习与昇华 因为如果阵列很强的人 在还没开始写之前 04/21 19:24
198F:→ waiter337: 都已经能直接预判从头到尾要耗费的阵列大小了 04/21 19:25
199F:→ waiter337: 所以对於阵列用上瘾的 通常不会有这个问题 04/21 19:25
200F:→ waiter337: 尽量开八 印象是至少有30万格起跳 04/21 19:26
201F:→ waiter337: 最高好像有到几百万格 04/21 19:27
202F:→ waiter337: 这个概念就像 你优化10秒到1秒 是很有效率的 04/21 19:27
203F:→ waiter337: 但如果阵列的速度 从0.01秒优化到0.001秒其实影响甚微 04/21 19:28
我的资料没有这麽多,但是效能真的满有感的,我第一个sub真的很慢,超过十秒,现在 不到一秒。首先是数学上大量重复计算,再来程式写得不好。用手算就会知道哪边是重 复的,直接抄过来就好,电脑只会一直重复计算。会这样是因为程式比较好写又简洁, 写fuction只有一行,若要提昇效率,改成会记忆的变数,就好几十行。虽然说写程式之 前要规划,实际是边写边改,更何况新手我一直卡在奇怪的地方,不然就是不知道为什 麽跑出来是错的。总之我差不多写完一个简单实用的sub,虽然结构只是大的for回圈, 内部一个do回圈,好几个if。但这些不是一次写完,而是修修改改,图书馆翻书,来这 个板求救,这样子才成功搞定。当中我觉得,阵列跟for回圈结合,这个技巧真的是最重 要的。
204F:推 waiter337: 回一个部分 你说用回圈一个一个输入不好 04/21 22:55
205F:→ waiter337: 肯定是你误会了甚麽 04/21 22:55
206F:→ waiter337: 因为有地方你遗漏了 04/21 22:56
207F:→ waiter337: 如果 你从储存格上一个一个汇入阵列 其实他分成两种 04/21 22:57
208F:→ waiter337: 操作 04/21 22:57
209F:→ waiter337: 1.找到工作表>找到储存格位置>写入阵列 04/21 22:58
210F:→ waiter337: 如果使用二种方法 04/21 22:58
211F:→ waiter337: 我直接set 工作表 到记忆体 04/21 22:58
212F:→ waiter337: 比如原先是sheets("工作表1").cells(i,1) 04/21 22:59
213F:→ waiter337: 而我们让他变成 04/21 22:59
214F:→ waiter337: set s= sheets("工作表1") 04/21 22:59
215F:→ waiter337: s.cells(i,1) 04/21 22:59
216F:→ waiter337: 那麽 这样的概念就是 表已经在记忆体内了 04/21 23:00
217F:→ waiter337: 只要找位置>汇入阵列而已 就不会慢 04/21 23:00
218F:→ waiter337: 意思就跟你会先 ar=range("a1:a10") 完全是一样的概念 04/21 23:00
set物件这种我倒没用过,试了一下马上就卡住@@ s.Cells(1, 1).Value = 123 不能这样写吗?我再翻书看看
219F:→ waiter337: 回圈其实非常快 曼的不是回圈 而是你用回圈不小心做了 04/21 23:01
220F:→ waiter337: 看不见的多於底层程序触发到一些奇怪的呼叫与引用 04/21 23:01
221F:→ waiter337: 其实目前你的状况要多尝试不同做法 04/21 23:03
222F:→ waiter337: 实际状况是这样 从copy到会用阵列 会快很多 04/21 23:03
223F:→ waiter337: 但 从阵列到达 3维阵列 又会快更多 04/21 23:04
224F:→ waiter337: 而当中必定要经过2维阵列的学习 04/21 23:04
225F:→ waiter337: 这样说好了 我有个档案原本预计要跑40分钟 3万笔 04/21 23:04
226F:→ waiter337: 现在用到一般阵列大概50秒 3维阵列6秒 04/21 23:05
227F:→ waiter337: 而且我在此篇讲的所有技巧全部都得用到 04/21 23:06
228F:→ waiter337: 祝你未来成为高手! 04/21 23:06
229F:→ waiter337: 关於注解的问题 04/21 23:11
230F:→ waiter337: 三维阵列就是一个 完全依照数字存取的概念 04/21 23:11
231F:→ waiter337: 若无法先学会二维阵列 那麽三维阵列的学习势必会遇到 04/21 23:12
232F:→ waiter337: 阻碍 请尽量的多方尝试与练习 04/21 23:12
三维我还没想通怎麽用,二维就一个活页的栏列,第三维就是不同活页?
233F:→ waiter337: 比如 拟利用encode的方式找出文字开头作强制分类 04/21 23:13
234F:→ waiter337: 那麽分出来的资料就会从48~90 或者找尾数0~9 04/21 23:15
235F:→ waiter337: 直接利用数字放入各各阵列中的阵列 04/21 23:16
236F:→ waiter337: 然後需要直接依编号提取 就会用上这种方式 04/21 23:16
encode 是 WorksheetFunction.EncodeUrl 这个吗?是处理网址用的?
237F:→ waiter337: 另外可以搜寻这篇 知道如何将阵列资料汇出 04/21 23:16
239F:→ waiter337: .DB6.html 请合并网址 04/21 23:17
240F:→ waiter337: 抱歉 多个. 04/21 23:17
241F:→ waiter337: #1OYh_fss (Visual_Basic) 04/21 23:18
242F:→ waiter337: 之前你抓的那个档案 里面有大概教如何使用 04/22 19:44
243F:推 waiter337: encode 更正一下 我打错了 是asc 才对 04/22 19:47
是 ASC() 这个吗?我还是不知道干嘛用的@@
244F:推 waiter337: 三维或者多维的概念不好理解 04/22 19:49
245F:→ waiter337: 你的讲法没错 只要是有大范围 中范围 小范围都能解释 04/22 19:49
246F:→ waiter337: 有人也会以 军队分配 或者 公司规模 或者 县市地区 04/22 19:51
247F:→ waiter337: 这种 大中小 的方式作为概念 04/22 19:51
248F:→ waiter337: 但说白了 就是将二维的概念 延伸 04/22 19:51
249F:→ waiter337: 这种概念认知方式 我的建议是 每种都拿来测看看 大脑 04/22 19:52
250F:→ waiter337: 偏好喜欢哪种认知方式 对了 还有一种 直线/平面/方块 04/22 19:52
251F:→ waiter337: 或者你去搜寻这个三字 04/22 19:53
252F:→ waiter337: vector matrix array 看能不能找google找图 04/22 19:53
253F:→ waiter337: 还有一个data frames 04/22 19:54
254F:→ waiter337: 但虽然三维说得很厉害一样 但实际写程序时 也不过就3 04/22 19:58
255F:→ waiter337: 组数字而已 所以要去试着扩散大脑连结这两种概念 04/22 19:59
256F:→ waiter337: 前提先练习二维 转一维 或者一维转二维 三维会比较好练 04/22 20:00
257F:推 waiter337: 因为阵列的用意 就是把很复杂的资料 用数字编号整理好 04/22 20:08
258F:→ waiter337: 方便运用 04/22 20:08
259F:推 waiter337: 就跟你把工作表开20个 照编号1~20 04/23 05:50
260F:→ waiter337: 然後里面的列号也是1~20 04/23 05:50
261F:→ waiter337: 栏号也是1~20 04/23 05:50
262F:→ waiter337: 那麽就有8000个位置 04/23 05:51
263F:→ waiter337: 假如我要第15个工作表的 2列10号 那麽就是ar(15,2,10) 04/23 05:51
264F:→ waiter337: 忘了补充上述情景,假设所有阵列都从1开始的情况 04/23 05:52
我的资料是有机会用到三维,但因为资料特性,我还无法写出简单的程式 再慢慢想啦,有机会再跟你请教~
265F:推 waiter337: asc()可以把文字转成数字编号 04/24 19:43
266F:→ waiter337: 刚好可以搭配阵列运用 就能减少搜寻范围或着直接对照 04/24 19:43
267F:→ waiter337: 编号摆入 甚至用到三维或四维 04/24 19:43
a=97 y=121 所以编号a-y-3-67 阵列就是(97,121,3,67)?
268F:推 waiter337: 说个题外话 属个人主观 可以不必强制自己接受 04/24 19:54
269F:→ waiter337: 纯vba为什麽会让我完全几乎放弃函数公式的原因 04/24 19:54
270F:→ waiter337: 1.可以f8 不用一次写的自己都看不懂 只有start 跟 end 04/24 19:54
271F:→ waiter337: 无法快速判断自己是否误写 04/24 19:54
272F:→ waiter337: 2.延伸与通用性 当开始拥有了一个output结果 未来会有 04/24 19:54
273F:→ waiter337: 极大的机率必须要再次利用这个结果 vba甚至可以写到10 04/24 19:54
274F:→ waiter337: 几阶的运用 04/24 19:54
275F:→ waiter337: 3.userform可以运用 04/24 19:54
276F:→ waiter337: 4.可以快速改版迭代 保留原始资料 不用担心牵一发动全 04/24 19:54
277F:→ waiter337: 身 尤其是一个已经 经过多层阶段的结果运用 04/24 19:54
278F:→ waiter337: 4.阵列速度快 04/24 19:54
279F:→ waiter337: 5.不用担心不小心去动到工作表而影响全部资料 04/24 19:54
280F:→ waiter337: 6.引用外部资料方便 04/24 19:54
281F:→ waiter337: 7.爬虫 04/24 19:54
282F:→ waiter337: 8.可以依照框架与经验 学习更多类型的程式语言 04/24 19:54
283F:→ waiter337: 9.解决有些公式难以解决的问题的效率 04/24 19:54
284F:→ waiter337: 10.可以无脑缩短成一个按键 04/24 19:54
285F:→ waiter337: 11.可以运用工作表注解(不是vba注解) 04/24 19:54
286F:→ waiter337: 12.大多人无法轻易理解 被人窜改资料 04/24 19:54
287F:→ waiter337: 基於这些 也就是我推荐你靠拢纯vba的建议 04/24 19:54
288F:推 waiter337: 甚至有些一定要背的函数公式套路 可以绕过 直接用阵列 04/24 19:57
289F:→ waiter337: 回圈的基本操作给处理掉 04/24 19:57
背公式如果能解决多数难题,那也不太坏,问题是好像没什麽书整理这些东西,无从背 起,不然就是看不懂范例是干嘛的?下次遇到还是不知道怎麽做。 我正在写另外一个sub,输入只有2栏,要做判断,输出一样是2栏,我一直都是用手工做 这些。写出来只是好几个if,但是推倒重写很多次,才成功跑出正确的东西。这次写的 技术不难,但人脑逻辑怎麽化成程式逻辑很重要,好几个if,谁在外面,谁在里面,或 是独立,跑出来的东西都不一样,而且常常跟我预期的不一样@@人脑算到一半,发现 怪怪的,可以退回重算,程式似乎很难这样写。
290F:推 waiter337: if 有2种高级(?)写法用法 可以讲判断在工作表列出 04/25 21:14
291F:→ waiter337: 来 然後拆解 就可以完全避免巢状 至少可以不用用到三 04/25 21:14
292F:→ waiter337: 巢状 04/25 21:14
293F:→ waiter337: 天晴 吃饭 睡觉 睡觉 不要订闹钟 要戴眼罩 04/25 21:19
294F:→ waiter337: 雨天 吃菜 唱歌 睡觉 睡觉要订闹钟 如果星期一 要7点 04/25 21:19
295F:→ waiter337: 星期二8点 04/25 21:19
296F:→ waiter337: 其他日9点 04/25 21:19
297F:推 waiter337: 很多人的写法 大部分会 一个包一个 巢下去 04/25 21:21
298F:→ waiter337: 其实大可不必 全部拆开 直接搭配and就好 04/25 21:22
299F:→ waiter337: 但许多人会说 这样不是浪费效能吗 04/25 21:25
300F:→ waiter337: 是的 但真的要效能时再包就好 04/25 21:25
301F:→ waiter337: 而且 工作表上已经有蓝图了 直接复制到vba里面当注解 04/25 21:25
302F:→ waiter337: 参考 04/25 21:25
303F:→ waiter337: 然後 04/25 21:25
304F:→ waiter337: 有些太吃运算并且重复使用的的功能 就把它提前在if前 04/25 21:25
305F:→ waiter337: 设好变数 之後就能直接用 04/25 21:25
306F:→ waiter337: 1.天晴+吃饭+睡觉+不要订闹钟+要戴眼罩 04/25 21:27
307F:→ waiter337: 雨天 吃菜 唱歌 睡觉 睡觉要订闹钟 如果星期一 要7点 04/25 21:27
308F:→ waiter337: 对不起 更正 04/25 21:27
309F:→ waiter337: 重来 04/25 21:27
310F:→ waiter337: 1.天晴+吃饭 04/25 21:28
311F:→ waiter337: 2.天晴+睡觉戴眼罩+不要订闹钟 04/25 21:28
312F:→ waiter337: 3.雨天+吃菜 04/25 21:28
313F:→ waiter337: 3雨天+唱歌 04/25 21:29
314F:→ waiter337: 5雨天+睡觉+订闹钟+星期一7点 04/25 21:30
315F:→ waiter337: 6.雨天+睡觉+订闹钟+星期二8点 04/25 21:30
316F:→ waiter337: 6.雨天+睡觉+订闹钟+其他9点 04/25 21:30
317F:→ waiter337: 排序我忘了改 你改一下1-7就对了 04/25 21:31
318F:→ waiter337: 这样是不是简单易懂 一层就能搞定 04/25 21:31
319F:→ waiter337: 虽然有点小错 但大致上是这个意思 04/26 01:42
320F:→ waiter337: https://i.imgur.com/a/c6o7JG1.jpg 04/26 01:42
321F:→ waiter337: 有点反直觉 但很好用 下面应该是elseif 我忘了改 04/26 01:43
列举法,大概只能用在这种简单有限的情境 我的是要找出突出(异常)的数值,初步直觉是只有一个if,不就正常/异常两种?但是 我的资料要判断没这麽简单,这个隐含在内的逻辑至少要两个if,2^2=4种结果,若是三 个if,2^3=8种结果,要记录1种结果就要1个一维阵列。虽然部份结果是重复的,变数就 不用这麽多,但我还是只能把部份人脑逻辑写出来,剩下的再慢慢想怎麽弄。 我用巢状IF,有部份结果相同,有没有办法省略? 1号IF结果:a运算/b运算/c运算 2号IF结果:d运算/e运算/c运算 c运算的部份能省略为 call sub.c运算 吗? 但是应该要有资料放进去,这部份是放在阵列,我只用过call function() call sub 资料会放进去吗?我还没测试
322F:→ waiter337: call的方式很好 function也可以利用 04/26 13:51
但是两个sub之间,要怎麽交流变数?尤其是阵列的内容
323F:→ waiter337: 还有一个方式 有的时候可以用if一行式 先过滤一些 04/26 13:52
324F:→ waiter337: if x=? then [a1]=1 :[a2]=2 :exit sub 这样 04/26 13:53
325F:→ waiter337: 甚至规律 或者类型很像时 还可以直接用select case 04/26 13:55
select case是否只能用在有范围的数值,和有限的情境?
326F:→ waiter337: 我猜你要的可能是 射线法 你去找一下看看 04/26 13:58
射线法应该用不到,VBA感觉不好写 後来想到goto这个写法,有人说这个写法不好,你怎麽看呢?不过我目前只想用於重复 的段落而已,用fuction和sub还是卡在怎麽传阵列@@
327F:推 waiter337: 有两种方式 可以将变数带出去 04/27 18:09
328F:→ waiter337: 1种是 变数本身就在外面也就是把dim ar移道sub xxx()之 04/27 18:09
329F:→ waiter337: 外的上方 第二种则是call xxx(ar) 就能带去sub xxx() 04/27 18:10
330F:→ waiter337: 的里面 04/27 18:10
331F:→ waiter337: 最後更正 就能带去sub xxx(ar)里面 04/27 18:11
方法1感觉不太好,弄了老半天才跑起来,然後我发现他sub里面应该要有dim或redim, 这样才会归零,然後不知道为什麽这样就卡住了,而且我这还会执行别的sub,本来想说 是同名的缘故?结果改名字,关掉重开还是卡,後来写在空白活页才正常 方法2无法执行,是少了什麽吗? Sub ccc() ar = [A1:B10].Value Call ddd(ar) [D1].Resize(count, 1) = Application.Transpose(br) End Sub Sub ddd() For i = 1 To 10 If ar(i, 2) > 0 Then count = count + 1 br(count) = ar(i, 1) End If Next End Sub
332F:推 waiter337: sub ddd() 要改成sub ddd(ar) 04/29 00:30
333F:→ waiter337: 但你没有把br传回去不行 04/29 00:31
334F:→ waiter337: 我都是用偷懒的方法拉 04/29 00:34
335F:→ waiter337: Dim ar, br, count 04/29 00:34
336F:→ waiter337: Sub ccc() 04/29 00:35
337F:→ waiter337: ar = [A1:B10].Value 04/29 00:35
338F:→ waiter337: Call ddd 04/29 00:35
339F:→ waiter337: [D1].Resize(count, 1) = Application.Transpose(br) 04/29 00:35
340F:→ waiter337: End Sub 04/29 00:36
341F:→ waiter337: Sub ddd() 04/29 00:36
342F:→ waiter337: ReDim br(UBound(ar)) 04/29 00:36
343F:→ waiter337: For i = 1 To 10 04/29 00:36
344F:→ waiter337: If ar(i, 2) > 0 Then 04/29 00:36
345F:→ waiter337: count = count + 1 04/29 00:36
346F:→ waiter337: br(count) = ar(i, 1) 04/29 00:36
347F:→ waiter337: End If 04/29 00:36
348F:→ waiter337: Next 04/29 00:36
349F:→ waiter337: End Sub 04/29 00:37
测试了後,外面有dim redim的,里面应该也要补,变数也要补,不然不会归零,难怪超 出阵列索引。我不太喜欢这种方法,也许等到程式很大再来用吧?小程式就先输出到活 页,再来做第二次的sub。 goto写法满方便的,但有人说不好,不知道好不好呢?我有个do回圈,判断式会用到do 後的结果,可是第一次需要先给这个结果,所以我把do回圈内算式复制到前面,看了有 点讨厌,因为两者只差两三行,其他都是一样的。如果用goto,就可以直接进do回圈的 中间。还有个gosub return的写法,这个写法比较符合我对程式的想像,也成功解决我 这个问题 ... GoSub line001 ... Exit Sub line001: ... Return line002: ... Return End Sub
350F:推 waiter337: 其实应该不会很复杂 05/01 08:00
351F:推 waiter337: Sub a() 05/01 08:02
352F:→ waiter337: x = 1: y = 2: Call b(x, y) 05/01 08:03
353F:→ waiter337: Z = x + y 05/01 08:03
354F:→ waiter337: Debug.Print Z 05/01 08:03
355F:→ waiter337: End Sub 05/01 08:03
356F:→ waiter337: Function b(b1, b2) 05/01 08:03
357F:→ waiter337: b1 = b1 * 2 05/01 08:03
358F:→ waiter337: b2 = b2 * 2 05/01 08:03
359F:→ waiter337: End Function 05/01 08:03
360F:→ waiter337: 当然上面不是正规写法 是预设就是会返回资料(?) 05/01 08:04
361F:→ waiter337: 正规写法是Function b(b1, b2) 要改成 05/01 08:04
362F:→ waiter337: Function b(ByRef b1,ByRef b2) 05/01 08:05
363F:→ waiter337: 这一定是会强制回传资料(?)的唷 05/01 08:05
364F:→ waiter337: 关於回传返回资料的部分我打个问号 是因为原理有其他 05/01 08:06
365F:→ waiter337: 原因 05/01 08:06
366F:→ waiter337: 建议直接去youtu 查传值跟传址的差别 05/01 08:07
367F:→ waiter337: 很多人用门牌跟房子来解释 05/01 08:09
368F:→ waiter337: 我用另一个讲法 05/01 08:09
369F:→ waiter337: 你在youtube发现一部很好看的影片 05/01 08:09
370F:→ waiter337: 你把他的网址传给任何人 突然某个人又将资料传给你 05/01 08:10
371F:→ waiter337: 对不起 更正 05/01 08:10
372F:→ waiter337: 你把他的网址传给任何人 突然某个人又将网址传给你 05/01 08:10
373F:→ waiter337: 不行 我例子颇烂 05/01 08:12
374F:→ waiter337: 还是用门牌号 跟 房子 的例子比较好 05/01 08:13
375F:推 waiter337: https://www.youtube.com/watch?v=4lPVoaCxjv8 05/01 08:18
376F:推 waiter337: 感觉还是挺模糊的 05/01 08:22
377F:→ waiter337: google 传值 传址 门牌 房子 大概看2~3个网站就能 05/01 08:23
378F:→ waiter337: 反正 传值就回不去了 05/01 08:25
379F:→ waiter337: 你也可以改成Function b(ByVal b1, ByVal b2) 05/01 08:25
380F:→ waiter337: 看看Z会变成多少 05/01 08:25
381F:→ waiter337: 传址 是本体根本没出去过 分身出去了!影分身之术 05/01 08:26
382F:→ waiter337: byval 是 by value的缩写 by ref 是reference (参考) 05/01 08:28
传值、传参考,我之前搞不清楚,现在我这样理解: X=10:Y=20 X、Y叫变数,一个变数等於是一个篮子(记忆体的一个单位?),两个篮子的标签分别 是X和Y,内容物则分别是10和20。 VBA预设是传参考,等於说各个sub、function在计算的时候,是传递X、Y这种标签,找 到篮子後,再来读取里面的内容、计算、更改。 比如仓库红色篮子是3瓶果汁,黄色篮子是10瓶果汁,员工的任务是把2瓶果汁放进红色 篮子,那麽他应该是无中生有变出2瓶果汁,然後放进红色篮子。这过程并没有摸到黄色 篮子,2瓶果汁也不是从黄色篮子拿出来的。这样吗? 传值不知哪边用得到?或者其实function本身就是传值?如果sub的参数都是传值,那麽 就跟function差不多了?但是要弄个变数去储存他的答案? end sub,会消灭这个sub的篮子,除非sub外面有篮子,而且标签要一样,资料才会留下 来,但是传值就不会改动篮子内的东西了。 在前面我的问题中,两个sub是end了,但外面的篮子(阵列和变数)还在,里面资料也 还在,所以重新计算时,就会用到这些旧资料,而非原先预期的「空」,所以要补上dim 或redim把篮子清空。 ※ 编辑: j2708180 (36.239.159.74 台湾), 05/01/2021 12:00:53
383F:推 waiter337: 小时候用过游戏修改大师 05/01 20:08
384F:→ waiter337: 如果他传出来的是值 你怎麽改 hp mp都不会变 05/01 20:09
385F:→ waiter337: 如果他传出来的是址 你一改完 就会变 05/01 20:09
386F:→ waiter337: 就用 数值 跟 地址(路径) 来解释 最洽当 05/01 20:10
387F:→ waiter337: 数值(物质) 地址(路径) 05/01 20:11
388F:推 waiter337: 预设是传址 05/01 20:17
389F:→ waiter337: 原本的function 记得没错有个功能能决定是否会刷新 05/01 20:18
390F:→ waiter337: 那个部分可能是事件触发>结束 只要程式跑完 会自动清空 05/01 20:19
391F:→ waiter337: 除非你像我前面把dim写在外面 那麽这个项目就不会清空 05/01 20:20
392F:推 waiter337: 抱歉 更正 那个function的触发方式 我也不知道是甚麽 05/01 20:23
393F:→ waiter337: 我只知道 你给定范围的资料有变化 他就会变 范围外不管 05/01 20:24
394F:→ waiter337: 好像有个excel有个功能是控制刷新的 05/01 20:24
395F:→ waiter337: function 分两个部分 传传值址的预设 跟资料的预设 05/01 20:26
396F:→ waiter337: 如果是资料的预设 05/01 20:26
397F:→ waiter337: 如下 05/01 20:34
398F:→ waiter337: Sub a1() 05/01 20:34
399F:→ waiter337: x = 1: y = 2 05/01 20:34
400F:→ waiter337: Call c(x, y) '改成callc(x) 试试 05/01 20:35
401F:→ waiter337: Z = x + y 05/01 20:35
402F:→ waiter337: Debug.Print Z 05/01 20:35
403F:→ waiter337: End Sub 05/01 20:35
404F:→ waiter337: Function c(b1, Optional ByVal b2 As Integer = 9) 05/01 20:36
405F:→ waiter337: b1 = b1 * 2 05/01 20:36
406F:→ waiter337: b2 = b2 * 2 05/01 20:36
407F:→ waiter337: End Function 05/01 20:36
408F:推 waiter337: 当b2没东西时 就自动将b2设成9 05/01 20:39
总之传值不会改变原变数的值,传参考会,可是除了x=x+1这种,两个好像没差? 那麽什麽情况会需要把ByVal打出来呢? ※ 编辑: j2708180 (218.173.181.14 台湾), 05/02/2021 13:25:14
409F:推 waiter337: 这个考倒我了 05/02 13:43







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP