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

Excel 从具有特定名称的工作表上的数据创建表并添加列,excel,excel-2010,vba,Excel,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

我有许多从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
运行此命令会导致错误

对象“\u Global”的Blockquote方法“Range”失败

我认为这意味着它不能将
temprange
的值识别为一个范围。
我尝试了
temprange.address
,但这导致excel锁定,没有任何反馈

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

改变

Set tempname = ActiveSheet.Name
Cells.Select
Set temprange = Selection
为此:

tempname = ActiveSheet.Name
您还将temprange设置为与工作表中的所有单元格相等

改变

Set tempname = ActiveSheet.Name
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

@aeredhal,你试过了吗?是的,很抱歉耽搁了。我想做一个完整的答复。你完全正确,删除
Set
修复了第一个问题。然后,我直接进入下一个问题,即对表的范围使用变量而不是设置值。我添加了一个范围变量,其值为
Selection
替换了
“$a$1:$N$5614”
,但我不断收到一个错误“对象的方法范围\u全局失败”我试图发布修改后的代码,但似乎无法进行任何格式化。我是在做一些愚蠢的事情,还是应该用更新来编辑问题?
temprange
已经是一个范围,因此您不需要在它周围使用
range()
。你的范围是整个床单。这就是你想要的吗?我们可能还需要重构一些。今天晚些时候我会看一看。