2015-04-04 164 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

相關問題