selection.MergeCells属性更改excel中的原始选择

时间:2013-05-08 13:49:49

标签: excel excel-vba excel-2007 excel-2010 excel-interop vba

我想检查我的选择是否包含MergeCells,如果是,我不想在excel中处理该选择。 但每当我调用selection.MergeCells原始选择更改并包装由MergeCells限制的区域,我不想要。 我已经检查了下面的MSDN链接,它告诉它是一个限制/错误并且无法解决,所以有人可以帮助我吗?

http://social.msdn.microsoft.com/Forums/en-US/exceldev/thread/63920347-c731-4046-b96f-3f3e7eabddd8

2 个答案:

答案 0 :(得分:0)

您的案例中的问题与您指向的链接略有不同(因为它们位于SelectionChanged事件中)。在您的情况下,问题是您在VBA代码中使用Selection.MergeCells。不要那样做。

你应该总是避免在你自己的VBA代码中使用与选择相关的动作(因为它很慢,更糟糕,有很多意想不到的副作用,像这样)。相反,使用范围对象。但是因为Selection Range本身与Selection对象绑定得非常紧密,所以你可能需要将它取消关联,如下所示:

Dim rng As Range, ws As Worksheet
'get the current worksheet
Set ws = ActiveSheet
'get the selection-range
Set rng = Selection
'get the same range, but disassociated from the selection
'(I think this works?)
Set rng = ws.Range(rng.AddressLocal)

If rng.MergeCells Then ...

如果这不起作用(我现在无法测试),请告诉我,因为有一个更复杂的方法可以使用。

答案 1 :(得分:0)

我浏览了这篇文章,发现答案不起作用。

要了解原因,请尝试以下代码

Cells.UnMerge
Cells.ClearFormats

[4:4,11:11,21:21].Select

Selection.Interior.Color = vbYellow

[a2:b5].Merge
[a19:b22].Merge

Debug.Print Selection.Address
Debug.Print [a1].MergeCells
Debug.Print Selection.Address
End Sub

唯一的solution is something like the following. Sorry I don't have time to flesh it out anymore

dim mergedCells as collection, oldSelAddress as string, var as variant

oldSelAddress = selection.address
debug.print [a1].mergecells
if oldSeladdress <> selection.address then 
   set mergedCells = collectMergedCells(selection)
   selection.unmerge
   range(oldseladdress).select
   for each var in mergedCells
          var.merge
   next
end if