Excel VBA:使用变量作为表名

时间:2015-11-19 15:41:58

标签: excel vba function

当新的一年到来时,会创建新工作表,因此这个新工作表中的表格也是如此。我已经录制了一个宏来创建一个表。一个简单的函数(作为单独的模块)返回当前年份,因此新工作表得到它的名称,我想在这个新工作表中用当前年份命名该表,但它没有正常工作。当我在创建表名后检查它时,它就像_ 2016。

创建表格宏后,使用我的名字命名列,但是第一列崩溃时出现错误method range of object _global failed

我不确定如何正确传递函数的结果来命名表,并使用它来引用宏中的表来更改列名。 记录宏而不是:

Range("Data.GetYear[[#Headers],[Kolumna1]]").Select

有:

Range("Table1[[#Headers],[Kolumna1]]").Select

并且它起作用所以基本上问题是如何用变量替换Table1所以我可以轻松地引用表格,因为在工作簿中不能有多个具有相同名称的表。

Function GetYear() As String

GetYear = Format(Date, "yyyy")

End Function

创建表格:

ActiveSheet.ListObjects.Add(xlSrcRange, Range("$B$8:$F$8"), , xlYes).Name = Data.GetYear
    Range("Data.GetYear[[#Headers],[Kolumna1]]").Select
    ActiveCell.FormulaR1C1 = "Lp."
    Range("Data.GetYear[[#Headers],[Kolumna2]]").Select
    ActiveCell.FormulaR1C1 = "Data przychodu"
    Range("Data.GetYear[[#Headers],[Kolumna3]]").Select
    ActiveCell.FormulaR1C1 = "Kwota przychodu"
    Range("Data.GetYear[[#Headers],[Kolumna4]]").Select
    ActiveCell.FormulaR1C1 = "Podatek"
    Range("Data.GetYear[[#Headers],[Kolumna5]]").Select
    ActiveCell.FormulaR1C1 = "Dochód"
    Range("Data.GetYear[#All]").Select
    Selection.Columns.AutoFit
    Range("Data.GetYear[[#Headers],[Lp.]]").Select
    Selection.AutoFilter

3 个答案:

答案 0 :(得分:0)

我写了一个简短的Workbook_Open事件宏。如果新年份数据的工作表或表格不存在,则会自动创建它们。基本上,第一次在新的一年中打开工作簿时,将创建工作表和表。

您可以查看此工作代码,了解我如何处理Worksheet / ListObject命名以及填充表头。

Option Explicit

Private Sub Workbook_Open()
    On Error GoTo bm_New_Year_ws
    With Worksheets(Chr(95) & Year(Date))
        On Error GoTo bm_New_Year_tbl
        With .ListObjects(Format(Date, "\t\a\b\l\e0000"))
            .Parent.Select
            .Parent.Range("B9").Select
        End With
    End With

    GoTo bm_Safe_Exit

bm_New_Year_tbl:
    On Error GoTo 0
    With Worksheets(Chr(95) & Year(Date))
        .Range("B8:F8") = Array("Lp.", "Data przychodu", _
                                "Kwota przychodu", _
                                "Podatek", "Dochód")
        With .ListObjects.Add(xlSrcRange, .Range("B8:F9"), , xlYes)
            .Name = Format(Date, "\t\a\b\l\e0000")
            .Range.Columns.AutoFit
        End With
    End With
    On Error GoTo bm_Safe_Exit
    Resume
bm_New_Year_ws:
    On Error GoTo 0
    With Worksheets.Add(after:=Sheets(Sheets.Count))
        .Name = Chr(95) & Year(Date)
    End With
    On Error GoTo bm_Safe_Exit
    Resume
bm_Safe_Exit:

End Sub

答案 1 :(得分:0)

表名不能是纯数字。它们必须是文本,这就是为什么在带有下划线字符的数字之前允许作为表名,但只是数字不允许。

我建议找一些标准的命名约定,它是文本的,但却是需要的年份。一些例子可能是:

Table2015
2015Table
_2015
2015Data
2015Whatever...

这是我用来检查给定工作簿中是否存在表的例程......

Function TableExists(ByVal TableName As String, Optional ByVal TableSheet As Worksheet) As Boolean
'
' Returns True if a Table exists with the specified name on the specified (or active) sheet.
'
' Author:       Zack Barresse
'
' Syntax:       TableExists(TableName,[TableSheet])
'
' Parameters:   TableName. String. Required. Table name to check if it exists.
'               TableSheet. Worksheet. Optional. Worksheet to look for Table in. The active sheet
'               is used if not specified
'
    If TableSheet Is Nothing Then
        If ActiveSheet Is Nothing Then Exit Function
        Set TableSheet = ActiveSheet
    End If
    On Error Resume Next
    TableExists = CBool(Len(TableSheet.ListObjects(TableName).Name) <> 0)
    On Error GoTo 0

End Function

HTH Zack Barresse

答案 2 :(得分:0)

谷歌搜索更多的解决方案,我发现这一行:

Range("Data.GetYear[[#Headers],[Kolumna1]]").Select

应如下所示:

Range(Data.GetYear & "[[#Headers],[Kolumna1]]").Select

目前我的行看起来像这样:

Range(Nazwa & "[[#Headers],[Kolumna1]]").Select

其中Nazwa是一个简单的字符串函数:

Function Nazwa() As String

Nazwa = "Najem_" & Year(Date)

End Function

这就是将变量用作表名所必需的全部内容。这么简单,花了很多时间来解决这个问题。