作者yimean (温柔杀手)
看板Office
标题[算表] VBA命令位置不同造成的结果不同
时间Sun Sep 9 11:24:44 2018
软体:Excel
版本:2013
各位版上的大大早安。我有一个观念性的问题想不通。
我刚写好一个Module,为了让Code好读,我进行了顺序的编排。
但是,重新编排後的执行结果却与想像中的不同。
想请大大指导一下,我的观念哪里出了问题。感恩。
这是一个游走在两个档案间的复制与贴上动作模组
我把"找该工作页最後一笔资料"这一段程式码放入"写入档案"下的With fileA後面。
该Module是存在於B档案
我尝试着把每一段是在A档案还是B档案工作的关系标示出来。
但是还是不知道为什麽移了位置後,执行结果跟预期的不同。
以这段Code的结果应该是从最後一笔(row)往下写。
但是一旦移了,他就一直写第18 row.
我有尝试用监看式去看index_row确实是17。
但我就不明白,为什麽index_row会是17,而且一直在17。
移位置之前的执行结果是正确的。
因为找最後一笔资料是在A档案中寻找。
而以我的设定方式With fileA之後的操作不是应该在A档案中了吗?
以下是该Module的Code。
'=======================找寻绝对路径与读档============ B档案
dpath = ThisWorkbook.Path
MsgBox ThisWorkbook.Path
Fname = Range("B1").Value
Workbooks.Open Filename:=dpath & "\" & Fname & ".xlsx"
Set fileA = Workbooks(Fname & ".xlsx")
'=====================================================
'=======================找该工作页最後一笔资料======== A档案
Application.Goto reference:=ActiveSheet.Range("A1")
ActiveSheet.Range("A1").End(xlDown).Select
index_row = Selection.Row
index_column = Selection.Column
'=====================================================
'=======================复制资料====================== B档案
ThisWorkbook.Activate
Head(1) = Range("B2").Value
Head(2) = Range("B1").Value
Head(3) = Range("B3").Value
Head(4) = Range("H2").Value
Head(5) = Range("H1").Value
Head(6) = Range("L1").Value
For m = 0 To 12
For n = 0 To 11
DataArray(m, n) = Cells(5 + m, 2 + n).Value
Next n
Next m
'dim DataArray as variant
'DataArray = activesheet.range("B5:M17")
'=====================================================
'=======================写入档案====================== A档案
With fileA
array_counter = index_row + 1
For i = 1 To 6
.ActiveSheet.Cells(array_counter, i) = Head(i)
Next i
For m = 0 To 12
For n = 0 To 11
.ActiveSheet.Cells(array_counter, i) = DataArray(m, n)
i = i + 1
Next n
Next m
Application.DisplayAlerts = False '关闭提醒
.Close True '关闭档案
End With
'=====================================================
End Sub
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.195.98.141
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Office/M.1536463487.A.3D7.html
1F:→ soyoso: 会一直写在18的话,应是变数array_counter没有累加 09/09 11:34
2F:→ soyoso: 只有在array_counter只有在回圈外做了一次的index_row+1 09/09 11:35
3F:→ soyoso: index_row为17+1=18 09/09 11:36
4F:→ soyoso: .activesheet.cells(array_counter,i)方面改为 09/09 11:37
5F:→ soyoso: .activesheet.cells(array_counter+m,n)=....的方式试试 09/09 11:38
感谢soyoso大大的回应,arraycounter的用处其实是在找下一个资料的其始点
下图是B档案的资料内容
https://imgur.com/b6GL4qP
其中灰色所选取的部分就是巢状回圈所读取的资料,是一个2维阵列
下图是A档案的资料内容
https://imgur.com/8iyeWnO
arraycounter用於找最後一笔资料的所在位置+1後变成资料写入的起始点,而资料从2维
阵列变成1维阵列。所以理当,arraycounter不需要参与回圈叠加才是。
我核心的问题是为什麽找最後一列的Code放在原来的位置跟With A会有不一样的结果。
不管档案A的资料量有多少,不管中间是否有空白他都会从第18行开始写。
https://imgur.com/4ph5m4q
感谢您一直耐心地回应问题。
※ 编辑: yimean (123.195.98.141), 09/09/2018 12:03:19
6F:→ yimean: Soyoso大大我有更新资料了喔。 09/09 12:04
7F:→ soyoso: 那a档案从储存格a1,按下ctrl+↓(向下键)是10还是17 09/09 12:43
8F:→ soyoso: 测试从b栏执行原文巨集,开启a档,可取得储存格a1往下的连 09/09 12:58
9F:→ soyoso: 续储存格的最後一个,如有公式的话也会取到 09/09 12:58
10F:→ soyoso: 从原po提供的连结来看,看不出是否有公式已在a栏内 09/09 12:59
11F:→ yimean: 按下ctrl+↓所得到的是10,没有公式,下方连结是录影。 09/09 14:33
13F:→ yimean: 感谢您 09/09 14:33
※ 编辑: yimean (123.195.98.141), 09/09/2018 14:36:13
14F:→ soyoso: 那将index_row = fileA.ActiveSheet.Range("A1"). 09/09 14:36
15F:→ soyoso: End(xlDown).Row 来抓看是否是10 09/09 14:36
※ 编辑: yimean (123.195.98.141), 09/09/2018 14:44:28
16F:→ soyoso: 回文打的是end().row不是end().select 09/09 14:44
17F:→ soyoso: 如果写在这里的话,上面thisworkbook.activate就回到b档 09/09 14:46
19F:→ soyoso: with fileA...end with内不一定是作用活页簿就是在a档 09/09 14:47
21F:→ yimean: 喔喔喔 我改一下,Sorry 09/09 14:48
22F:→ soyoso: 错误是,不是用range.select要用range.row来回传列号给变 09/09 14:48
23F:→ soyoso: 数index_row 09/09 14:48
24F:→ soyoso: 所以有可能回传17是因为作用活页簿於b档内 09/09 14:49
26F:→ yimean: 正确的写进去第11列了 09/09 14:50
27F:→ soyoso: 如果已经在with fileA...end with的话,则以 .activesheet 09/09 14:50
28F:→ soyoso: .range("a1").end(xldown).row,index_column亦同 09/09 14:51
29F:→ yimean: 太神奇了,所以,请教一下With所有作用的不是在指定范围? 09/09 14:51
30F:→ soyoso: 或是将作用活页簿调整到a档,於with fileA下方打上 09/09 14:52
31F:→ yimean: 这个观念我不是很懂,如果是这样With的功能不就弱化了? 09/09 14:52
32F:→ soyoso: .activate 这时作用活页簿为a档 09/09 14:52
33F:→ soyoso: with...end with是用来简化语法用 09/09 14:54
34F:→ soyoso: 当作用活页簿为a档时,就可以原本activesheet.range(..). 09/09 14:56
35F:→ yimean: 学到了一个技巧,感谢您。确实可以这样使用。 09/09 14:56
36F:→ soyoso: end(xldown).select,index_row=selection.row来取得列号 09/09 14:57
37F:→ yimean: 所以如果後面要切回B档时只要加上thisworkbook.activate 09/09 14:58
38F:→ soyoso: 因此'=====写入档案====的这个部分也可不用with..end with 09/09 14:58
39F:→ yimean: 就可以了,对吗? 09/09 14:58
40F:→ soyoso: 就只要是fileA.activate那之後就都在a档案内操作 09/09 14:59
41F:→ soyoso: 也无需 .activesheet前面的.(点号)了 09/09 14:59
42F:→ soyoso: 如原po所述,要回b档时加上该activate来切回 09/09 15:00
43F:→ yimean: 感恩指导,谢谢。 09/09 15:04