|
こんにちは。
>一番知りたい事は、セルの中の何バイト目で改行しているか、
>という事です。
>フォントスタイルはMSゴシックで、サイズも10.5ptで統一し
ということだと
「123456789012345678901234567890123456789D」という文字列は
123456789012345678901234567890123456789
D
表示されることを考慮しなければなりませんね!!
以下のような関数があれば、判断できませんか?
標準モジュールに
'=====================================================================
Sub main()
Dim ans As Variant
Dim idx As Long
Dim smp As String
smp = "123456789012345678901234567890123456789D"
MsgBox "例1 :" & smp
ans = spilt_line(smp, vbLf)
For idx = LBound(ans, 2) To UBound(ans, 2)
MsgBox "Vblfコード : " & IIf(ans(1, idx) = 1, "あり", "なし") _
& vbCrLf & "文字 : " & ans(2, idx)
Next
smp = "ああああああああああ" & vbLf
MsgBox "例2 :" & smp
ans = spilt_line(smp, vbLf)
For idx = LBound(ans, 2) To UBound(ans, 2)
MsgBox "Vblfコード : " & IIf(ans(1, idx) = 1, "あり", "なし") _
& vbCrLf & "文字 : " & ans(2, idx)
Next
smp = "aaaaaaaaaaa" & vbLf & "bbbbbbbbbbb" & vbLf & "cccccccccc"
MsgBox "例3 :" & smp
ans = spilt_line(smp, vbLf)
For idx = LBound(ans, 2) To UBound(ans, 2)
MsgBox "Vblfコード : " & IIf(ans(1, idx) = 1, "あり", "なし") _
& vbCrLf & "文字 : " & ans(2, idx)
Next
smp = "ああああああああああいいいいいいいいいい" & _
"ううううううううううええええええええええ" & _
"おおおおおおおおおお" & vbLf & "かかかかかかかかか"
MsgBox "例4 :" & smp
ans = spilt_line(smp, vbLf)
For idx = LBound(ans, 2) To UBound(ans, 2)
MsgBox "Vblfコード : " & IIf(ans(1, idx) = 1, "あり", "なし") _
& vbCrLf & "文字 : " & ans(2, idx)
Next
End Sub
'==========================================================================
Function spilt_line(ByVal mystr As Variant, ByVal deli As Variant, Optional ByVal mln As Long = 40) As Variant
'機能 : 指定された文字列を改行(Vblf)毎又は、指定された長さ毎の文字列に分ける
'input : mystr 対象文字列
' deli 区切り文字(但し、1文字に限る)
' mln 区切り長(バイト単位) 尚、deliによる区切り文字が優先される
' 省略可(省略時は 40バイト)
'Ouput : spilt_line 2次元の配列が作成される
' split_line(xx,1) 1 区切り文字で分割 0 区切り文字で分割ではない
' split_line(xx,2) 区切られた文字列 尚、区切り文字は含まれない
Dim g0 As Long 'Mystrのインデックス
Dim g1 As Long 'カレントラインの文字列長
Dim g2 As Long '配列 llnの添え字
Dim g3 As Long '0 直前のラインが区切り文字なし、1 直前のラインが区切り文字あり
Dim wk As String
Dim lln() As Variant
g1 = 0
g2 = 0
g3 = 0
wk = ""
For g0 = 1 To Len(mystr)
If Mid(mystr, g0, 1) = deli Then
ReDim Preserve lln(1 To 2, 1 To g2 + 1)
lln(1, g2 + 1) = 1
lln(2, g2 + 1) = wk
g2 = g2 + 1
g1 = 0
wk = ""
g3 = 1
ElseIf g1 + LenB(StrConv(Mid(mystr, g0, 1), vbFromUnicode)) > mln Then
ReDim Preserve lln(1 To 2, 1 To g2 + 1)
lln(1, g2 + 1) = 0
lln(2, g2 + 1) = wk
g2 = g2 + 1
g1 = LenB(StrConv(Mid(mystr, g0, 1), vbFromUnicode))
wk = Mid(mystr, g0, 1)
g3 = 0
Else
wk = wk & Mid(mystr, g0, 1)
g1 = g1 + LenB(StrConv(Mid(mystr, g0, 1), vbFromUnicode))
g3 = 0
End If
Next
If g1 > 0 Or g3 = 1 Then
ReDim Preserve lln(1 To 2, 1 To g2 + 1)
lln(1, g2 + 1) = 0
lln(2, g2 + 1) = wk
g2 = g2 + 1
End If
If g2 > 0 Then
spilt_line = lln()
End If
End Function
としてmainを実行してみてください。
4つの例題文字列で試しています。
このspilt_lineが使えませんか?
確認してみてください。
|
|