有时不会获得VBA Excel Codename

时间:2016-05-11 07:35:43

标签: excel vba ms-office

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不起作用)。

寻求帮助

1 个答案:

答案 0 :(得分:0)

正如@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

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