2011-08-24 107 views
2

本質上,我有一個Updata按鈕,可以從兩個電子表格(1本書內)的兩列獲取信息。此代碼的總體目標是從一列中獲取所有值,然後在其下方的另一列中追加值。Excel中的VBA代碼隨機停止執行。沒有錯誤信息

Worksheets("Overall Flow").Range("A4:A1004").Value = Worksheets("Active").Range("A2:A1002").Value 
Dim i As Integer 
For i = 4 To 1004 
    If Worksheets("Overall Flow").Range("A" & Trim(str(i))) = "" Then 
     Worksheets("Overall Flow").Range("A" & Trim(str(i)) & ":A" & Trim(str(1000 + i))).Value = Worksheets("Inactive").Range("A2:A1002").Value 
     i = 1005 
    End If 
Next 

出於某種原因,第一行執行,然後結束。當我放置斷點時,然後一步一步地做,之後再沒有其他步驟發生。

當我單獨運行的第一線,這似乎很好地工作,而不是在:

Worksheets("Overall Flow").Range("A" & Trim(str(i)) & ":A" & Trim(str(1000 + i))).Value = Worksheets("Inactive").Range("A2:A1002").Value 

Worksheets("Overall Flow").Range("A4:A1004").Value = Worksheets("Inactive").Range("A2:A1002").Value 

存在aftwards。

+1

實際上您有3個電子表格:「總體流量」,「活動」和「非活動」。當我運行這個時,它可以正常工作......假設它正在做你認爲應該做的事情。它遍歷A4:A1004中的每個單元格,當單元格爲空白時,它將來自非活動表格的值複製到「Overall Flow」表格的最後一行,然後結束程序。不知道你在做什麼,但代碼爲我運行。如果它的語法正確,你不會得到任何錯誤。你能更具體地說明它應該做什麼以及你的3張牀單是什麼樣的? – transistor1

+0

這正是它應該如此。它第一次運作。但之後,它就停止了工作。 – Mike

+0

這可能是因爲從A4:A1004範圍內的「整體流程」工作表中不再有任何空白單元格從「非活動」工作表複製(除非「非活動」工作表也具有空白單元格)? – transistor1

回答

1

這就是我用來測試你的代碼。由於我不知道電子表格中的內容,因此我無法完全重現您所看到的內容,所以我首先將虛擬數據放入範圍中。

對我來說是一次比一次運行,我已經試過了2級不同的計算機 - Excel 2003中,和Excel 2010

我設置斷點,並與F8加強,同時也按住Shift鍵F8無一不工作得很好。

有些東西可能與您的數據不同(也就是說,從非活動表複製的第一個單元格是空白的,因此在處理完第一個單元格後停止執行 - 檢查A4列是否不爲空),或者某些內存有因辦公室被殺而敗壞。

在一個模塊,我有:

Sub test() 
    Worksheets("Active").Range("A2:A1002").Value = "active" 
    Worksheets("Active").Range("A5").Value = "" 
    Worksheets("Inactive").Range("A2:A1002").Value = "inactive" 

    Worksheets("Overall Flow").Range("A4:A1004").Value = Worksheets("Active").Range("A2:A1002").Value 
    Dim i As Integer 
    For i = 4 To 1004 
     If Worksheets("Overall Flow").Range("A" & Trim(Str(i))) = "" Then 
      Worksheets("Overall Flow").Range("A" & Trim(Str(i)) & ":A" & Trim(Str(1000 + i))).Value = Worksheets("Inactive").Range("A2:A1002").Value 
      i = 1005 
     End If 
    Next 
End Sub 

您是否嘗試過另一臺計算機上相同的代碼?

+1

我認爲這是回憶的內存。我在這裏嘗試了每個人的代碼,但它不起作用(仍然在Active - > Overall Flow副本之後終止)。我最終刪除了表單,然後重新制作了它。事後似乎一切正常。 – Mike

+0

可能是一本腐敗的工作簿,如果您刪除了該工作表並將其重新制作好了......很高興聽到它正在工作! – transistor1

2

更新:調整了代碼(現在錯誤檢查!)關於當前的代碼

要點:

  • 當複製的活動範圍,檢查上次使用連續的單元格。這比循環更快更有效。
  • 爲什麼要修剪一個你知道不包含空格的數字?
  • 有沒有必要設置i = 1005,只需使用退出。這對讀者來說是更有效和清楚的。我不在下面的代碼中使用它,因爲我完全避免了循環。

這裏有一個不同的方式,你可以做到這一點沒有任何循環,我認爲這是更清晰和有效。試試這個,看看它是否適合你:

Sub test() 

Dim lastRow As Long, offSet As Long 
lastRow = Worksheets("Active").Range("A2").End(xlDown).row 

'Sanity checks 
If IsEmpty(Worksheets("Active").Range("A2")) = True Then offSet = 1: lastRow = 2 
If lastRow > 1001 Then lastRow = 1002 

Worksheets("Overall Flow").Range("A4:A" & lastRow + 2).Value = _ 
Worksheets("Active").Range("A2:A" & lastRow).Value 

If lastRow < 1002 Then 
    Worksheets("Overall Flow").Range("A" & lastRow + (3 - offSet) & _ 
    ":A1004").Value = Worksheets("Inactive").Range("A2:A1002").Value 
End If 

End Sub 

注意

  • 完整性檢查1是,如果A2是在Active片空白。
  • 完整性檢查2適用於A1002以外的單元格在活動工作表中的值。
+0

我通常用C#和C++編寫程序,所以當我問朋友VB中有什麼突破時,他說沒有任何(我無辜地相信他。)。 雖然我喜歡你的代碼。很好,很乾淨,謝謝。 – Mike

0

它已經在晶體管1的答案中提到,但只作爲一個方面的評論。

我有一個類似的問題,VBA代碼只是停止在函數中間執行。在此之前,它還跳回了幾行代碼。沒有顯示錯誤信息。

我關閉了所有打開的Excel程序,並在重新打開文件後,再次正常工作。

所以我確認回答這個問題是:損壞的內存,重新啓動Excel

編輯:這樣做後,我也遇到了Visual Basic編輯器崩潰時,我試圖取消註釋一個特定的行的問題。所以我創建了一個新的Excel文件並複製了我的代碼。現在我沒有任何問題了。

0

對此的解決方案非常不尋常。

CTRL + BREAK CTRL + BREAK CTRL + BREAK ESC

它只是發生在我身上againg很長一段時間後,我一直在尋找一個解決方案,我來到這裏,那麼這個序列回到了我的腦海裏,我試過了。

它爲我工作,我希望這會幫助某人。

0

我遇到了這個問題,我將其跟蹤到了在條件格式中使用的自定義VBA函數,這是在application.screenupdating設置爲True時處理的。

我不確定這種行爲有多一致,但是當在條件格式規則中引用自定義VBA函數時,當屏幕更新時,即使採用斷點或調試時也不會遍歷代碼.assert方法。這裏是發生了什麼故障:

語境:

  • 2打開的工作簿。
  • 有問題的條件格式和自定義函數在workbook1中。
  • 我試圖執行的代碼是在workbook2中。

過程

  1. 我稱之爲workbook2的過程。
  2. Workbook2的過程到達執行自動過濾器命令的行。
  3. 自動篩選命令觸發所有打開的工作簿屏幕更新(即觸發Worksheet_Change或Worksheet_Calculate事件可以在這裏申請任何命令)。
  4. 屏幕更新處理條件格式設置規則,包括調用workbook1的自定義函數的workbook1中的規則。
  5. 自定義函數以「無聲」狀態運行(即不與用戶交互,忽略斷點和「debug.assert」調用;這似乎是設計作爲條件格式化功能的一部分)
  6. 自定義函數完成執行,並且停止所有其他活動代碼執行。

我固定我的問題通過在啓動,防止屏幕更新添加Application.ScreenUpdating =假線,並推而廣之,條件格式處理(但最好從條件格式開始跟上定製功能遠)。

我不確定這是否與您的情況有關,但我希望它可以幫助某人。