右击新建excel为啥是工作表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了右击新建excel为啥是工作表相关的知识,希望对你有一定的参考价值。

参考技术A 右击新建excel是工作表的原因是因为工作表就是工作簿里边的一张表。在右键菜单中这俩应该是一样的东西,都指工作簿,是默认的。

为啥选择前必须激活 Excel 工作表?

【中文标题】为啥选择前必须激活 Excel 工作表?【英文标题】:Why do Excel sheets have to be activated before selection?为什么选择前必须激活 Excel 工作表? 【发布时间】:2012-09-23 21:05:42 【问题描述】:

这段代码

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

在 VBA 中将失败,因为您只能在 Active 的对象上使用 Select。我知道是这种情况。

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

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

【问题讨论】:

全部。它旨在自下而上地以这种方式工作,并且非常有意义。尝试用鼠标选择某些内容,而其下方的区域不处于活动状态,或者在窗口中标记文本以供选择,而窗口首先没有处于活动状态(聚焦),或者在键盘上键入键而不触摸键盘使其处于活动状态。您的代码不能假设任何东西;你必须具体。 @KenWhite 这就是我的观点。似乎在任何情况下您都不想 Select 而不是 Activating 有意义(您所有的例子都强化了这一点) - 所以我不明白为什么 VBA 不会在您调用 @987654328 时自动执行此操作@. 因为它从一开始就不是这样设计的,现在改变它可能会破坏很多现有的代码。也许 Joel Spolsky(VBA for Excel 的原始创建者之一和该网站的共同创建者)会看到这一点并解释为什么首先做出这个决定,但其他任何事情都只是猜测。 感谢您的更新。我知道你的问题是关于设计意图,但如果你确实需要激活一个范围,那么Application.Goto Sheets(2).Range("A1") 是一个更好的选择。 不知道答案,但你确定你真的需要首先选择单元格吗?很可能您只需要以某种方式引用它。例如,要将单元格值复制到另一张工作表,您无需选择一个单元格然后再选择另一个,只需执行sheet1.range("A1") = sheet2.range("A1")。激活工作表并选择范围通常效率低下。 【参考方案1】:

正如 brettdj 指出的那样,您不必激活工作表即可选择范围。这是一个包含大量examples for selecting cells/ranges 的参考。

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

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

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

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

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

简单地说,说到范围,你不能选择一个你看不到的。

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

【讨论】:

【参考方案2】:

我知道这有点晚了,但我发现了一个 hack 来做这件事......

试试这个代码:

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

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

【讨论】:

【参考方案3】:

@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 观察:Sheet1A1 范围被选中,而是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

【讨论】:

【参考方案4】:

当然,您不必选择或激活工作表来选择/激活单元格。我的方法是使用“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

【讨论】:

以上是关于右击新建excel为啥是工作表的主要内容,如果未能解决你的问题,请参考以下文章

什么是Excel的工作表?如何创建新的工作表?

怎么新建表格

office2013新建Microsoft工作表,为啥打不开呢?显示因为文件格式或文件扩展名无效

excel中引用其他工作表,为啥不行呢

Office 2016 - 下载安装激活后,右键新建菜单中,出现 Micorosoft Excel 97-2003 工作表,而不是 Micorosoft Excel 工作表以及对新建菜单项位置做

excel多个表格合并成一个工作表的方法