2017-08-23 271 views
0

我想寫一個宏,打開另一個工作簿,運行一個宏來獲取一些數據,將數據複製到第一個工作簿並關閉第二個工作簿。等待,直到application.run完成

我已經然而遇到一個問題,因爲它似乎是該範圍的選擇,而在第二工作簿中的宏仍在運行時執行,並且因此選擇整個柱:

即,在下面的代碼的ws2.Range(StartCell, ws2.Cells(LastRow, "A")).Select串選擇整個列,而不僅僅是存在數據的單元格。

'run macro in IB API file to get portfolio data 
Application.Run "TwsDde.xls!Sheet15.subscribeToPorts" 

'select data in column A from IB API file 
Dim LastRow As Long 
Dim StartCell As Range 
Set StartCell = Range("A8") 
LastRow = ws2.Cells(ws2.Rows.Count, StartCell.Column).End(xlDown).Row 
ws2.Range(StartCell, ws2.Cells(LastRow, "A")).Select 

有沒有人遇到過這個問題,或者對如何解決它的任何想法?

+1

'Application.Run'預計會返回被調用宏(這裏是'subscribeToPorts')返回的值,所以它本身不是一個異步調用。宏內部是否有異步調用? –

+0

被調用的宏由代理開發,它所做的就是從我的投資組合中將數據導入到Excel中。你有什麼建議可以解決這個問題嗎? –

回答

2

你對LastRow的計算是錯誤的。它應該是xlUp而不是xlDown

+2

還有另外一個問題:它引用了'StartCell.Column',它引用了'Set StartCell = Range(「A8」)',它與'Set StartCell = ActiveSheet.Range(「A8」)'完全相同, '設置StartCell = ws2.Range(「A8」)'安全工作,沒有問題。這是一個很好的做法*從不*假設工作表,並引用每個'.Range','.Rows','.Columns','.Cells'等特定工作表。 –

+0

我已經使用了xlDown,因爲我想從A8中選擇並複製所有內容 - 是否錯誤? 我試圖改變StartCell.Column,但這並沒有解決問題 –

+0

是的,那麼你犯了一個錯誤。爲了實現你所說的你應該做'LastRow = StartCell.End(xlDown).Row'(這意味着「從'StartCell'下到數據塊的末尾並從該單元格取出行號」)。 –