使用工作表名称作为变量

时间:2018-05-18 09:36:49

标签: excel excel-vba vba

请有人帮帮我,我好像是在问我的问题?

我有一个包含4个工作表比较,Office1,Office2和Office3的工作簿。在比较表中,其他工作表名称列在A列中。在此工作表的B列中,我有一个按钮。

我想要做的是双击按钮(我已为此分类了代码),然后这将带您进入相应工作表上的单元格D5。

目前我有以下代码,但它似乎没有激活它使用比较表的Office表。

有谁可以让我知道我错过了什么?

由于

Sub OfficeSht()

Dim rCrit3 As Range
Dim wb As Workbook
Dim ws As Worksheet

With Application
    .EnableEvents = False
    .ScreenUpdating = False
End With

Set rCrit3 = ActiveCell.Offset(RowOffset:=0, ColumnOffset:=-2)
Debug.Print rCrit3
Set ws = rCrit3.Worksheet

ws.Activate
ActiveSheet.Range("D5").Select

Application.EnableEvents = True

End Sub

2 个答案:

答案 0 :(得分:1)

Application.Goto似乎合适,减少了实现目标的步骤。

Sub OfficeSht()
    Dim ws As string

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

    ws = ActiveCell.Offset(RowOffset:=0, ColumnOffset:=-2).value2
    Debug.Print "'" & ws & "'!D5"
    Application.Goto Reference:="'" & ws & "'!R5C4" '<~~ D5 in xlR1C1


    With Application
        .EnableEvents = true
        .ScreenUpdating = true
    End With

End Sub

您可能希望将其设为Worksheet_BeforeDoubleClick事件。

答案 1 :(得分:0)

你不会说出你有什么样的按钮,所以我举了几个例子。

所有示例中常见的一段代码是WorkSheetExists,它检查工作表名称是否与工作表相对应。

Public Function WorkSheetExists(SheetName As String) As Boolean

    Dim wrkSht As Worksheet

    On Error Resume Next
        Set wrkSht = Worksheets(SheetName)
        WorkSheetExists = (Err.Number = 0)
        Set wrkSht = Nothing
    On Error GoTo 0

End Function  

接下来是调用OfficeSht过程的三种方法。

如果您的按钮是ActiveX按钮并且在B列中,您可以使用:

Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

    OfficeSht Me.Shapes("CommandButton1").TopLeftCell

End Sub   

此代码返回对按钮所在的左上角单元格的引用 - 假设您的工作表名称是此左侧的一个单元格。

第二种方法是使用“表单”按钮。

Public Sub Button_Click()

    OfficeSht Me.Shapes(Application.Caller).TopLeftCell

End Sub  

同样,它返回对放置按钮的左上角单元格的引用。当您添加按钮时,只需将其分配给Button_Click过程。

第三种方式假设您的按钮实际上是一个格式化为按钮的单元格,或者您只想双击A列中的工作表名称并取消在B列中有一个按钮:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    OfficeSht Target

End Sub  

最后,您的代码选择单元格D5(第5行,第4列 - R5C4)。

如果您要点击,或参考的单元格在,B列:

Public Sub OfficeSht(ByVal Target As Range)

    Dim rLastCell As Range
    Dim rDataRange As Range

    Set rLastCell = Cells(Rows.Count, 1).End(xlUp)
    Set rDataRange = Range("A1", rLastCell)

    If Not Intersect(Target, rDataRange.Offset(, 1)) Is Nothing Then
        If WorkSheetExists(Target.Offset(, -1).Value) Then
            Application.Goto "'" & Target.Offset(, -1).Value & "'!R5C4"
        End If
    End If

End Sub

如果您要点击,或引用的单元格在,A列:

Public Sub OfficeSht(ByVal Target As Range)

    Dim rLastCell As Range
    Dim rDataRange As Range

    Set rLastCell = Cells(Rows.Count, 1).End(xlUp)
    Set rDataRange = Range("A1", rLastCell)

    If Not Intersect(Target, rDataRange) Is Nothing Then
        If WorkSheetExists(Target.Value) Then
            Application.Goto "'" & Target.Value & "'!R5C4"
        End If
    End If

End Sub

可能在那里有点胡扯......:)