6

这段代码

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

在 VBA 中将失败,因为您只能SelectActive. 我明白是这种情况。

Excel 数据模型的哪个元素导致出现这种情况?我认为用户/编码人员Activate在使用之前对任何对象都有隐含意图Select- 我不明白为什么 VBA 不会做出这个假设,而且,我假设存在这种区别是有原因的。

  • Excel 数据模型的哪一部分在未激活的情况下阻止选择?
4

4 回答 4

5

正如 brettdj 指出的那样,您不必激活工作表即可选择范围。这是一个参考,其中包含大量用于选择单元格/范围的示例

现在至于为什么我必须先激活工作表?我不认为这是数据模型的错误,而只是 Ranges 的 select 方法的限制。

从实验来看,在 Excel 中选择范围似乎有两个要求。

  1. Excel 必须能够更新 UI 以指示选择的内容。
  2. 范围父级(即工作表)必须处于活动状态。

为了支持这一说法,您也不能从隐藏的工作表中选择一个单元格。

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

简而言之,当涉及到 Ranges 时,您无法选择看不到的一个。

我会声称这是一起选择的限制,除了您实际上可以在隐藏的工作表中选择一个对象。愚蠢的Excel。

于 2012-10-03T03:12:58.343 回答
3

我知道这对派对来说有点晚了,但我发现了一个黑客来做到这一点......

试试这个代码:

Sheets(1).Activate
Sheets(2).Range("A1").Copy
Sheets(2).Range("A1").PasteSpecial xlPasteFormulas
Application.CutCopyMode = False

请注意,这是一个 hack,但它可以解决问题!

于 2014-07-17T16:11:22.030 回答
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* 范围不是必需的,但你明白了:你可以缓冲原始选择并在完成后恢复它

我真的不喜欢excel

于 2014-11-03T01:06:13.687 回答
0

当然,您不必选择或激活工作表来选择/激活单元格。我的方法是使用“On Error Resume Next”和“On Error GoTo 0”。下面的代码选择工作簿的每个工作表中的第一个单元格而不选择它。在这个阶段,工作表甚至非常隐藏。

On Error Resume Next
For i_wks = 1 To wb_macro.Worksheets.Count
    wb_macro.Worksheets(i_wks).Cells(1).Select
Next i_wks
On Error GoTo 0
于 2016-10-12T08:36:14.263 回答