【问题标题】:Excel VBA: For Each loop for Long RangeExcel VBA:对于长距离的每个循环
【发布时间】:2014-10-01 13:53:26
【问题描述】:

我正在使用 Excel 工作簿中的几个 VBA For Each 循环,由于某种原因,在我的循环达到 32,766 行后出现运行时错误。我认为这是一个 Int/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

由于我正在使用范围,我认为可能存在一种特殊类型的变量用于 Int Ranges 与 Long Ranges,但经过广泛的在线研究后我找不到任何东西。

我们总是感谢任何帮助,我很乐意帮助澄清任何不清楚的地方。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    您面临的问题与 Range 或迭代它无关。这是由于您可以添加到工作表中的超链接字段数量的限制。限制在 65530 左右。由于每次迭代添加两个超链接,因此您将在 32766 处达到最大值。

    您可以通过让 worksheet_click 事件触发一些使用 target.range 动态创建 URL 的代码来解决此问题,就像这个循环所做的那样,并将用户发送到那里。这不是一个很好的解决方法,但鉴于 Excel 的局限性,这是您能做的最好的。

    【讨论】:

    • 这很有意义,因为我已经绞尽脑汁数小时试图弄清楚这一点。所以我的电子表格是一个通话记录,每一行代表一个电话。两个超链接之一用作收听音频文件的一种方式,另一个启动单独的宏用户窗体。我可能只是将 65,530 个链接用于“播放通话”链接,然后想出某种代码在每一行上插入宏按钮以启动用户窗体。为什么会有这个限制?
    • 我强烈建议使用Worksheet_BeforeDoubleClick() 事件而不是宏按钮。您可以通过双击 VB/宏编辑器中的工作表来使用它。然后使用您编写代码的区域顶部的下拉菜单,选择“工作表”和“BeforeDoubleClick”。变量Target 将保存用户双击的范围/单元格。您可以使用它格式化您的 URL 并在任何程序中打开它。
    【解决方案2】:

    您尚未在任何地方声明 firstRowlastRow。这些在第一次使用时可能会被解释为整数变体。

    将这些明确声明为Long,应该没问题。

    在每个模块的顶部也使用Option Explicit 是个好主意 - 这会强制您显式声明所有变量,因此不会发生这种类型的错误。

    【讨论】:

    • 我有,只是不在此代码片段中。我真的很感谢您的意见,@citizenkong。
    猜你喜欢
    • 2021-07-05
    • 2016-02-26
    • 2014-01-25
    • 1970-01-01
    • 2018-02-13
    • 2018-10-09
    • 1970-01-01
    • 2023-04-02
    • 2018-04-05
    相关资源
    最近更新 更多