0

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 文字列に割り当てることはできません。その後、ワークブックでの将来の競合を避けるために、シートに基づいてテーブルに名前を付ける必要があります。

最後の部分もおそらくナンセンスですが、マクロはそれをテストするためにそこまで実行されていません。

EDIT @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 メソッド 'Range' が失敗しました

これは、の値を範囲として認識しないことを意味すると思いますtemprange。試してみtemprange.addressましたが、フィードバックなしでExcelがロックされました

4

1 に答える 1

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
于 2013-07-11T16:09:37.607 に答える