2015-11-19 2 views
0

Когда наступает новый год, создается новый рабочий лист, а также таблица на этом новом рабочем листе. Я создал макрос для создания таблицы. Простая функция (как отдельный модуль) возвращает текущий год, поэтому новый лист получает свое имя, и я хотел назвать таблицу в этом новом листе с текущим годом, но он не работает должным образом. Когда я проверю имя таблицы после ее создания, это как _ 2016.Excel VBA: использование переменной в качестве имени таблицы

После создания таблицы макрос называет столбцы с моими именами, но он сбой с первым столбцом с ошибкой 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 
+0

Но все же, как я должен ссылаться на имя таблицы в этом макросе, который я записал, для изменения имен столбцов, поэтому я не получу ошибку 'method range of object _global failed'? – kkris77

+0

Ну, я не думаю, что это важно, поскольку таблица создана и получает имя. Конечно, в исходном макросе была таблица1 вместо Data.GetYear, но я предполагал, что такое изменение не имеет значения, поскольку функция возвращает строку. Даже использование Year (Date) не помогает при обращении к таблице. – kkris77

ответ

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 

И это все, что необходимо использовать переменную в качестве имени таблицы. Так просто и потребовалось столько времени, чтобы это решить.

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 
+0

Я загляну в него, но все равно, что черт не так с использованием строковой переменной в качестве имени таблицы? Когда код выглядит так: 'ActiveSheet.ListObjects.Add (xlSrcRange, Range (" $ B $ 8: $ F $ 8 "),, xlYes) .Name =" AAA ", Диапазон (" AAA [[# Headers], [ Kolumna1]] "). Выберите' отлично работает, но когда я пытаюсь использовать строковую переменную или даже Year (Date), линия диапазона выходит из строя. Я не понимаю, почему. Это сводит меня с ума! – kkris77

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 

НТН Zack Barresse

+0

Спасибо. Также обратите внимание на мой комментарий по предыдущему ответу от Jeeped. – kkris77