2017-08-02 207 views
0

我在Excel中创建了一个自动将日历信息从表格映射到动态日历视图的日历。每行表示从上午8点到下午6点的时间,每列表示周日至周六的一周中的某一天。我能够将每个独特事件的信息映射到每个列中的两个单独的单元格,一个用于开始时间,另一个用于结束时间。我正在寻找帮助,建立一个宏来合并包含相同信息的单元格,以便日历具有内聚性。例如。活动A从上午9点开始,于上午11点结束。目前在上午9点有一个单元,上午11点有一个单元,但10点的单元是空白的,我想将9AM单元中的两个单元合并到11AM单元。由于填充的单元格不总是相邻的,所以在这种情况下,偏移函数似乎不起作用。VBA在Excel中合并包含相同文本的非相邻单元格

这里是我想要实现的伪代码:

  1. 对于每一列在指定区域
  2. 循环的每一行
  3. 如果两个细胞都含有相同的文字
  4. 合并这些两个单元

这里是代码的一点我已经成功地拿出这么远。你可以知道有很多差距,可能是语法错误:

Sub MergeCells 
Dim cells As String 
cells = ActiveSheet.Range("C8:V28,C31:V51,C54:V74,C77:V97,C100:V120") 
    If ActiveSheet.Range(cells).??? Then 
     ActiveSheet.Range(cells).Merge 
    End If 
End Sub 

任何帮助将不胜感激!

Before picture

After picture

+1

如果哪两个单元格包含相同的文本?上面和/或下面的单元格?或者它会永远在上面?你能发布一些样本数据和期望的输出样本吗? – BruceWayne

+0

正如@BruceWayne所言,前后图片肯定会对这里有所帮助 – dwirony

+0

Stackoverflow不允许我嵌入图片,但是我在原始帖子中的图片前后附加了。正如您所看到的,单元格的位置将根据事件的开始和结束时间而变化。 – JuliaXu

回答

0

好了 - 这可能是矫枉过正,你可能需要调整,但这是有趣的努力。

Sub combine_Same() 
Application.DisplayAlerts = False 

Dim tableRng As Range 
Dim i As Long, k As Long, lastRow As Long 
Dim curText As Range, prevText As Range 

Dim tableRanges As Variant 

tableRanges = Split("b3:e20,C31:V51,C54:V74,C77:V97,C100:V120", ",") 

Dim rng  As Long 

For rng = LBound(tableRanges) To UBound(tableRanges) 
    Debug.Print "Working with: " & tableRanges(rng) 
    Set tableRng = Range(tableRanges(rng)) 
' tableRng.Select 
    lastRow = tableRng.Rows(tableRng.Rows.Count).Row 
    For k = tableRng.Columns(1).Column To tableRng.Columns.Count 
     For i = lastRow To tableRng.Rows(1).Row Step -1 
      Set curText = Cells(i, k) 
      Set prevText = curText.End(xlUp) 
      If curText.Value = prevText.Value And Not IsEmpty(curText) Then 
       'curText.Select 
       Range(curText, prevText).Merge 
       curText.VerticalAlignment = xlCenter 
      ElseIf curText.Value = curText.Offset(-1, 0).Value And Not IsEmpty(curText) Then 
       'curText.Select 
       Range(curText, curText.Offset(-1, 0)).Merge 
       curText.VerticalAlignment = xlCenter 
      End If 
     Next i 
    Next k 
Next rng 
Application.DisplayAlerts = True 
End Sub 
+0

谢谢!这工作非常好! – JuliaXu

+1

一个小的变化我提出: LASTROW = tableRng.Rows(tableRng.Rows.Count).Row lastColumn = tableRng.Columns(tableRng.Columns.Count).COLUMN 对于k = tableRng.Columns(1)为了.COLUMN lastColumn 不确定为什么这有所作为,但它涵盖了以前未更新的最后一列。 – JuliaXu

相关问题