2015-04-04 86 views
0

工作,我有我所存储会话的描述与客户,每堂课一排的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 

不幸的是,如果它会到达在活动列中有一个空白单元格的行(即没有任何活动的管理任务),它会停止通过列表,不会推送管理会话信息或任何后续的客户端会话。有谁知道如何编辑此代码以允许它推送所有信息而不会停止?

回答

0

如果.Cells(J, iColumn).Value具有由逗号分隔的活动,代码工作很好,因为它是分裂和从分裂的值通过枚举。

如果.Cells(J, iColumn).Value有单个活动(无逗号),则该代码有效,因为Split会生成单个活动条目;例如LBound(Temp)UBound(Temp)都为零,因此只有一个通过For ... Next循环。

如果.Cells(J, iColumn).Value是一个空白单元格(例如IsEmpty(.Cells(J, iColumn) = True),该代码将停止工作,因为Split结果为零的LBound(Temp)和-1 UBound(Temp)For ... Next环不会使连单遍。

一种方法是填充温度与一个占位符,如果UBound函数(TEMP)< LBOUND(TEMP)喜欢的东西,

CText = .Cells(J, iColumn).Value 
    Temp = Split(CText, ",") 
    if ubound(Temp) < lbound(Temp) then Temp = Split("<non-activity>", ",") 

这将是一样的,如果有一个单一的活动。另一种方法是确保至少有一个关口通过For ... Next循环,并在时间到了时覆盖缺少Temp。

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 

至少有一个通过所有的列。没有任何活动时,第9列将全部跳过。

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

+0

工程就像一个魅力!非常感谢您提供快速,翔实和工作反应! – 2015-04-04 16:43:01

相关问题