@Daniel Cook: ご返信ありがとうございます。残念ながら、Excel 自体は Excel マクロに課せられた同じルールに従って動作しません...
説明するために、現在の問題を簡単に紹介します...
テーブルの内容を共通の状態にリセットしようとしています。このメソッドは、さまざまなシートの複数のテーブルに適用されます。
Public Sub restoreTable()
Dim myTableSheet As Worksheet: Set myTableSheet = Range("Table1").Parent
Dim myTable As ListObject: Set myTable = myTableSheet.ListObjects("Table1")
' --- Clear Table's Filter(s)
If myTable.ShowAutoFilter Then ' table has auto-filters enabled
Call myTable.Range.AutoFilter ' disables autofilter
End If
myTable.Range.AutoFilter ' re-apply autofilter
' --- Sort by Sequence number
Call myTable.Sort.SortFields.Clear ' if not cleared, sorting will not take effect
myTable.Sort. _
SortFields.Add Key:=Range("Table1[[#Headers],[#Data],[Column1]]"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
myTable.Sort.Header = xlYes
myTable.Sort.Orientation = xlTopToBottom
myTable.Sort.SortMethod = xlPinYin
Call myTable.Sort.Apply
myTable.Sort.SortFields.Clear
End Sub
以下のユースケースごとTable1
に、Sheet1
ユースケース 1:
- アクティブ化
Sheet1
、範囲選択A1
- 走る
restoreTable
- 観察: 範囲
Sheet1
A1
は選択されたままです
ユースケース 2:
- アクティブ化
Sheet1
、範囲選択A1
- 活性化
Sheet2
- 走る
restoreTable
- 監視: 範囲
Sheet1
A1
が選択されていません。代わりに、範囲Table1[#Data]
が選択されています
解決
それは絶対にひどいですが、これが私が見つけることができる最善の解決策です
Public Sub resotreTable_preserveSelection()
Dim curSheet As Worksheet: Set curSheet = ActiveSheet
Dim tableSheet As Worksheet: Set tableSheet = Range("Table1").Parent
' Change Sheet
tableSheet.Activate
' Remember Selection / Active Ranges
Dim originalSelection As Range: Set originalSelection = Selection
Dim originalActiveCell As Range: Set originalActiveCell = ActiveCell
' Restore Table
Call restoreTable
' Restore Old Selection
originalSelection.Select
originalActiveCell.Activate
' Change Back to old sheet
curSheet.Activate
End Sub
注: この場合、original
* 範囲は必要ありませんが、要点はわかります: 元の選択をバッファリングし、終了時に復元できます。
エクセルは本当に苦手