我有很多来自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
,但这导致了擅长锁定但没有反馈
答案 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