Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将一个Excel列中的值替换为从同一行中可变数量的列串联而来的值?_Excel_Vba - Fatal编程技术网

如何将一个Excel列中的值替换为从同一行中可变数量的列串联而来的值?

如何将一个Excel列中的值替换为从同一行中可变数量的列串联而来的值?,excel,vba,Excel,Vba,我试图转换一个导出的Excel报表的输出,该报表包含许多行,每个行包含可变数量的包含数据的列。无法修改导出。这是我必须处理的问题 列A可能包含文本,也可能不包含文本。B列包含与此问题无关的数据(除了它碍事且必须进行编码)。列C、D和以后可能包含或不包含文本,但这些文本填充是一致的,从左到右顺序的,即文本永远不会“跳过”列-如果列e是包含文本的行中的最后一列,则列D和C也将包含文本 我的目标是将所有这些单独的文本值连接到每行的A列单元格中(由垂直线字符分隔),然后只在A列和B列中保留值 因此,如果

我试图转换一个导出的Excel报表的输出,该报表包含许多行,每个行包含可变数量的包含数据的列。无法修改导出。这是我必须处理的问题

列A可能包含文本,也可能不包含文本。B列包含与此问题无关的数据(除了它碍事且必须进行编码)。列C、D和以后可能包含或不包含文本,但这些文本填充是一致的,从左到右顺序的,即文本永远不会“跳过”列-如果列e是包含文本的行中的最后一列,则列D和C也将包含文本

我的目标是将所有这些单独的文本值连接到每行的A列单元格中(由垂直线字符分隔),然后只在A列和B列中保留值

因此,如果导出看起来像:

      ColA   ColB   ColC   ColD

Row1  Alpha  xxxxx
Row2
Row3  Gamma  xxxxx  Theta
Row4
Row5  Delta  xxxxx  Kappa  Sigma
转换后的输出应如下所示:

      ColA                   ColB   ColC   ColD

Row1  Alpha                  xxxxx
Row2
Row3  Gamma | Theta          xxxxx  
Row4
Row5  Delta | Kappa | Sigma  xxxxx  
(我知道这些不是很好的表示,但我不能嵌入图像。这是一个和一个Excel表格)

现在这是我到目前为止写的代码。它只设置为concat列A和C。我觉得我在设置范围和在文本字符串之间获得正确的垂直线格式方面走在了正确的轨道上,但是,我需要能够处理每行的可变列范围—既可以在列A中创建连接的文本字符串,也可以在例程完成后删除列C中的值

Sub ColumnConcat()

Dim firstComment As Range
Set firstComment = Range("A1")

Dim lastComment As Range
Set lastComment = Range("B1").End(xlDown).Offset(0, -1)

Dim commentRange As Range
Set commentRange = Range(firstComment, lastComment)

Dim commentCell As Range

For Each commentCell In commentRange

  If IsEmpty(commentCell.Offset(0, 2).Value) = True Then
    commentCell.Value = commentCell

      Else

    Dim firstConcatComment As Range
    Set firstConcatComment = commentCell.Offset(0, 2)

    commentCell.Value = commentCell & " | " & firstConcatComment

  End If

Next commentCell

Range("C1:E1").EntireColumn.Delete Shift:=xlToLeft

End Sub

对于这种情况,我更喜欢将整个数组加载到一个数组中,然后遍历该数组并加载第二个数组

它比遍历范围更快,因为它只引用工作表上的数据几次而不是多次

Sub ColumnConcat()
Dim ws As Worksheet
Set ws = Worksheets("Sheet28") 'Change to your sheet name or ActiveSheet.


Dim rngArr() As Variant
Dim OArr() As Variant
rngArr = ws.UsedRange
ReDim OArr(LBound(rngArr, 1) To UBound(rngArr, 1), 1 To 2) As Variant

For i = LBound(rngArr, 1) To UBound(rngArr, 1)
    OArr(i, 1) = rngArr(i, 1) & " | "
    OArr(i, 2) = rngArr(i, 2)
    For j = 3 To UBound(rngArr, 2)
        If rngArr(i, j) = "" Then Exit For
        OArr(i, 1) = OArr(i, 1) & rngArr(i, j) & " | "
    Next j
    If OArr(i, 1) <> "" Then
        OArr(i, 1) = Left(OArr(i, 1), Len(OArr(i, 1)) - 3)
    End If
Next i

ws.UsedRange.Clear
ws.Range("A1").Resize(UBound(OArr, 1), UBound(OArr, 2)).Value = OArr
End Sub
子列concat()
将ws设置为工作表
将ws=Worksheets(“Sheet28”)更改为工作表名称或活动工作表。
Dim rngArr()作为变量
Dim OArr()作为变体
rngArr=ws.UsedRange
ReDim OArr(LBound(rngArr,1)至UBound(rngArr,1),1至2)作为变体
对于i=LBound(rngArr,1)到UBound(rngArr,1)
OArr(i,1)=rngArr(i,1)和“|”
OArr(i,2)=rngArr(i,2)
对于j=3至UBound(rngArr,2)
如果rngArr(i,j)=“”,则退出
OArr(i,1)=OArr(i,1)和RNGAR(i,j)以及“|”
下一个j
如果OArr(i,1)“,那么
OArr(i,1)=左(OArr(i,1),Len(OArr(i,1))-3)
如果结束
接下来我
ws.UsedRange.Clear
ws.Range(“A1”)。调整大小(UBound(OArr,1),UBound(OArr,2))。值=OArr
端接头
之前:

之后


您使用的是什么版本的Excel?Excel 2016,也是最新的VBA。您有权访问TEXTJOIN()?如果是这样,这可以通过一个公式来实现。