2014-10-01 89 views
2

我正在使用幾個VBA For Excel循環中的Excel工作簿,出於某種原因,我的循環達到32,766行後出現運行時錯誤。我想這是一個Int/Long類型的錯誤,但我似乎無法弄清楚如何解決它。這裏是我當前的代碼:Excel VBA:對於長距離的每個循環

' Add Play Call hyperlinks 
Dim Rng As Range, Cell As Range 
Dim FileName As String 
Dim Bureau As String 
Dim CopiedFilesDirectory As String 
Dim AudioFilePath As String 

lastRow = Sheets("CallLog").Range("I" & Rows.Count).End(xlUp).Row 

Set Rng = Sheets("CallLog").Range("I" & firstRow & ":I" & lastRow) 

For Each Cell In Rng 

    FileName = Range("I" & Cell.Row).Value 
    MatterNumber = Replace(Range("K" & Cell.Row).Value, "/", "-") 
    ContactUsername = Range("M" & Cell.Row).Value 
    Bureau = Range("N" & Cell.Row).Value 

    CopiedFilesDirectory = ImportCallsUserForm.CopyFilesDirectoryTextBox.Value 
    AudioFilePath = CopiedFilesDirectory & Bureau & "\" & ContactUsername & "\" & MatterNumber & "\" & FileName & ".flac" 

    With Worksheets("CallLog") 
     .Hyperlinks.Add Anchor:=.Range("S" & Cell.Row), _ 
      Address:=AudioFilePath, _ 
      ScreenTip:="Click to play call", _ 
      TextToDisplay:="Play Call" 
     .Hyperlinks.Add Anchor:=.Range("T" & Cell.Row), _ 
      Address:="", _ 
      ScreenTip:="Click to write a summary", _ 
      TextToDisplay:="Write Call Summary" 
    End With 

Next Cell 

由於我與範圍的工作,我想,也許有一種特殊類型的int變量的範圍與長距離,但做大量的在線後,我找不到任何東西研究。

任何幫助總是值得讚賞,我很樂意澄清任何不清楚的事情。

回答

5

你面臨的問題與Range無關,或者迭代它。這是由於可以添加到工作表中的超鏈接字段數量的限制。限制爲65530左右。由於您每次迭代都添加兩個超鏈接,因此您最多隻能使用32766.

您可以通過使用一個worksheet_click事件觸發一些使用target.range的代碼動態創建URL來解決此問題,像這個循環所做的那樣,並將用戶發送到那裏。這不是一個很好的解決方法,但是鑑於Excel的侷限性,這是最好的。

+0

這樣做很有道理,因爲我一直在試圖弄清楚這幾個小時的時間,所以我的電子表格是各種通話記錄,每行代表一個電話。兩個超鏈接中的一個用作偵聽音頻文件的方式,另一個則啓動單獨的宏用戶窗體。我可能只是使用「Play call」鏈接的65,530鏈接,然後想出一些代碼來在每一行插入宏按鈕來啓動用戶窗體。爲什麼這個限制存在? – rchav9 2014-10-01 14:21:40

+1

而不是宏按鈕,我會強烈建議使用'Worksheet_BeforeDoubleClick()'事件。您可以通過雙擊VB /宏編輯器中的工作表來使用它。然後使用您編寫代碼的區域頂部的下拉列表,選擇「工作表」和「BeforeDoubleClick」。變量「Target」將保存用戶雙擊的範圍/單元格。你可以使用它格式化你的URL並在任何程序中打開它。 – JNevill 2014-10-01 14:28:36

+0

太好了,再次感謝@JNevill。我會讓你知道它是怎麼回事。 – rchav9 2014-10-01 14:30:52

0

您還沒有在任何地方聲明firstRowlastRow。這些將在第一次使用時被解釋爲整型變量。

聲明這些顯式爲Long,你應該沒問題。

在每個模塊的頂部也使用Option Explicit是一個好主意 - 這迫使您顯式聲明所有變量,因此不會發生此類錯誤。

+1

我有,只是不在這個代碼snipit。我真的很感激@citizenkong的意見。 – rchav9 2014-10-01 14:31:47