Excel宏连接单元格并转换

时间:2014-03-14 12:45:41

标签: excel vba excel-vba

我希望能够选择任意数量的单元格(全部在同一行上),然后运行一个宏来连接所有突出显示的单元格,然后将所有剩余的单元格移开。

我的描述可能不太清楚 - 希望这更有意义:

在下面的示例中,我在第1列到第8列中有数据。 我将突出显示第1至第3列中的单元格,运行宏,并将突出显示的单元格中的值合并到左侧(中间有空格),并将剩余的单元格移过。

之前

Column1 Column2 Column3 Column4 Column5 Column6 Column7 Column8
A       B       C       D       E       F       G       H

AFTER

Column1 Column2 Column3 Column4 Column5 Column6 Column7 Column8
A B C   D       E       F       G       H

这可能与宏(我通过键盘快捷键执行)有关吗?我对excel和vba宏有一个大致的了解,但遗憾的是我不太清楚这是否实用或可能。

我发现了一些连接细胞数据的宏,但不是基于突出显示的细胞。任何意见,将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:2)

这肯定是可能的。执行取决于你想要“Hgihlight”细胞的方式。如果您选择它们​​,则只需在代码中使用.selection即可。

这是我用来组合列的函数:

Function combineColumns(ByVal Columns As Variant, ByVal EmptyCol As Long) As String

    Dim tempColumn As Long
    Dim str As String
    Dim base As Long

    base = LBound(Columns) 'Columns could be 0 or 1 based array


    str = "="
    'compiles string formula for combining the columns
    For i = base To UBound(Columns)
        'tempColumn = Range(Columns(i) & "1").column
        If i > base Then 'if i > base it means that the loop is not on the first run, so the "&" is added for concatenation
            str = str & "&"" ""&RC[-" & (EmptyCol - Columns(i)) & "]"
        Else
            str = str & "RC[-" & (EmptyCol - Columns(i)) & "]"
        End If

    Next

    combineColumns = str


End Function

该函数采用一组列号,并返回一个可插入单元格的字符串,以将传递的列合并到传递的空白列中。应该很容易适应您的解决方案。 (循环遍历.selection中的列并将所有列号添加到数组中,然后传递给我的函数,并使用返回的字符串。)

如果要用颜色突出显示,则使用循环遍历行中的每个单元格并测试颜色。

For Each cell In activeCell.entireRow.Cells
    if cell.interior.color = RGB() then 'insert rgb for highlighting color here
        'add to array
    end if
next

然后你将传递结果数组。然后在组合单元格后,使用.delete xlShiftToLeft,它将删除单元格并将行上的剩余部分向左移动以填充空白。 (确保没有在该点选择组合数据的单元格。

修改

注意:函数返回的字符串必须插入单元格(Cells(rownum, colnum).formulaR1C1 =),因为如果您尝试在代码之外使用它,则会收到错误

答案 1 :(得分:2)

尝试一下:

Sub bigmac()
    Dim r As Range, rDel As Range
    Set r = Selection
    Dim N As Long
    N = r.Count
    Set rn = r(N)
    st = ""
    For i = 1 To N
        st = st & r(i).Value
    Next i
    r(1) = st
    Set rDel = Range(r(2), r(N))
    rDel.Delete shift:=xlToLeft
End Sub