[算表] 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