小编vkn*_*les的帖子

公式中的“非连续”范围规范

[2018-08-01:见帖子底部附近的新材料。]

我刚刚在这里遇到了一个 QnA ,其中包含一个使用我以前从未见过的规范引用范围的函数示例。我稍微玩了一下,发现大多数 Excel 函数在使用这种引用时都会返回一个值:

=SUM(A1:A5:C1:C5:E1:E2:F3:F4)
Run Code Online (Sandbox Code Playgroud)

注意那里的所有“:”。

光标在编辑栏中时,那些不连续的单元格会突出显示,就好像只有这些单元格会被总计。然而,当我实验时,我发现它等价于这个公式:

=SUM(A1:F5)
Run Code Online (Sandbox Code Playgroud)

但是,这个公式符合我的预期:

=SUM(A1:A5,C1:C5,E1:E2,F3:F4)
Run Code Online (Sandbox Code Playgroud)

示例:我将范围 A1:F5 定义为:

-- ABCDEF

1 1 2 3 4 5 6

2 2 4 6 8 10 12

3 3 6 9 12 15 18

4 4 8 12 16 20 24

5 5 10 15 20 25 30 

公式结果为:

=SUM(A1:F5) 是 315

=SUM(A1:A5:C1:C5:E1:E2:F3:F4) 是 315

=SUM(A1:A5,C1:C5,E1:E2,F3:F4) 是 117

这说明了我的观点,即前两个似乎是等效的,而定义不连续范围的第三个“正确”方法给出了不同的结果(但我所期望的)。

我在这里和互联网上的其他地方环顾四周,没有找到相关的讨论。

所以,我的问题:

  1. 那个奇怪的范围参考有什么实际用途吗?
  2. 它真的是一种有效的范围参考吗?

[新材料2018-08-01]

@YowE3K 想知道奇数个单元格会发生什么。这是我的例子:

-- ABC  

1 1 …

excel excel-formula

9
推荐指数
1
解决办法
3303
查看次数

Excel VBA Worksheet_Calculate 不同工作簿的事件触发

附加信息(阅读其余部分后应该有意义):如果我打开 Workbook1.xlsm,然后创建一个新工作簿 (Book1),我可以输入数据和公式,甚至像NOW(),Book1!Sheet1 中那样的易失性函数,而不会触发实例范围的重新计算。我知道这一点是因为我正在观看 Workbook1!SheetX 中的计算事件处理程序。

初步结论:Excel 并不总是自动重新计算所有打开的工作簿中的所有公式。相反,它仅重新计算活动工作表(或者可能是活动工作簿),直到发生某些情况。

在这种情况下,“某些东西”实际上隐藏了计算事件处理程序中的行。我删除了多行代码,发现如果删除这些Me.Rows(x).Hidden = True行,则不会发生实例范围的重新计算。应用过滤器是触发事件的简单方法,但是添加公式将在不使用过滤器的情况下产生相同的结果,因此它似乎与过滤器没有任何关系。

无论如何,隐藏行会以某种方式创建一个导致所有内容重新计算的条件。只有在宏隐藏 SheetX 中的行之后,才会执行 SheetX 中的计算宏,之后,无论我在哪个工作簿或工作表中输入数据,它都会执行。如果我随后通过 Windows 资源管理器打开第三个工作簿,则其中的任何更改都会立即触发计算宏。我可以在 Sheet1 中添加一个事件处理程序,并验证两个处理程序(SheetX 和 Sheet1)是否都在执行,并且 SheetX每次都会首先执行,即使更改是在 Sheet1 中。


注意:请不要因为隐藏行或单元格的更简单或更好的方法而分心。我确信有。我的问题与 Excel 中看似错误的问题有关,因此请重点关注事件的触发,除非问题与宏的编写方式有关。

情况:

Win7下使用Excel 2013。

Workbook1、SheetX 有 VBA 宏 Worksheet_Calculate()。SheetX 已启用数据过滤。

打开工作簿1。

使用“文件” | 打开一个新工作簿 新 | 空白作业簿。它的名字是Book2。

返回 Workbook1 并筛选 SheetX 中的一列(例如,仅显示 A 列中的值 3)。[您可以在 A4:C7 范围内的任意位置输入另一个公式。]

在 Book2 的单元格中输入一个值。

Workbook1 的 Worksheet_Calculate() 事件触发。这可以通过设置断点来演示。

此外,事件触发后,TAB 键在 Book2 中不再起作用,但在 Workbook1 中工作正常。这似乎特定于正在显示的工作表,因为如果您在 Book2 …

excel vba

5
推荐指数
1
解决办法
2693
查看次数

Outlook VBA中的WithEvents对象最终无法引发事件

好吧,看起来有人之前遇到过这个问题,但我没有看到任何进一步的评论或解决方案.请参阅此问题的已接受答案中的编辑.

我的情况是这样的.

我在Win10 x64下使用Exchange电子邮件帐户运行Outlook 2013.我有时会将Outlook运行几天到一周或更长时间而不关闭它.

我想在将新项目添加到"已发送邮件"文件夹时引发事件.这需要在Application ItemSend事件发生之后发生,因为,比方说,我希望在发送消息后删除消息,这是您无法在ItemSend事件处理程序中执行的操作.

所以我有以下代码:

Public WithEvents goSent As Outlook.Items

Private Sub Application_Startup()

    'Establish the global object for the folder we want to monitor.

    Set goSent = Session.GetDefaultFolder(olFolderSentMail).Items

End Sub

Private Sub goSent_ItemAdd(ByVal Item As Object)

    'Do stuff here.

End Sub
Run Code Online (Sandbox Code Playgroud)

一切都工作得很漂亮一天或更长时间,但最终ItemAdd事件处理程序停止射击.如果我进入VBA编辑器并手动运行Application_Startup,则它会再次开始工作.

[编辑:]另外一点信息:Application ItemSend无论Outlook运行多长时间,"内置"事件似乎总是可靠地触发.

[编辑2:]这一次,我在事件停止射击后让事情发生了一天.我打开了VBA编辑器并在Application ItemSend程序中加了一个断点.当它停止时,我查询了这个goSent物体并发现它(a)它仍然存在(而不是存在Nothing),但是(b)它只有昨天在那里的物品,大概是当它变得"不受限制"时已发邮件项目集合.当我Set在立即窗口中提交新语句时,它立即开始再次工作.

[编辑3:]我注意到MSDN文档说ItemAdd类模块中放置自定义对象的事件处理程序 - 比如我的事件.我在ThisOutlookSession中有我的,但我的理解是ThisOutlookSession 一个类模块.这有问题吗?

知道为什么会发生这种情况以及如何处理它?我考虑为每次触发时添加一个事件处理程序Application …

outlook vba outlook-vba

5
推荐指数
1
解决办法
497
查看次数

标签 统计

excel ×2

vba ×2

excel-formula ×1

outlook ×1

outlook-vba ×1