检查合并的单元格,并比较相邻单元格值的相邻设置唯一值

时间:2015-09-08 19:01:52

标签: excel vba excel-vba cells

我正在Excel 2010中编写一个宏来解决以下问题:
我有两列,一列是Key字符串值,另一列是uuid。这个想法是每个密钥应该只有一个uuid,但就像现在的表一样,密钥单元可以是合并的单元格或单个单元格。 宏需要识别合并哪些单元格,哪些不合并,因此,我有两个选项:

  • 如果合并了单元格,请检查其所有相邻单元格,选择第一个uuid值并将其复制/粘贴到其他相邻单元格,也就是说,下面的单元格(可以使用Offset()
  • 如果未合并单元格,但在多个单元格中重复键值,则将uuid值复制/粘贴到相邻单元格。

所以基本上是检查合并的单元格MergeArea,但我不知道是否需要遍历其地址或检查范围内的单元格,偏移量为Offset(0,1)或者是什么。 使用我的代码,我可以知道单元格是否已合并但现在,如何迭代它的相邻单元格值?

现在的代码:

Sub CopyUUID()
Dim lRow As Long
Dim rng As Range
Dim ws As Worksheet
Dim rMerged As Range
Dim value As Variant

Set ws = Sheets(ActiveSheet.Name)

On Error GoTo ExitProgram 'If an error happens within the execution, skips it and continue in next step
Application.DisplayAlerts = False 'We can cancel the procedure without errors

With ws
    lRow = .Range("F" & .Rows.count).End(xlUp).row
    Set rng = .Range(.Cells(3, 6), .Cells(lRow, 6))
    rng.Select
    For Each cell In rng
        If cell.MergeCells Then
            'Code for merged cells
        Else
            'Code to use for single cells
        End If
    Next cell
End With
ExitProgram:
   Exit Sub
End Sub

Table Example

3 个答案:

答案 0 :(得分:1)

Option Explicit

Sub CopyUUID()

    Const UUID As Long = 31 'col AE

    Dim lRow As Long, cel As Range, isM As Boolean, copyID As Boolean, kCol As Long

    With ActiveSheet
        kCol = -25          'col F
        lRow = .Cells(.Rows.Count, UUID + kCol).End(xlUp).Row

        For Each cel In .Range(.Cells(3, UUID), .Cells(lRow, UUID))

            isM = cel.Offset(0, kCol).MergeCells
            copyID = isM And Len(cel.Offset(0, kCol)) = 0
            copyID = copyID Or (Not isM And cel.Offset(0, kCol) = cel.Offset(-1, kCol))

            If copyID Then cel = cel.Offset(-1)
        Next
    End With
End Sub

答案 1 :(得分:0)

尝试以下代码。请注意,这将覆盖UUID的当前内容,因此请在测试之前制作备份副本。如果您不想修改UUID列,可以根据需要进行修改。

Sub CopyUUID()
    Dim lRow As Long
    Dim rng As Range
    Dim c As Range
    Dim ws As Worksheet
    Dim rMerged As Range
    Dim value As Variant

    Set ws = Sheets(ActiveSheet.Name)

    On Error GoTo ExitProgram 'If an error happens within the execution, skips it and continue in next step
    ' Application.DisplayAlerts = False 'We can cancel the procedure without errors

    With ws
        lRow = .Range("F" & .Rows.Count).End(xlUp).Row
        Set rng = .Range(.Cells(3, 6), .Cells(lRow, 6))
        ' rng.Select
        For Each c In rng

            If c.MergeCells Then
                'Code for merged cells
                c.Offset(0, 1).Formula = c.MergeArea.Cells(1, 1).Offset(0, 1).Formula
            Else
                'Code to use for single cells
                If c.Formula = c.Offset(-1, 0).Formula Then
                    c.Offset(0, 1).Formula = c.Offset(-1, 1).Formula
                End If
            End If
        Next c
    End With
    ExitProgram:
       Exit Sub
End Sub

在MergedCell中,它使UUID与合并区域中第一个单元格的UUID相同。当不在MergedCell中时,如果Key与上面的行相同,它将从上面的行复制UUID。

我将变量cell更改为c(我不喜欢使用可能与内置函数混淆的变量名称)并注释掉了几行。

希望这有帮助

答案 2 :(得分:0)

我采用了一种简单的方法解决这个问题,正如我采取的措施所示。

  1. 示例表显示包含合并单元格和未合并单元格的数据。 sample data

  2. 运行程序代码以取消合并单元格。该计划的输出见下文。

  3. Unmerged Sample data First stage

    1. 如果此数据结构与您的案例相符,则为B列添加2行代码将按照以下图像保留数据。
    2. unmerged data after deleting column through program code

      1. 程序代码如下:
      2. '没有删除列:

        Sub UnMergeRanges()
            Dim cl As Range
            Dim rMerged As Range
            Dim v As Variant
        
            For Each cl In ActiveSheet.UsedRange
                If cl.MergeCells Then
                    Set rMerged = cl.MergeArea
                    v = rMerged.Cells(1, 1)
                    rMerged.MergeCells = False
                    rMerged = v
                End If
            Next
        End Sub
        'With coumn deletion   
        Sub UnMergeRangesB()
            Dim cl As Range
            Dim rMerged As Range
            Dim v As Variant
        
            For Each cl In ActiveSheet.UsedRange
                If cl.MergeCells Then
                    Set rMerged = cl.MergeArea
                    v = rMerged.Cells(1, 1)
                    rMerged.MergeCells = False
                    rMerged = v
                End If
            Next
            Columns("B:B").Select
            Selection.Delete Shift:=xlToLeft
        End Sub