🍄

VBAで文章を指定した折り返し文字数と行数に整形する

2022/07/06に公開

改行有りの文章を指定された行数で整形したい時
折り返し文字数はバイト数指定

Function setOrikaeshiLines(ByVal sentence, ByVal lineNumber, ByVal orikaeshiB)
    Dim setCount As Integer: setCount = 0
    Dim cCnt As Integer: cCnt = 0
    Dim lineCount As Integer: lineCount = 0
    Dim line As String: line = ""
    Dim dispSentence As String: dispSentence = ""
    Dim lineB As Integer: lineB = 0
    Dim c1 As String

    '最初の改行コードまでの文字数
    cCnt = InStr(sentence, vbLf)
    
    '改行有り、または、折り返し文字数より長い
    If cCnt > 0 Or LenB(sentence) > orikaeshiB Then
        
        '最大行数になるまでループ
        Do While lineCount < lineNumber And Len(sentence) > 0
             
            '最初の改行コードまでの文字数
            cCnt = InStr(sentence, vbLf)
            
            '改行コードがなければ文字列長を取得
            If cCnt = 0 Then
                cCnt = Len(sentence)
            End If
            
            '最初の改行コードまでの文字列を取得
            line = Left(sentence, cCnt)
            
            '改行コード以降の文字列をsentenceに上書き
            sentence = Mid(sentence, cCnt + 1, Len(sentence))
            
            '折り返し文字数より長い間はループ
            Do While LenB(line) > orikaeshiB And lineCount < lineNumber
                
                lineB = 0
                Do While lineB < orikaeshiB And Len(line) > 0
                    '全半格でバイト数が異なるので、1文字ずつカウント
                    c1 = Left(line, 1)
                    line = Mid(line, 2, Len(line))
                    lineB = lineB + LenB(c1)
                    '表示用変数に格納
                    dispSentence = dispSentence & c1
                Loop
                lineCount = lineCount + 1
            Loop
            
            If LenB(line) <= orikaeshiB Then
                dispSentence = dispSentence & line
		line = ""
                lineCount = lineCount + 1
            End If

        Loop
        If Len(sentence) > 0 or Len(line) > 0 Then
            dispSentence = dispSentence & " ...(以下省略)"
        End If
        
    Else
        dispSentence = sentence
    End If
    
    setOrikaeshiLines = dispSentence
End Function

Discussion