Excel 拆分单元格并推送到可以使用空白单元格的行

Excel 拆分单元格并推送到可以使用空白单元格的行,excel,vba,for-loop,with-statement,delimited-text,Excel,Vba,For Loop,With Statement,Delimited Text,我有一个Excel文件,其中存储了与客户端的会话描述,每个会话一行。在其中一列中,我有一个逗号分隔的列表,其中包括该会话期间发生的所有活动。我一直在使用下面的代码,该代码可以很好地用逗号分割活动列表,将每个活动推到另一个工作表中的新行,并将该行中的所有其他信息合并到一起: Sub SplitFoci() Dim Temp As Variant Dim CText As String Dim J As Integer Dim K As Integer Dim

我有一个Excel文件,其中存储了与客户端的会话描述,每个会话一行。在其中一列中,我有一个逗号分隔的列表,其中包括该会话期间发生的所有活动。我一直在使用下面的代码,该代码可以很好地用逗号分割活动列表,将每个活动推到另一个工作表中的新行,并将该行中的所有其他信息合并到一起:

Sub SplitFoci()
    Dim Temp As Variant
    Dim CText As String
    Dim J As Integer
    Dim K As Integer
    Dim L As Integer
    Dim iColumn As Integer
    Dim lNumCols As Long
    Dim lNumRows As Long

    Set wksSource = Worksheets("OutputWorkingCopy1")
    Set wksOutput = Worksheets("OutputSplitFoci")

    iColumn = 9
    iTargetRow = 0
    With wksSource
        lNumCols = .Range("IV1").End(xlToLeft).column
        lNumRows = .Range("A65536").End(xlUp).Row
        For J = 3 To lNumRows
            CText = .Cells(J, iColumn).Value
            Temp = Split(CText, ",")
            For K = 0 To UBound(Temp)
                iTargetRow = iTargetRow + 1
                For L = 1 To 40
                    If L <> iColumn Then
                        wksOutput.Cells(iTargetRow, L) _
                          = .Cells(J, L)
                    Else
                        wksOutput.Cells(iTargetRow, L) _
                          = Temp(K)
                    End If
                Next L
            Next K
        Next J
    End With

End Sub
不幸的是,如果它到达的行在“活动”列中有一个空白单元格,即没有任何活动的管理任务,它将停止遍历列表,既不推送管理会话信息,也不推送随后的任何客户端会话。有人知道如何编辑此代码以使其能够推送所有信息而不被停止吗?

如果.CellsJ,iColumn.Value的活动由逗号分隔,则代码在拆分时工作正常,拆分后的值通过枚举

如果.CellsJ,iColumn.Value有一个没有逗号的活动,则代码可以工作,因为拆分会导致一个活动条目;e、 g.LBoundTemp和UBoundTemp都为零,因此只有一次通过用于。。。下一个循环

如果.CellsJ,iColumn.Value是空白单元格,例如IsEmpty.CellsJ,iColumn=True,则代码停止工作,因为拆分会导致LBoundTemp为零,UBoundTemp为-1,而For。。。下一个循环甚至不能进行一次循环

一种方法是使用占位符填充Temp,如果UBoundTemp
    CText = .Cells(J, iColumn).Value
    Temp = Split(CText, ",")
    if ubound(Temp) < lbound(Temp) then Temp = Split("<non-activity>", ",")
至少通过所有列一次。当没有活动时,将跳过第9列


最后两段代码中的一段应该修复循环。选择对你最有意义的一个。

就像一个符咒!非常感谢您的快速、翔实和有效的回复!
    For K = 0 To (UBound(Temp) - CBool(UBound(Temp) < LBound(Temp))) 'from 0 to 0 when UBound(Temp) < LBound(Temp)
        iTargetRow = iTargetRow + 1
        For L = 1 To 40
            If L <> iColumn Then
                wksOutput.Cells(iTargetRow, L) _
                  = .Cells(J, L)
            ElseIf Not CBool(UBound(Temp) < LBound(Temp)) Then
                wksOutput.Cells(iTargetRow, L) _
                  = Temp(K)
            End If
        Next L
    Next K