让我们说,我创建了一个子(不能),其使命是采取活动的单元格(即选择),并设置一个相邻的电池到一些价值。这一工作正常。

当你试图转换,小到一个功能,并尝试进行评估,从电子表格(即设置这是公式"=MyFunction()")Excel会吠事实上,你都在试图影响价值的非活性的单元,简力的功能返回#值而不触及邻近的小区。

是它可以关闭这种保护的行为?如果不是,什么是一个很好的方式得到解决?我在寻找一些主管开发可以完成超过1至2周期间,如果可能的。

问候, 艾伦。

注:我是使用2002年,所以我将赞成一个解决方案,会工作的版本。具有这就是说,如果未来的版本作出这种明显更加容易,我想知道关于它。

有帮助吗?

解决方案

它不能这样做,这是有道理的,因为:

  • 当一个工作表的功能是所谓的细胞中含有的功能不一定是积极的细胞。所以你不可能找到相邻的电池可靠。

  • 当Excel是重新计算工作,它需要维护之间的依赖关系的细胞。因此,它不能允许的工作表职能随意修改其他的细胞。

最好你可以做的是一种:

  • 处理SheetChange事件。如果一个细胞中含有你的功能正在改变,修改相邻的电池。

  • 把一个工作表的功能在邻近的小区返回的价值你想要的。

更新

有关评论:"我喜欢这个功能对工作上的一个"空白"的电子表格,所以我真的不能依靠SelectionChange事件的电子表格的,可能尚不存在,但是将需要调用这一功能":

  • 你可以把你的功能在一个XLA加吗?然后你XLA加在可以处理应用程序SheetChange(*)事件的所有工作簿打开在这种情况的Excel?

有关评论:"不过,如果你继续在CalculationMode=xlManual和填就的价值观,你应该就好了"

  • 甚至当CalculationMode是xlManual,Excel需要保持一个相关树的参考文献之间的细胞,以便它可以计算正确的顺序。如果一项功能,可以更新的一个任意的单元,这将打乱的秩序。这大概是为什么Excel规定这种限制。

(*)我最初写SelectionChange上所述,纠正现在当然正确的事件是SheetChange工作或应用程序的对象,或者改变工作表对象。

更新2 一些发言 AlanR后 描述如何'有点'使其工作使用一个定时器:

  • 这是不清楚的定时功能("呜呼")将知道哪些单元,以更新。你有没有信息表明其中的细胞中含有的公式,触发计时器。

  • 如果在公式中存在的多个单元的(在相同或不同的工作簿),然后UDF会被多次在重新计算,复盖timerId.为此,你无法摧毁定时可靠地,并将泄漏Windows资源。

其他提示

根据 如何创建自定义用户定义的Excel功能:

限制UDF

  • 不能把一种价值中的一个细胞的其他细胞(或范围)含有 该公式。换句话说,UDF的是 意味着可用作"的公式",不 一定是"宏".

因此,它看起来像它无法完成。

我正在使用Excel 2007,但它不起作用。 Excel提到它会创建一个循环引用。我不认为你可以改变函数中的其他单元格,只返回一个值。

这是一种功能性编程,没有副作用。如果您可以只更改函数内部的其他单元格(从工作表中使用),那么Excel无法知道顺序以及单元格更改时重新计算的内容。

这篇文章也包含很多内容有关Excel如何重新计算的信息。但它从未声明其他细胞被冻结。

我不知道你要做什么,但是,为什么不在相邻的单元格中放置另一个函数,将第一个单元格作为参数?

示例:

Public Function Bar(r As Range) As Integer
  If r.Value = 2 Then
    Bar = 0
  Else
    Bar = 128
  End If
End Function

谢谢大家的回复。有可能做到这一点!均田。我说'有点',因为从技术上讲,'功能'不会影响它周围的细胞。然而,实际上,没有用户可以区分它们。

诀窍是使用Win32 API启动一个计时器,一旦它关闭,你就可以对任何单元格做你想做的事情并关掉计时器。

现在我不是COM线程如何工作的专家(虽然我知道VBA是Single Apartment Threaded),但是要小心你的Timer运行Excel进程并使其崩溃。这实际上不是我建议作为其他所有电子表格的解决方案。

使用这些内容制作模块:

Option Explicit

Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, _
  ByVal IDEvent As Long, ByVal mSec As Long, _
  ByVal CallFunc As Long) As Long

Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, _
  ByVal timerId As Long) As Long

Private timerId As Long

Private wb As Workbook
Private rangeName As String
Private blnFinished As Boolean

Public Sub RunTimer()

    timerId = SetTimer(0, 0, 10, AddressOf Woohoo)


End Sub


Public Sub Woohoo()

    Dim i As Integer

'    For i = 0 To ThisWorkbook.Names.Count - 1
'        ThisWorkbook.Names(i).Delete
'    Next

     ThisWorkbook.Worksheets("Sheet1").Range("D8").Value = "Woohoo"

     KillTimer 0, timerId

End Sub

虽然你不能做这个在Excel中,它可能在 解决程序的一个 (虽然它仍然是一个非常奇怪的事情要做)。

这是一个电子表格,允许你自定义功能在蟒蛇,你就可以从一个细胞式在网。

作为一个例子什么你问,你可能希望定义一个 safeDivide 功能(而不是抚养一个 ZeroDivisionError)告诉你有关该问题的着色的母细胞,并且把一个错误信息。你可以把它定义是这样的:

def safeDivide(numerator, cellRange):
    if not isinstance(cellRange, CellRange):
        raise ValueError('denominator must be a cell range')
    denominator = cellRange.Value
    if denominator == 0:
        cell = cellRange.TopLeft
        cell.BackColor = Color.Red
        cell.Offset(1, 0).Value = 'Tried to divide by zero'
        return 0
    return numerator / denominator

还有一个额外的皱纹:职能获得通过细胞刚刚获得通过的该单元价值,因此工作周围,我们坚持要求正在通过一个细胞cellrange为分母。

如果你们试图要做到不寻常的事情与电子表格不完全适合为Excel,或者你有兴趣使用电力的蟒蛇的工作与电子表格数据,这是值得看看在解决程序之一。

这是一个简单的VBA解决方法。对于此示例,请打开新的Excel工作簿并将以下代码复制到Sheet1(不是ThisWorkbook或VBA Module)的代码区域中。然后进入<=>并将一些东西放入工作表的左上角单元格之一。如果键入数字并按Enter键,则右侧的单元格将以4倍的数字更新,单元格背景将变为浅蓝色。任何其他值都会导致清除下一个单元格。这是代码:

Dim busy As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
  If busy Then Exit Sub
  busy = True
  If Target.Row <= 10 And Target.Column <= 10 Then
    With Target.Offset(0, 1)
      If IsNumeric(Target) Then
        .Value = Target * 4
        .Interior.Color = RGB(212, 212, 255)
      Else
        .Value = Empty
        .Interior.ColorIndex = xlColorIndexNone
      End If
    End With
  End If
  busy = False
End Sub

子例程捕获工作表中的所有单元格更改事件。如果行和列都<!> lt; = 10,则如果值为数字,则右侧的单元格将设置为已更改单元格的4倍;否则清除右边的单元格。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top