有时未获取 VBA Excel 代号

Posted

技术标签:

【中文标题】有时未获取 VBA Excel 代号【英文标题】:VBA Excel Codename not acquired sometimes 【发布时间】:2016-05-11 07:35:42 【问题描述】:
Set tablesheet = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ActiveSheet.Index))
KodoveJmeno = ThisWorkbook.VBProject.VBComponents(tablesheet.CodeName).Properties("Codename")
ThisWorkbook.VBProject.VBComponents(KodoveJmeno).CodeModule.AddFromString _ "Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)" + Chr(10) _ + "Application.ScreenUpdating = False" + Chr(10) _ + "Call Trideni.Serad(Target, ActiveCell.ListObject.Name)" + Chr(10) _ + "Application.ScreenUpdating = True" + Chr(10) _ + "End Sub"

第二个命令停止于:

运行时错误“9”:下标超出范围

但在 F5 之后它继续没有问题 - 看起来 BUG 已经存在多年(Office 2003-2016)!有什么解决办法吗?

有时它可以工作 - 在我删除工作表后,使用 alt+F11 打开和关闭 VBA,但有时它会损坏并且一直非常烦人,会破坏生产性工作。

在某些计算机上一切正常,在某些计算机上却出现错误。看起来是内部 excel 程序与 VBA 通信同步的问题或类似的问题(VBA 中的睡眠、等待或 alt+f11 不起作用)。

谢谢帮助

【问题讨论】:

你想做什么? 双击排序 我会在您的工作簿中添加一个隐藏的工作表,其中包含正确的代码并复制该工作表。或者,使用 ThisWorkbook 中的 Workbook_SheetBeforeDoubleClick 事件。 问题是所需的工作表甚至会重新创建 100 次,因此代号一直在变化。而且我们需要自动创建更多工作表,而不仅仅是根据需要更改其结构的工作表。 【参考方案1】:

正如@jkpieterse 建议的那样 - 使用隐藏的工作表。

创建一个模板表并为其指定代号shtTemplate。 将此代码添加到工作表(注意键范围选择可能会更好):

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    With ActiveSheet
        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:= _
            Range(Selection.CurrentRegion.Offset(, Selection.Column - Selection.CurrentRegion.Resize(, 1).Column).Resize(, 1).Address) _
            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        With .Sort
            .SetRange Range(Selection.CurrentRegion.Address)
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    End With
End Sub

添加一个普通代码模块并添加此代码:

Public Sub CreateSheet()

    Dim wrkSht As Worksheet

    shtTemplate.Visible = xlSheetVisible
    shtTemplate.Copy ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
    Set wrkSht = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
    shtTemplate.Visible = xlSheetVeryHidden 'Hide the template sheet so only VBA can unhide it.

    wrkSht.Name = "Copied Sheet"

End Sub

您需要添加一些内容来为新工作表提供正确的唯一名称。双击排序将适用于您创建的每张工作表。

【讨论】:

谢谢,这看起来像是该错误的解决方案/解决方法,我们将使用它。那么这个错误真的是一个错误还是只是一个典型的微软“功能”?

以上是关于有时未获取 VBA Excel 代号的主要内容,如果未能解决你的问题,请参考以下文章

excel vba中如何获取筛选数据的正确行号

Excel VBA - 循环未正确添加数据

Excel vba 运行时错误 91 对象变量或未设置块

如何获取 VBA MsgBox 的窗口句柄?

用Excel中的vba获取网页内容填写网页表单

vba excel怎么获取指定工作表的行数、列数