我想检查我的选择是否包含MergeCells,如果是,我不想在excel中处理该选择。 但每当我调用selection.MergeCells原始选择更改并包装由MergeCells限制的区域,我不想要。 我已经检查了下面的MSDN链接,它告诉它是一个限制/错误并且无法解决,所以有人可以帮助我吗?
http://social.msdn.microsoft.com/Forums/en-US/exceldev/thread/63920347-c731-4046-b96f-3f3e7eabddd8
答案 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