2009-12-16 250 views
2

我有一些Excel电子表格很难打到数据库(100多个查询对总账表...)。只刷新我所在的工作表(SHIFT + F9)在某些电子表格中很有用,但我想要一种刷新所选单元格的方法。我用下面的代码上来,放在ThisWorkbook对象:Excel VBA重新计算选择

Dim currentSelection As String 

Private Sub Workbook_Open() 
    Application.OnKey "+^{F9}", "ThisWorkbook.RecalculateSelection" 
End Sub 

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) 
    currentSelection = Target.Address 
End Sub 

Private Sub RecalculateSelection() 
    Range(currentSelection).Calculate 
End Sub 

如果可能的话,我想使这更便于携带,如在XLA文件存储,并加载它为Excel加入。这可能与我正在使用的方法?有没有更好的方法来实现这一目标?

回答

3

下载的你应该能够使用以下命令:

Public Sub RecalculateSelection() 
    Dim rng As Range 
    Set rng = Application.Selection 
    rng.Calculate 
End Sub 

因为用户可能没有选择一个范围(例如他们可能选择了一个图表),所以你应该在'Set rng'行放置一些错误处理。

通过使用应用程序对象,您不需要捕获Workbook_SheetSelectionChange事件。

+0

完美!我怀疑有一种更简单的方法,但Excel VBA的世界对我来说还是很新的。 – Scott 2009-12-17 16:34:28

2

如果你只是想重新计算当前选定的细胞,而忽略依赖于他们,你可以用我的RangeCalc插件细胞,从 http://www.decisionmodels.com/downloads.htm

+0

看起来您的外挂程序完全符合我的要求。我希望我可以接受多个答案。公平地说,我不得不接受Chris Spicer的回答,因为我解决了他的问题。 – Scott 2009-12-17 16:36:09

+0

谢谢:RangeCalc插件还自动处理Range.Calculate的一些怪癖:请参阅 http://www.decisionmodels.com/calcsecretsg.htm – 2009-12-18 10:25:55

4

如果使用上面你接受的答案的方法应该首先检查你的...

If Not Selection Is Nothing Then 
    If TypeName(Application.Selection) = "Range" Then 
    Dim Rng As Range 
    Set Rng = Application.Selection 
    Rng.Calculate 
End If 
End If 

你也可能希望将其添加到图纸和SHEETNAME上下文菜单。 您需要做的两个命令栏的名称是... “Cell”和“Ply”