0

我试图让我的代码正确但在某些时候失败:我有一个 Excel 表,它根据顶部单元格中写入的值将一个单元格与下面的一个单元格合并,但是当从合并的单元格中删除一个值时我'd希望单元格取消合并。我尝试使用 sub 来保持我的代码有点干净(不知道正确的规则,但我尝试):

Public Sub LetItMerge(Target As Object)  
    If Target.Value = Empty Then  
            Call unMergeCell(Target)          
    Else  
            If (Target.Value = VV Then Call MergeCell(Target)  
    End If  
End Sub
Sub unMergeCell(m As Object)
    m.Resize(1, 1).UnMerge
    m.Borders(xlInsideHorizontal).LineStyle = XlLineStyle.xlContinuous
End Sub
Sub MergeCell(n As Object)
        n.Resize(2).Merge                   'merge cells
        n.VerticalAlignment = xlCenter      'center text
        n.HorizontalAlignment = xlCenter    'center text
End Sub
4

1 回答 1

0

对您的代码进行一些小的调整,这似乎对我有用。

只要工作表上发生更改,就会触发该Worksheet_Change事件。根据更改单元格的值,它将运行您的unMergemergeCell子程序。

Public Sub Worksheet_Change(ByVal Target As Range)
    'Use the target.cells(1) since a merged cell.'
    If Target.Cells(1).Value = vbNullString Then
            Call unMergeCell(Target)
    Else
            If Target.Value = VV Then Call MergeCell(Target)
    End If
End Sub

Sub unMergeCell(m As Range)
    m.Resize(1, 1).UnMerge
    m.Borders(xlInsideHorizontal).LineStyle = XlLineStyle.xlContinuous
End Sub

Sub MergeCell(n As Range)
        n.Resize(2).Merge                   'merge cells
        n.VerticalAlignment = xlCenter      'center text
        n.HorizontalAlignment = xlCenter    'center text
End Sub

更新#1

如果您有多个工作表,则可以将上述代码放在标准代码模块中,并将其重命名Sub Worksheet_Change(...Sub LetItMerge(Target as Range)

然后,在每个工作表的代码模块中,您仍然需要Change为每个工作表设置一个事件宏,如下所示:

Sub Worksheet_Change(ByVal Target as Range)
    LetItMerge Target
End Sub

所以现在,_Change每个工作表上的事件都会触发这个LetItMerge例程,它决定执行哪个unMerge或哪个MergeCells子例程。

于 2013-04-30T12:10:15.767 回答