Excel VBA質問箱 IV

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

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


6507 / 13646 ツリー ←次へ | 前へ→

【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 お礼[未読]

【44802】行の高さ調整
質問  apple  - 06/12/1(金) 17:08 -

引用なし
パスワード
   はじめましてVBAの初心者です。

LenBでA列の各セルのバイト数(半角1byte/全角2byte)を調べ、
そのバイト数によって行の高さを調整するマクロを組みました。
(例:40バイトまでで1行分の高さ、80バイトまでで2行分の高さ…)

しかし、40バイト以内でもセルの中で改行している場合は、
2行分以上の行の高さが必要になります。
セルによって改行の無い場合と、複数回に渡り改行している場合があるので、
その両方に対応して、行の高さを調節出来る様にしたいと思っています。

宜しくお願い致します。

【44811】Re:行の高さ調整
発言  inoue E-MAIL  - 06/12/1(金) 18:39 -

引用なし
パスワード
   >....したいと思っています。
>宜しくお願い致します。
何が分からないのですか?それとも丸投げですか?

実際何行になるかを掴むのは難しいと思います。
フォントによっては文字数からでは掴めないし、
画面と印刷時でも状態は異なるでしょう。

てっとり早いのは「自動調整(Autofit)」だと思います。

【44819】Re:行の高さ調整
質問  Apple  - 06/12/1(金) 22:29 -

引用なし
パスワード
   回答頂きましてありがとうございました。
教えて頂いたAutfitを試しみます。

また、こちらの説明が不足していて申し訳ありません。
一番知りたい事は、セルの中の何バイト目で改行しているか、
という事です。
フォントスタイルはMSゴシックで、サイズも10.5ptで統一し
印刷した時に文章がが切れてしまわない事を想定して
行の高さを調整する所までは出来ました。

【44821】Re:行の高さ調整
回答  maverick  - 06/12/2(土) 0:55 -

引用なし
パスワード
   Sub test()
  Dim cnt As Long, txt As String
  txt = Range("A1").Value
  Do
    cnt = InStrB(cnt + 1, txt, vbLf)
    If cnt <> 0 Then Debug.Print cnt & "バイト目"
  Loop Until cnt = 0
End Sub

【44822】Re:行の高さ調整
回答  Kein  - 06/12/2(土) 1:19 -

引用なし
パスワード
   >セルの中の何バイト目で改行
しているかを知る条件として、バイト数は
>半角1byte/全角2byte
で勘定するとしたら、仮にアクティブセルの値でテストするとして・・

Sub Test_Len()
  Dim V As Variant
  Dim i As Long
 
  If InStr(1, ActiveCell.Value, vbLf) > 0 Then
   For Each V In Split(ActiveCell.Value, vbLf)
     i = i + LenB(StrConv(V, 128))
     Debug.Print i & " バイト目"
   Next
  End If
End Sub

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

確認してみてください。

【44842】Re:行の高さ調整
お礼  Apple  - 06/12/3(日) 12:40 -

引用なし
パスワード
   maverickさん、keinさん、ichinoseさん
ご丁寧な回答を頂き、ありがとうございました。

教えて頂いたものを一つずつ試してみます。
その際に、また何か分からない事が出てきたら質問するかと思いますが、
取り急ぎお礼まで。
本当にありがとうございました。
大変勉強になりました。

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