[算表] VBA命令位置不同造成的结果不同

楼主: yimean (温柔杀手)   2018-09-09 11:24:44
软件: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
作者: soyoso (我是耀宗)   2018-09-09 11:34:00
会一直写在18的话,应是变量array_counter没有累加只有在array_counter只有在循环外做了一次的index_row+1index_row为17+1=18.activesheet.cells(array_counter,i)方面改为.activesheet.cells(array_counter+m,n)=....的方式试试
楼主: yimean (温柔杀手)   2018-09-09 12:04:00
Soyoso大大我有更新资料了喔。
作者: soyoso (我是耀宗)   2018-09-09 12:43:00
那a档案从储存格a1,按下ctrl+↓(向下键)是10还是17测试从b栏执行原文宏,开启a档,可取得储存格a1往下的连续储存格的最后一个,如有公式的话也会取到从原po提供的连结来看,看不出是否有公式已在a栏内
楼主: yimean (温柔杀手)   2018-09-09 14:33:00
按下ctrl+↓所得到的是10,没有公式,下方连结是录影。https://imgur.com/LRi6DI4感谢您
作者: soyoso (我是耀宗)   2018-09-09 14:36:00
那将index_row = fileA.ActiveSheet.Range("A1").End(xlDown).Row 来抓看是否是10回文打的是end().row不是end().select如果写在这里的话,上面thisworkbook.activate就回到b档
楼主: yimean (温柔杀手)   2018-09-09 14:46:00
作者: soyoso (我是耀宗)   2018-09-09 14:47:00
with fileA...end with内不一定是作用活页簿就是在a档
楼主: yimean (温柔杀手)   2018-09-09 14:47:00
https://imgur.com/wMV95eH喔喔喔 我改一下,Sorry
作者: soyoso (我是耀宗)   2018-09-09 14:48:00
错误是,不是用range.select要用range.row来回传列号给变量index_row所以有可能回传17是因为作用活页簿于b档内
楼主: yimean (温柔杀手)   2018-09-09 14:50:00
https://imgur.com/gvEWvag正确的写进去第11列了
作者: soyoso (我是耀宗)   2018-09-09 14:50:00
如果已经在with fileA...end with的话,则以 .activesheet.range("a1").end(xldown).row,index_column亦同
楼主: yimean (温柔杀手)   2018-09-09 14:51:00
太神奇了,所以,请教一下With所有作用的不是在指定范围?
作者: soyoso (我是耀宗)   2018-09-09 14:52:00
或是将作用活页簿调整到a档,于with fileA下方打上
楼主: yimean (温柔杀手)   2018-09-09 14:52:00
这个观念我不是很懂,如果是这样With的功能不就弱化了?
楼主: yimean (温柔杀手)   2018-09-09 14:56:00
学到了一个技巧,感谢您。确实可以这样使用。
作者: soyoso (我是耀宗)   2018-09-09 14:57:00
end(xldown).select,index_row=selection.row来取得列号
楼主: yimean (温柔杀手)   2018-09-09 14:58:00
所以如果后面要切回B档时只要加上thisworkbook.activate
作者: soyoso (我是耀宗)   2018-09-09 14:58:00
因此'=====写入档案====的这个部分也可不用with..end with
作者: soyoso (我是耀宗)   2018-09-09 14:59:00
就只要是fileA.activate那之后就都在a档案内操作也无需 .activesheet前面的.(点号)了如原po所述,要回b档时加上该activate来切回
楼主: yimean (温柔杀手)   2018-09-09 15:04:00
感恩指导,谢谢。

Links booklink

Contact Us: admin [ a t ] ucptt.com