6

このコード

Sheets(1).Activate
Sheets(2).Range("A1").Select

Selectであるオブジェクトでのみ使用できるため、VBA では失敗しますActive。私はこれが事実であることを理解しています。

Excel データモデルのどの要素が原因ですか? Activate使用する直前に、ユーザー/コーダーからオブジェクトへの暗黙の意図があると思いますSelect.VBAがこの仮定を行わない理由がわかりません.また、この区別が存在する理由があると仮定しています.

  • Excel のデータモデルのどの部分がアクティブ化なしの選択を妨げていますか?
4

4 に答える 4

5

brettdj が指摘したように、範囲を選択するためにシートをアクティブにする必要はありません。これは、セル/範囲を選択するための驚くほど大量の例を含むリファレンスです。

なぜ最初にシートをアクティブにする必要があるのですか?これはデータモデルのせいではないと思いますが、Ranges の select メソッドの単なる制限です。

実験から、Excel で範囲を選択するには 2 つの要件があるようです。

  1. Excel は、何が選択されているかを示すために UI を更新できる必要があります。
  2. 範囲の親 (IE シート) がアクティブである必要があります。

この主張を裏付けるために、非表示のシートからセルを選択することもできません。

Sheets(1).Visible = False
Sheets(1).Activate
'The next line fails because the Range cannot be selected.
Sheets(1).Range("A1").Select

簡単に言えば、範囲に関しては、見えないものを選択することはできません。

非表示のシートで実際にオブジェクトを選択できることを除いて、これはすべて一緒に選択することの制限であると主張したでしょう。バカエクセル。

于 2012-10-03T03:12:58.343 に答える
0

@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* 範囲は必要ありませんが、要点はわかります: 元の選択をバッファリングし、終了時に復元できます。

エクセルは本当に苦手

于 2014-11-03T01:06:13.687 に答える