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

看板Office作者 (溫柔殺手)時間7年前 (2018/09/09 11:24), 7年前編輯推噓0(0043)
留言43則, 2人參與, 7年前最新討論串1/1
軟體: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://www.ptt.cc/bbs/Office/M.1536463487.A.3D7.html

09/09 11:34, 7年前 , 1F
會一直寫在18的話,應是變數array_counter沒有累加
09/09 11:34, 1F

09/09 11:35, 7年前 , 2F
只有在array_counter只有在迴圈外做了一次的index_row+1
09/09 11:35, 2F

09/09 11:36, 7年前 , 3F
index_row為17+1=18
09/09 11:36, 3F

09/09 11:37, 7年前 , 4F
.activesheet.cells(array_counter,i)方面改為
09/09 11:37, 4F

09/09 11:38, 7年前 , 5F
.activesheet.cells(array_counter+m,n)=....的方式試試
09/09 11:38, 5F
感謝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

09/09 12:04, 7年前 , 6F
Soyoso大大我有更新資料了喔。
09/09 12:04, 6F

09/09 12:43, 7年前 , 7F
那a檔案從儲存格a1,按下ctrl+↓(向下鍵)是10還是17
09/09 12:43, 7F

09/09 12:58, 7年前 , 8F
測試從b欄執行原文巨集,開啟a檔,可取得儲存格a1往下的連
09/09 12:58, 8F

09/09 12:58, 7年前 , 9F
續儲存格的最後一個,如有公式的話也會取到
09/09 12:58, 9F

09/09 12:59, 7年前 , 10F
從原po提供的連結來看,看不出是否有公式已在a欄內
09/09 12:59, 10F

09/09 14:33, 7年前 , 11F
按下ctrl+↓所得到的是10,沒有公式,下方連結是錄影。
09/09 14:33, 11F

09/09 14:33, 7年前 , 12F

09/09 14:33, 7年前 , 13F
感謝您
09/09 14:33, 13F
※ 編輯: yimean (123.195.98.141), 09/09/2018 14:36:13

09/09 14:36, 7年前 , 14F
那將index_row = fileA.ActiveSheet.Range("A1").
09/09 14:36, 14F

09/09 14:36, 7年前 , 15F
End(xlDown).Row 來抓看是否是10
09/09 14:36, 15F
※ 編輯: yimean (123.195.98.141), 09/09/2018 14:44:28

09/09 14:44, 7年前 , 16F
回文打的是end().row不是end().select
09/09 14:44, 16F

09/09 14:46, 7年前 , 17F
如果寫在這裡的話,上面thisworkbook.activate就回到b檔
09/09 14:46, 17F

09/09 14:46, 7年前 , 18F

09/09 14:47, 7年前 , 19F
with fileA...end with內不一定是作用活頁簿就是在a檔
09/09 14:47, 19F

09/09 14:47, 7年前 , 20F

09/09 14:48, 7年前 , 21F
喔喔喔 我改一下,Sorry
09/09 14:48, 21F

09/09 14:48, 7年前 , 22F
錯誤是,不是用range.select要用range.row來回傳列號給變
09/09 14:48, 22F

09/09 14:48, 7年前 , 23F
數index_row
09/09 14:48, 23F

09/09 14:49, 7年前 , 24F
所以有可能回傳17是因為作用活頁簿於b檔內
09/09 14:49, 24F

09/09 14:50, 7年前 , 25F

09/09 14:50, 7年前 , 26F
正確的寫進去第11列了
09/09 14:50, 26F

09/09 14:50, 7年前 , 27F
如果已經在with fileA...end with的話,則以 .activesheet
09/09 14:50, 27F

09/09 14:51, 7年前 , 28F
.range("a1").end(xldown).row,index_column亦同
09/09 14:51, 28F

09/09 14:51, 7年前 , 29F
太神奇了,所以,請教一下With所有作用的不是在指定範圍?
09/09 14:51, 29F

09/09 14:52, 7年前 , 30F
或是將作用活頁簿調整到a檔,於with fileA下方打上
09/09 14:52, 30F

09/09 14:52, 7年前 , 31F
這個觀念我不是很懂,如果是這樣With的功能不就弱化了?
09/09 14:52, 31F

09/09 14:52, 7年前 , 32F
.activate 這時作用活頁簿為a檔
09/09 14:52, 32F

09/09 14:54, 7年前 , 33F
with...end with是用來簡化語法用
09/09 14:54, 33F

09/09 14:56, 7年前 , 34F
當作用活頁簿為a檔時,就可以原本activesheet.range(..).
09/09 14:56, 34F

09/09 14:56, 7年前 , 35F
學到了一個技巧,感謝您。確實可以這樣使用。
09/09 14:56, 35F

09/09 14:57, 7年前 , 36F
end(xldown).select,index_row=selection.row來取得列號
09/09 14:57, 36F

09/09 14:58, 7年前 , 37F
所以如果後面要切回B檔時只要加上thisworkbook.activate
09/09 14:58, 37F

09/09 14:58, 7年前 , 38F
因此'=====寫入檔案====的這個部分也可不用with..end with
09/09 14:58, 38F

09/09 14:58, 7年前 , 39F
就可以了,對嗎?
09/09 14:58, 39F

09/09 14:59, 7年前 , 40F
就只要是fileA.activate那之後就都在a檔案內操作
09/09 14:59, 40F

09/09 14:59, 7年前 , 41F
也無需 .activesheet前面的.(點號)了
09/09 14:59, 41F

09/09 15:00, 7年前 , 42F
如原po所述,要回b檔時加上該activate來切回
09/09 15:00, 42F

09/09 15:04, 7年前 , 43F
感恩指導,謝謝。
09/09 15:04, 43F
文章代碼(AID): #1Rb99_FN (Office)
文章代碼(AID): #1Rb99_FN (Office)