Excel 从具有特定名称的工作表上的数据创建表并添加列
我有许多从CSV导入的工作表。数据包括基于UNIX历元的时间戳。每次导入新工作表时,我都需要添加一列以将时间戳转换为人类可读的时间 我使用录制宏开始并得到以下结果: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
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()
。你的范围是整个床单。这就是你想要的吗?我们可能还需要重构一些。今天晚些时候我会看一看。