【问题标题】:Subscript Out of Range, even though value is defined下标超出范围,即使值已定义
【发布时间】:2012-04-17 17:30:18
【问题描述】:

我正在编写一段代码,将 Excel 工作表上的选定数据传输到一个数组中,然后使用该数组在新的电子表格上打印数据。但是,我收到“下标超出范围”错误,即使在我滚动 selectArr(i - 1) 时出现了一个值。这是我的代码:

Sub Marascuilo()
    Dim numRows As Integer 'Number of rows selected
    numRows = Selection.Rows.Count
    Dim selectArr() As Double 'Array containing numbers from selected cells
    selectArr = loadArr(numRows) 'Load values into array
    For i = 2 To UBound(selectArr) - LBound(selectArr) + 2
        Sheets("Sheet 4").Cells(i, 2).Value = selectArr(i - 1)
    Next
End Sub

'This function loads the values from the selected cells into selectArr.
Function loadArr(numRows) As Double()
    Dim ResultArray() As Double
    r = 1
    For Each v In Selection
        ReDim Preserve ResultArray(1 To r)
        If v <> "" Then
            ResultArray(r) = v.Value
            r = r + 1
        End If
    Next
    loadArr = ResultArray
End Function

关于如何解决此问题的任何想法?

谢谢!

【问题讨论】:

  • 您确定问题出在 selectArr(i - 1) 而不是 Sheets("Sheet 4").Cells(i, 2) 上吗?
  • 不确定 excel 中的操作顺序也许你需要这个...For i = 2 To (UBound(selectArr) - LBound(selectArr) + 2)
  • 我同意托德的观点。我感觉Sheets("Sheet 4") 应该是Sheets("Sheet4") :)
  • 就是这样!非常感谢你!我盯着这个东西看了一个小时,试图弄清楚我搞砸了什么......

标签: vba excel


【解决方案1】:

您可以考虑使用工作表的 CodeName,而不是使用 Sheets("Sheet 4")。如果您查看 Project Explorer 窗口,每个工作表都有一个 Name 和一个 CodeName。它可能看起来像这样

Sheet1 (Sheet1)
Sheet2 (Sheet2)

第一个是 CodeName(无法从 UI 更改)。括号中的一个是选项卡名称。在 Project Explorer 中选择工作表,然后按 F4 打开 Properties 对话框。转到 (Name) 属性(名称不佳的属性)并将其更改为有意义的内容。我更改了所有工作表的代码名称并使用 wsh 前缀。我作为日志的工作表的 CodeName 为

wshLog

现在我可以在我的代码中使用 wshLog 并获得一些好处。首先是如果有人在 UI 中重命名工作表,代码仍然有效。第二个是我可以输入 wshlog(全部小写),VBE 会将其更改为 wshLog,并且我得到了我拼写正确的视觉提示。最后,我的代码更具可读性,例如 wshFinalReport 与 Sheets("Sheet1")。

【讨论】:

    猜你喜欢
    • 2021-05-02
    • 2015-05-27
    • 1970-01-01
    • 2021-09-18
    • 2012-04-28
    • 2017-01-18
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多