2016-08-23 26 views
0

我有一個包含項目信息的工作表。工作表包含一個包含每個項目風險的列。項目與其風險之間存在一對多的關係。Excel - 根據換行符向單元格文本添加序列號

當前項目的風險被添加到單個單元格中,並通過換行符分隔。我需要在每個風險開始時添加順序標識符。因此,例如在一個特定的單元格內,它應該看起來像這樣。如果可能的話,序號應該是粗體的。

1)。**風險1

2)。**風險2

3)。**風險3

如何解決這個任何建議將不勝感激。

+0

這是一個格式問題,您可以手動對其進行排序,也可以在單元格字符串中的每個換行符(vbCrlf)字符後面寫入vba來添加數字。使用換行符作爲分隔符將數組中的每個元素分開並將序列號連接到每個字符串,然後將其全部放入單元格中。 – newguy

+0

不是最清晰的問題陳述。你可能應該鏈回到以前的文章,也許提供你用來創建這個輸出的當前函數,至少指定你想使用一個UDF與數組公式一致。對於有興趣的人來說,以下是原始問題(http:// stackoverflow。com/a/38920761/3397613) - 查看更多信息的評論 – Mikegrann

回答

1

這裏就是我想通過UDF來解決:

' Reformats a list from a simple delimitation to a numbered list 
' Accepts arrays of strings for inList (allowing array formulas) 
' numFormat is a standard Excel-style format string (default "0. ") 
' inDelimiter is the delimiter in the input list 
' outDelimiter is the delimiter for the output list 
Public Function TO_NUMBERED_LIST(inList As Variant, Optional numFormat As Variant, _ 
Optional inDelimiter As Variant, Optional outDelimiter As Variant) As Variant 
    Dim i As Integer, j As Integer 

    ' Set default parameters 
    If IsMissing(numFormat) Then numFormat = "0). " 
    If IsMissing(inDelimiter) Then inDelimiter = vbNewLine 
    If IsMissing(outDelimiter) Then outDelimiter = inDelimiter 

    If IsArray(inList) Then ' Must loop through each entry if using as an array formula 
     Dim outList() As Variant 
     ReDim outList(0 To (UBound(inList) - LBound(inList)), 1 To 1) 

     j = 0 
     For i = LBound(inList) To UBound(inList) 
      If IsError(inList(i, 1)) Then 
       outList(j, 1) = inList(i, 1) 
      Else 
       outList(j, 1) = MakeNumbered(CStr(inList(i, 1)), CStr(numFormat), CStr(inDelimiter), CStr(outDelimiter)) 
      End If 
      j = j + 1 
     Next 

     TO_NUMBERED_LIST = outList 
    Else 
     TO_NUMBERED_LIST = MakeNumbered(CStr(inList), CStr(numFormat), CStr(inDelimiter), CStr(outDelimiter)) 
    End If 
End Function 

' Helper function to do the actual work of splitting lists, numbering them, and recombining them 
Private Function MakeNumbered(inList As String, Optional numFormat As String, _ 
Optional inDelimiter As String, Optional outDelimiter As String) As String 
    Dim i As Integer 
    Dim tokenArr() As String 
    tokenArr = Split(inList, inDelimiter) 

    For i = 0 To UBound(tokenArr) 
     tokenArr(i) = Format(i + 1, numFormat) & tokenArr(i) 
    Next 

    MakeNumbered = Join(tokenArr, outDelimiter) 
End Function 

我從以前的線程利用一些知識,喜歡的事實,輸入可能是一個數組(和整體功能可能在使用數組公式),但只會是一維的。

我已經使這個相當一般的重新格式化。它可以使用任何輸入分隔符(在你的情況下,一個換行符)列表和輸出使用任何所需的分隔符(在你的情況下,仍然是一個換行符)。 numFormat參數使用格式化功能並支持您在Excel中常見的格式。如果您需要幫助,請檢查the documentation

默認參數已經針對您的示例進行了調整 - 換行符作爲分隔符和「0」。「作爲編號格式。

+0

謝謝你的全力幫助 – Quinn

+0

@Quinn很高興爲你效勞。這些可重用的UDF很容易成爲我在SO上編寫的最有趣的東西,因爲它們可以在一般的日常工作流程中合理有用和靈活,而不僅僅是一次性的自動化任務。 – Mikegrann

+0

我在加載啓用UDF的文件時遇到「自動化錯誤」。調試器也在UDF的開始處指出函數聲明作爲問題。當文件打開時,UDF自動從SharePoint刷新數據,這可能導致問題? – Quinn

0

您可以對每個單元格值使用Split函數來創建一系列風險,然後將每個風險與序列ID進行前綴。然後,您可以使用Join函數將數組放回到單個值中以更新單元格。

根據換行符如何進入細胞,你可能需要在下面的示例代碼中使用vbCrLf,或vbNewLine代替vbLf

Option Explicit 

Sub AddRiskSequence() 

    Dim rngRisks As Range 
    Dim rngCell As Range 
    Dim varRisks As Variant 
    Dim lngIndex As Long 

    'set range with risk values 
    Set rngRisks = Sheet2.Range("B2:B4") 

    'iterate cells in risk column 
    For Each rngCell In rngRisks 
     'split cell contents by line feed into array 
     varRisks = VBA.Split(rngCell.Value, vbLf) 
     'iterate array and add sequence ids 
     For lngIndex = 0 To UBound(varRisks) 
      varRisks(lngIndex) = VBA.CStr(lngIndex + 1) & ") " & varRisks(lngIndex) 
     Next lngIndex 
     'rejoin array and update cell value 
     rngCell.Value = VBA.Join(varRisks, vbLf) 
    Next rngCell 

End Sub 

前:

enter image description here

後:

enter image description here

相關問題