2014-10-01 2 views
2

내 Excel 통합 문서의 몇 가지 VBA For Each 루프를 사용하고 있으며 루프가 32,766 행에 도달 한 후 어떤 이유로 런타임 오류가 발생합니다. 나는 이것이 Int/Long 타입 에러라고 생각했지만, 그것을 고치는 방법을 생각할 수 없다. 여기에 내 현재 코드입니다 :Excel VBA : Long 범위의 각 루프

' 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 

나는 범위로 일하고 있어요 때문에, 나는 아마 인터넷 용 변수의 특별한 유형이 긴 산맥 대 영역]이라고 생각하지만, 나는 광범위한 온라인을 수행 한 후 아무것도 찾을 수 없습니다 연구.

언제나 도움을 주시고 명확하지 않은 부분을 명확하게 설명해 드리겠습니다.

답변

5

직면하고있는 문제는 Range를 사용하거나 iterating하는 것과는 아무런 관련이 없습니다. 워크 시트에 추가 할 수있는 하이퍼 링크 필드의 수 제한 때문입니다. 제한은 약 65530입니다. 반복 당 두 개의 하이퍼 링크를 추가 했으므로 32766을 초과합니다.

workheet_click 이벤트를 사용하면 target.range를 사용하는 일부 코드가 실행되어 URL을 동적으로 만들 수 있습니다. 이 루프가하는 것처럼, 거기에 사용자를 보냅니다. 이는 큰 해결 방법은 아니지만 Excel의 한계를 감안할 때 할 수있는 최선의 방법입니다.

+0

나는 이것을 이해하려고 몇 시간 동안 내 머리를 감싸고 있었기 때문에 그렇게 많은 의미가 있습니다. 따라서 스프레드 시트는 일종의 통화 로그입니다. 각 행은 하나의 전화 통화를 나타냅니다. 두 개의 하이퍼 링크 중 하나는 오디오 파일을 듣는 방법으로 사용되고 다른 하나는 별도의 매크로 userform을 시작합니다. 나는 '전화 통화'링크를 위해 65,530 개의 링크를 사용하고, 사용자 폼을 시작하기 위해 모든 행에 매크로 버튼을 삽입하는 일종의 코드를 생각해 낼 수 있습니다. 왜이 한도가 존재합니까? – rchav9

+1

매크로 버튼 대신에'Worksheet_BeforeDoubleClick()'이벤트를 사용하는 것이 좋습니다. VB/매크로 편집기에서 워크 시트를 두 번 클릭하여 사용할 수 있습니다. 그런 다음 코드를 작성한 영역의 맨 위에있는 드롭 다운을 사용하여 "워크 시트"와 "BeforeDoubleClick"을 선택하십시오. 변수'Target'은 사용자가 더블 클릭 한 범위/셀을 저장합니다. 당신은 그것을 사용하여 당신의 URL을 형식화하고 어떤 프로그램에서 그것을 열 수 있습니다. – JNevill

+0

다시 한번 감사드립니다. 어떻게 진행되는지 알려 드리겠습니다. – rchav9

0

firstRow 또는 lastRow을 어디에도 선언하지 않았습니다. 이들은 처음 사용될 때 Integer Variant로 해석 될 것입니다.

명시 적으로 Long으로 선언하십시오. 그러면 정상이어야합니다.

모든 모듈의 맨 위에는 Option Explicit을 사용하는 것이 좋습니다. 이렇게하면 모든 변수를 명시 적으로 선언해야하므로이 유형의 오류가 발생할 수 없습니다.

+1

나는이 코드 스 니핏에 있지 않습니다. 나는 정말로 @ citizenkong이라는 의견을 고맙게 생각한다. – rchav9