excel中的VBA参考表名称

问题描述:

我们有一大堆表单的excel文件。第一个表单是一个“搜索页面”的东西......我们想要输入我们正在查找的电子表格的名称(例如在单元格A1中),然后会自动弹出正确的电子表格(在同一个文件中) 。excel中的VBA参考表名称

我试过了,但它并没有在所有的工作:在当前工作簿中的所有工作表

Function ActivateWB(wbname As String) 
    'Open wbname. 
    Workbooks(wbname).Activate 
End Function 

两个代码设置如下

  1. 添加一个完整的超链接Table of Contents
  2. 为您重新寻找一个特定纸张问题由A1上的第一张喜JumpSheet“代码简称(在底部)

Sample TOC

创建TOC

Option Explicit 

Sub CreateTOC() 
Dim ws As Worksheet 
Dim nmToc As Name 
Dim rng1 As Range 
Dim lngProceed As Boolean 
Dim bNonWkSht As Boolean 
Dim lngSht As Long 
Dim lngShtNum As Long 
Dim strWScode As String 
Dim vbCodeMod 

'Test for an ActiveWorkbook to summarise 
If ActiveWorkbook Is Nothing Then 
    MsgBox "You must have a workbook open first!", vbInformation, "No Open Book" 
    Exit Sub 
End If 

'Turn off updates, alerts and events 
With Application 
    .ScreenUpdating = False 
    .DisplayAlerts = False 
    .EnableEvents = False 
End With 

'If the Table of Contents exists (using a marker range name "TOC_Index") prompt the user whether to proceed 
On Error Resume Next 
Set nmToc = ActiveWorkbook.Names("TOC_Index") 
If Not nmToc Is Nothing Then 
    lngProceed = MsgBox("Index exists!" & vbCrLf & "Do you want to overwrite it?", vbYesNo + vbCritical, "Warning") 
    If lngProceed = vbYes Then 
     Exit Sub 
    Else 
     ActiveWorkbook.Sheets(Range("TOC_Index").Parent.Name).Delete 
    End If 
End If 
Set ws = ActiveWorkbook.Sheets.Add 
ws.Move before:=Sheets(1) 
'Add the marker range name 
ActiveWorkbook.Names.Add "TOC_INDEX", ws.[a1] 
ws.Name = "TOC_Index" 
On Error GoTo 0 

On Error GoTo ErrHandler 

For lngSht = 2 To ActiveWorkbook.Sheets.Count 
    'set to start at A6 of TOC sheet 
    'Test sheets to determine whether they are normal worksheets 
    ws.Cells(lngSht + 4, 2).Value = TypeName(ActiveWorkbook.Sheets(lngSht)) 
    If TypeName(ActiveWorkbook.Sheets(lngSht)) = "Worksheet" Then 
     'Add hyperlinks to normal worksheets 
     ws.Hyperlinks.Add Anchor:=ws.Cells(lngSht + 4, 1), Address:="", SubAddress:="'" & ActiveWorkbook.Sheets(lngSht).Name & "'!A1", TextToDisplay:=ActiveWorkbook.Sheets(lngSht).Name 
    Else 
     'Add name of any non-worksheets 
     ws.Cells(lngSht + 4, 1).Value = ActiveWorkbook.Sheets(lngSht).Name 
     'Colour these sheets yellow 
     ws.Cells(lngSht + 4, 1).Interior.Color = vbYellow 
     ws.Cells(lngSht + 4, 2).Font.Italic = True 
     bNonWkSht = True 
    End If 
Next lngSht 

'Add headers and formatting 
With ws 
    With .[a1:a4] 
     .Value = Application.Transpose(Array(ActiveWorkbook.Name, "", Format(Now(), "dd-mmm-yy hh:mm"), ActiveWorkbook.Sheets.Count - 1 & " sheets")) 
     .Font.Size = 14 
     .Cells(1).Font.Bold = True 
    End With 
    With .[a6].Resize(lngSht - 1, 1) 
     .Font.Bold = True 
     .Font.ColorIndex = 41 
     .Resize(1, 2).EntireColumn.HorizontalAlignment = xlLeft 
     .Columns("A:B").EntireColumn.AutoFit 
    End With 
End With 

'Add warnings and macro code if there are non WorkSheet types present 
If bNonWkSht Then 
    With ws.[A5] 
     .Value = "This workbook contains at least one Chart or Dialog Sheet. These sheets will only be activated if macros are enabled (NB: Please doubleclick yellow sheet names to select them)" 
     .Font.ColorIndex = 3 
     .Font.Italic = True 
    End With 
    strWScode = "Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)" & vbCrLf _ 
       & "  Dim rng1 As Range" & vbCrLf _ 
       & "  Set rng1 = Intersect(Target, Range([a6], Cells(Rows.Count, 1).End(xlUp)))" & vbCrLf _ 
       & "  If rng1 Is Nothing Then Exit Sub" & vbCrLf _ 
       & "  On Error Resume Next" & vbCrLf _ 
       & "  If Target.Cells(1).Offset(0, 1) <> ""Worksheet"" Then Sheets(Target.Value).Activate" & vbCrLf _ 
       & "  If Err.Number <> 0 Then MsgBox ""Could not select sheet"" & Target.Value" & vbCrLf _ 
       & "End Sub" & vbCrLf 

    Set vbCodeMod = ActiveWorkbook.VBProject.VBComponents(ws.CodeName) 
    vbCodeMod.CodeModule.AddFromString strWScode 
End If 

'tidy up Application settins 
With Application 
    .ScreenUpdating = True 
    .DisplayAlerts = True 
    .EnableEvents = True 
End With 

ErrHandler: 

    If Err.Number <> 0 Then MsgBox Err.Description & vbCrLf & "Please note that your Application settings have been reset", vbCritical, "Code Error!" 
    End Sub 

跳转表

Sub JumpSheet() 
    Dim ws As Worksheet 
    On Error Resume Next 
    Set ws = Sheets(Sheets(1).[a1].Value) 
    On Error GoTo 0 
    If Not ws Is Nothing Then 
     Application.Goto ws.[a1] 
    Else 
     MsgBox "Sheet not found", vbCritical 
    End If 
End Sub 
+1

谢谢,这真的很有用:) – 2012-01-15 02:08:27

迭代并激活一个恰当名字。这里有一些代码应该给你的想法,你可以把它放在你的搜索表的代码部分,并将它与按钮的“Clicked”事件相关联。

Option Explicit 

Sub Search_Click() 
    Dim sheetName As String, i As Long 
    sheetName = Range("A1") 

    For i = 1 To ThisWorkbook.Sheets.Count 
     If ThisWorkbook.Sheets(i).Name = sheetName Then 
      ThisWorkbook.Sheets(i).Activate 
      Exit For 
     End If 
    Next 
End Sub 
+0

感谢@doc BROWM:我刚才已经给了它一个尝试。例如,如果我有a,b,c,d和e五个电子表格,在A1中,我可以键入“a”,然后打开电子表格“a”。所以我不明白带有Search_Click的部分,没有点击任何地方?! ...或者我错过了什么? – 2012-01-14 10:23:03

+0

@kim yr:无论如何,你可以调用sub,但不知何故电子表格的用户必须运行这个东西。我个人认为让用户猜测某个地方有一些可以通过“工具/宏”运行的宏隐藏是有点不方便的。因此,作为建议,*您可以在电子表格上放置*按钮并将其与此搜索代码关联。 – 2012-01-15 07:47:47

我只是困惑的问题。您是否尝试打开工作簿或工作表?

如果你想浏览与工作簿, 例如到工作表 工作表( “Sheet2的”)激活