【问题标题】:Why is VBA not recognising my sheet name? Subscript out of range为什么 VBA 无法识别我的工作表名称?下标超出范围
【发布时间】:2021-04-09 10:01:08
【问题描述】:

我正在尝试创建一个宏来过滤从我们的数据库中导出的内容,将过滤后的结果复制到不同的工作表,然后将这些新工作表中的数据复制到另一个工作簿以进行进一步处理。我一直在使用来自 SO 的代码,但现在我正在尝试将这两个元素结合起来(过滤到新工作表,复制到工作簿)我遇到了一些作为新手我无法解决的问题!

每次运行宏时,我都会在此行收到“下标超出范围”错误:

Set NAVImperial = NAVExport.Sheets("ROMAN IMPERIAL")

即使肯定有一个具有此名称的工作表。这与使用 ThisWorkbook 有关吗?

提前致谢!

Sub Sortcodingv2()


Application.ScreenUpdating = False
Dim x As Range
Dim rng As Range
Dim last As Long
Dim sht As String

'specify sheet name in which the data is stored
sht = "236"

'change filter column in the following code
last = Sheets(sht).Cells(Rows.Count, "C").End(xlUp).Row
Set rng = Sheets(sht).Range("A1:O" & last)

Sheets(sht).Range("C1:C" & last).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("AA1"), Unique:=True

For Each x In Range([AA2], Cells(Rows.Count, "AA").End(xlUp))
With rng
.AutoFilter
.AutoFilter Field:=3, Criteria1:=x.Value
.SpecialCells(xlCellTypeVisible).Copy

Sheets.Add(After:=Sheets(Sheets.Count)).Name = x.Value
ActiveSheet.Paste
End With
Next x

' Turn off filter
Sheets(sht).AutoFilterMode = False

With Application
.CutCopyMode = False
.ScreenUpdating = True
End With


Dim NAVExport As Workbook
Set NAVExport = ThisWorkbook


' Roman Imperial
Dim NAVImperial As Worksheet
Dim LIVEImperial As Workbook
Dim LIVEImperialSheet As Worksheet

Dim UniqueIDs As Range
Dim Descriptions As Range
Dim LastRow As Long

Application.ScreenUpdating = False

Set NAVImperial = NAVExport.Sheets("ROMAN IMPERIAL")
Set LIVEImperial = Workbooks.Open("\\WDMYCLOUDEX2\Public\Sortcoding\Roman Imperial.xlsm")
Set LIVEImperialSheet = LIVEImperial.Sheets("LIVE Data")

With NAVImperial
  LastRow = NAVImperial.Cells(Rows.Count, "A").End(xlUp).Row
End With

Set UniqueIDs = NAVImperial.Range("B2:B" & LastRow)
Set Descriptions = NAVImperial.Range("F2:F" & LastRow)

UniqueIDs.Copy
LIVEImperialSheet.Range("A2").PasteSpecial xlPasteValues
Descriptions.Copy
LIVEImperialSheet.Range("B2").PasteSpecial xlPasteValues
Application.CutCopyMode = False

LIVEImperialSheet.Range("C2:O" & LastRow).FillDown

LIVEImperial.Close True

Application.ScreenUpdating = True

【问题讨论】:

  • 作为测试,尝试 NAVExport = activeWorkbook.Name 然后向下,Workbooks(NAVExport).Sheets("ROMAN IMPERIAL") 我倾向于不使用“set”并直接(或间接)使用名称通过“表格(表格名称1)”,其中表格名称1 =“罗马帝国”)。但这对我来说可能是不好的做法!
  • ThisWorkbook 是其中包含代码的工作簿 - 这就是您的意思吗?
  • 肯定是“罗马帝国”而不是“罗马帝国”? (多余的空格)

标签: excel vba


【解决方案1】:

问题可能是名称不完全匹配,这就是为什么我更愿意尽可能避免使用 Sheets("Name")。

如果 NAVExport 是 ThisWorkbook,则可以使用其项目名称引用其所有工作表,避免使用 Sheets("Name")。如果您打开项目资源管理器 (Ctrl+R)。您应该会在 Microsoft Excel 对象下看到工作表列表。默认名称为 Sheet1、Sheet2、Sheet3 等。找到括号中名称为 ROMAN IMPERIAL 的名称,即您要引用的表单。

那么,你在写代码的时候可以直接写Sheet1.Cells(...或者Sheet1.Range(...,就不用写Sheets("ROMAN IMPERIAL")了。

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多