2017-01-12 1 views
2

Ich arbeite an einem Makro, um zusammengeführte Zellen in einem bestimmten Bereich aufzulösen und die ursprünglichen zusammengeführten Zellen, die nicht zusammengeführt wurden, erneut zusammenzuführen. Ich habe gekämpft, um zu identifizieren, wie man eine Liste der Zellen speichert, die zuerst nicht zusammengefügt werden, damit das Makro diese genauen Zellen wieder zusammenführen kann. Die Zeilen, die in der Tabelle zusammengeführt werden, ändern sich von Woche zu Woche.Merge, Unmerge, Remerge Makro

Sub MergeUnmerge() 

' 

Mergeunmerge Macro 
' 

Dim mergelist As Range 

Dim celllist As Range 


For Each cell In Range("A1:S49") 

If cell.MergeCells = True Then 
    Set mergelist = celllist 
      cell.UnMerge 
     End If 
    Next 

For Each cell In mergelist 
    Range("celllist").Merge 
Next 

End Sub

+1

Sie berücksichtigen sollten, Sammlungen oder Arrays verwenden Ihre Informationen zu speichern, so dass sie bearbeitet werden, wenn Sie Ihre primäre Aufgabe abgeschlossen haben. d. h., fügen Sie die Adresse jedes zusammengeführten Bereichs (Range.MergeArea.Address) zu einer Sammlung hinzu, dann können Sie alle Zellen zusammenfassen, Aufgaben vervollständigen und dann die Zellen für jedes Element in der Sammlung zusammenführen – Tragamor

+0

Ich bearbeitete meine Antwort mit einer getesteten Arbeitslösung. – Chrismas007

Antwort

1

müssen Sie:

  • Verwendung mergeCells Eigenschaft für verbundene Zellen zu überprüfen

  • Verwendung Gebiete Eigenschaft Range Objekt

  • Verwendung Merge Methode Bereiche zu verschmelzen zurück

wie folgt

Option Explicit 

Sub MergeUnmerge() 
    Dim mergedCells As Range 
    Dim cell As Range 

    With Range("A1:S49") '<--| reference your range 
     Set mergedCells = .Offset(.Rows.Count, .Columns.Count).Resize(1, 1) '<--| initialize mergedCells range to a spurious cell out of referenced range 
     For Each cell In .Cells '<--|loop through referenced range cells 
      If cell.mergeCells Then '<--| if current cell belongs to a merged area 
       Set mergedCells = Union(mergedCells, cell.MergeArea) '<--| update 'mergedCells' range 
       cell.UnMerge '<--| unmerge it 
      End If 
     Next 

     Set mergedCells = Intersect(mergedCells, .Cells) '<--| filter out the spurious cell 
     If Not mergedCells Is Nothing Then '<--| if there's some cell left 
      For Each cell In mergedCells.Areas '<--| loop through areas 
       cell.Merge '<--| merge curent area 
      Next 
     End If 
    End With 
End Sub 
4

Sie werden die MergeArea Adresse zu einem Array hinzufügen müssen.

Sub MergeUnmerge() 

Dim cel As Range 
Dim mergeArr() 
y = 0 

For Each cel In Range("A1:S49") 
    If cel.MergeCells = True Then 
     ReDim Preserve mergeArr(y + 1) 
     mergeArr(y + 1) = cel.MergeArea.Address 
     cel.UnMerge 
     y = y + 1 
    End If 
Next cel 

For x = 1 To y 
    Range(mergeArr(x)).Merge 
Next x 

End Sub 
+0

Wenn dies für Sie funktioniert, bestätigen Sie bitte mit einem grünen Häkchen. – Chrismas007

+0

Dies wurde bearbeitet und getestet funktioniert. – Chrismas007

+0

Ich würde das generischer machen und einen 'Range' -Parameter aufnehmen und die' mergeArr() 'außerhalb der Schleife und' If' für die Lesbarkeit deklarieren. Variablen nahe der Verwendung deklarieren ist eine sehr gute Idee, aber nicht, wenn der Code (momentan) verwirrend ;-) –