从具有特定名称和添加列的工作表上的数据创建表

时间:2013-07-11 13:55:54

标签: excel excel-vba excel-2010 vba

我有很多来自CSV的导入工作表。数据包括基于UNIX纪元的时间戳。每次导入新工作表时,我都需要添加一列来将时间戳转换为人类可读时间。

我使用记录宏来开始并得到了这个结果:

Sub addnamedtable()
'
' addnamedtable Macro
' Takes the imported data, converts it to a table and then adds a column which uses a formula to read the epoch based date stamp
'
    Range("A1:N5614").Select
    ActiveSheet.QueryTables("Temp6").Delete
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$N$5614"), , xlYes).Name = _
    "Table2"
    Range("Table2[#All]").Select
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 3
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 5
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 7
    ActiveWindow.ScrollColumn = 8
    ActiveWindow.ScrollColumn = 9
    ActiveWindow.ScrollColumn = 10
    ActiveWindow.ScrollColumn = 11
    Range("O2").Select
    ActiveCell.FormulaR1C1 = "=[@[s:timestamp]]/(60*60*24*1000)+""1/1/1970"""
    Range("Table2[[#Headers],[Column1]]").Select
    ActiveCell.FormulaR1C1 = "Real_Date"
    Range("O2").Select
End Sub

然后我开始详细说明并更换它们,以便它适用于任何工作表和范围,而不仅仅是我记录的特定工作表和范围。这就是我现在所拥有的。

Sub addnamedtable()
' 
' Takes the imported data, converts it to a table and then adds a column which uses a formula to read the epoch based date stamp
' 

Dim tempname As String
Set tempname = ActiveSheet.Name
    Cells.Select
    ActiveSheet.QueryTables(ActiveSheet.Name).Delete
    ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$N$5614"), , xlYes).Name = _tempname
    Range(tempname & "[#All]").Select
    Range("O2").Select
    ActiveCell.FormulaR1C1 = "=[@[s:timestamp]]/(60*60*24*1000)+""1/1/1970"""
    Columns("O:O").Select
    Cells.SpecialCells(xlLastCell).Select
    Columns(ActiveCell.Column).Select
    Selection.NumberFormat = "m/d/yyyy h:mm"
    Range(tempname & "[[#Headers],[Column1]]").Select
    ActiveCell.FormulaR1C1 = "Date"
End Sub

我无法过去将工作表名称作为值分配给tempname字符串。之后,我需要根据工作表命名表,以避免工作簿中的未来冲突。

最后的东西也可能是胡说八道,但宏还没有通过那么远来测试它。

编辑继承人@Head of Catering的回答

Sub addnamedtable()
'
' addnamedtable Macro
'

    Dim tempname As String
    Dim temprange As Range
    tempname = ActiveSheet.Name
    Cells.Select
    Set temprange = Selection
    ActiveSheet.QueryTables(ActiveSheet.Name).Delete
    ActiveSheet.ListObjects.Add(xlSrcRange, Range(temprange), , xlYes).Name = _
    tempname
    Range(tempname & "[#All]").Select
    Range("O2").Select
    ActiveCell.FormulaR1C1 = "=[@[s:timestamp]]/(60*60*24*1000)+""1/1/1970"""
    Columns("O:O").Select
    Cells.SpecialCells(xlLastCell).Select
    Columns(ActiveCell.Column).Select
    Selection.NumberFormat = "m/d/yyyy h:mm"
    Range(tempname & "[[#Headers],[Column1]]").Select
    ActiveCell.FormulaR1C1 = "Real_Date"
End Sub

运行此操作会给我错误

  

对象'_Global'的Blockquote方法'范围'失败

我认为这意味着它不会将temprange的值识别为范围。 我试过了temprange.address,但这导致了擅长锁定但没有反馈

1 个答案:

答案 0 :(得分:0)

除非您要设置对象变量,否则不需要set关键字。

更改

Set tempname = ActiveSheet.Name

到此:

tempname = ActiveSheet.Name

您还将temprange设置为等于工作表中的所有单元格。

更改

Cells.Select
Set temprange = Selection

对此,只是为了克服这个错误:

' Cells.Select -- comment this out, you don't need it
Set temprange = range("A1:J10")

将范围编辑为您真正想要的范围。

要查看Cells.Select正在执行的操作,请运行此子,然后在即时窗口中查看所选内容的地址。

Sub CellsSelect()
    Cells.Select
    Debug.Print Selection.Address
End Sub