Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


37080 / 76732 ←次へ | 前へ→

【44826】Re:行の高さ調整
発言  ichinose  - 06/12/2(土) 14:20 -

引用なし
パスワード
   こんにちは。

>一番知りたい事は、セルの中の何バイト目で改行しているか、
>という事です。
>フォントスタイルはMSゴシックで、サイズも10.5ptで統一し

ということだと

「123456789012345678901234567890123456789D」という文字列は

123456789012345678901234567890123456789


表示されることを考慮しなければなりませんね!!

以下のような関数があれば、判断できませんか?

標準モジュールに

'=====================================================================
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が使えませんか?

確認してみてください。
0 hits

【44802】行の高さ調整 apple 06/12/1(金) 17:08 質問
【44811】Re:行の高さ調整 inoue 06/12/1(金) 18:39 発言
【44819】Re:行の高さ調整 Apple 06/12/1(金) 22:29 質問
【44821】Re:行の高さ調整 maverick 06/12/2(土) 0:55 回答
【44822】Re:行の高さ調整 Kein 06/12/2(土) 1:19 回答
【44826】Re:行の高さ調整 ichinose 06/12/2(土) 14:20 発言
【44842】Re:行の高さ調整 Apple 06/12/3(日) 12:40 お礼

37080 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free