1576623097 マクロで行毎にセル内のフォントサイズを変更したい


今、Excelの1つのセル内に、

---------------
サンダーボルト
アクアマリンのままでいて
環八東街道交差点
--------------

という文字列が入力されております。
フォントサイズは「24」に設定されております。
また、このような3行の文字列が、A3セルからA30の各セルに入り、並んでおります。

この状況におきまして。

セル内1行目の文字サイズを20、2行目を14、3行目を16に、マクロで変更できるようにしたいのです。
マクロを記録すると、

With ActiveCell.Characters(Start:=1, Length:=7).Font
With ActiveCell.Characters(Start:=9, Length:=12).Font
With ActiveCell.Characters(Start:=22, Length:=8).Font

等が出てきたので、この辺りを活用したり、1gyoume、2gyoume、3gyoume等の変数を用意して何か処理をするのでしょうか…。ただ、上記は「サンダーボルト」「アクアマリンのままでいて」「環八東街道交差点」という、各行の文字数が7、12、8の場合でして。

この各行の文字数はランダムに違うので…なんとかそちらにも対応できたらと考えております。
お力添えいただけますと幸いです。
よろしくお願い致します。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2019/12/25 07:37:05

ベストアンサー

id:ken3memo No.1

回答回数299ベストアンサー獲得回数104

ポイント2000pt

テストでコードを作ってみました
https://youtu.be/g3KKlVqscDE?t=934
↑テスト結果

使ってみてください。

Excel VBA セル内を改行(VBLF)で区切られた文字列のフォントを行単位で変更するテスト

Option Explicit

Sub main()

    Dim y As Integer
    
    For y = 3 To 30  'a3からA30までループ
        Call test_font_resize(Cells(y, "A"))
    Next y

End Sub


'セル Rangeを受け取り 改行で区切られた文字列のフォントを変更するテスト
Sub test_font_resize(objRANGE As Range)

    Dim strBOX As Variant  '改行vbLfで分割後に入れる配列
    Dim nSTART As Integer  'フォント変更位置
    Dim nLEN As Integer    '文字数
    Dim i As Integer       'ループのカウンター
    
    '分割後のフォントサイズ
    Dim nSIZE(3) As Integer
    
    nSIZE(0) = 20   '文字のサイズ、一行目
    nSIZE(1) = 14    '2行目
    nSIZE(2) = 16   '3行目
    
    'セル内改行 vbLfで区切られているので、分割しstrBOXへ格納
    strBOX = Split(objRANGE.Cells(1, 1), vbLf)
    'ubound(strBOX) で↑の結果、カズがわかります
    
    'フォントのサイズを変更する
    nSTART = 1
    For i = 0 To 2  '三行目までサイズ変更
        If i > UBound(strBOX) Then Exit For '配列、改行の数をチェック
        nLEN = Len(strBOX(i))
        objRANGE.Cells(1, 1).Characters(Start:=nSTART, Length:=nLEN).Font.Size = nSIZE(i)
        nSTART = nSTART + nLEN + 1  '↑上の文字数と改行の文字一つを+
    Next i
    
End Sub

1.VBAのSplit関数を使用して、セル内改行された文字列を vbLf で区切り取得
strBOX = Split(objRANGE.Cells(1, 1), vbLf)

2.Characters(Start:=開始位置, Length:=文字数).Font.Size = フォントサイズ
セル内のフォントを部分的に変更したかったので、
マクロ記録された .Characters を使用する

3.エラーチェックで分割された文字列の数を数える
必ず固定の改行があると決めつけると痛い目みるので、
UBound(strBOX) などで、改行の行数をチェックしてみた。

まだまだ、運用時にエラーがあるかもしれませんが、
解決の糸口、サンプルとなれば幸いです。


https://www.youtube.com/watch?v=g3KKlVqscDE
↑失敗したデバッグ解説最初から※失敗を時間のある時に見て笑ってください・・・

他1件のコメントを見る
id:ken3memo

>「vblf」という文字でもない改行コードを探すなんて、思いつかないです自分は…(^^;)
この質問のコメント欄でnepia11さんが紹介されていた
セル内の改行コードに注意
http://officetanaka.net/excel/vba/tips/tips89.htm
↑がコードと結果の画像が出ていてわかりやすいと思います。

[gogle:vba vbcr vblf]で検索

あとは、なれかなぁ。
私も動画で失敗していたみたいに、初めvbcrlfを探したりして間違ってたし ぉぃぉぃ

13分30秒辺りで、ken3さんはUBound(strBOX)が1の場合、i=2の時にエラーが起こり、エラーが起こる前にExit Forでループを抜けるというお話でしたが。
なぜエラーになるのでしょうか?
i = 2 > UBound(strBOX) = 1
というのは、2 > 1 で、式的にはエラーでもないような気もするのですが。


↑これは、私のコメントや説明がよくなかったかな。
UBound(strBOX)が1の場合(0,1の二行・二つの配列の時)
i = 2(三行目の時)にエラーが発生するので、
エラーを発生させる前にループを抜けたいから

For i = 0 To 2 '三行目までサイズ変更
If i > UBound(strBOX) Then Exit For '配列、改行の数をチェック

↑ If 2 > 1 の時 Then ループを抜ける※三行目の処理はしない
としたエラー回避の仕掛けでした

このあたりのループの作り方も なれ?なので、数をこなすと。
また、ループの作りが
For i = 0 To 2 '三行目までサイズ変更
としていましたが、下記の用に分割された個数分だけ回すように
For i = 0 To UBound(strBOX) - 1 '分割された行数分ループする 配列が0から始まるので-1
↑みたいなループを作るのもアリかなぁ。

あっ、これだと、4行ループを回った時にフォントサイズの指定が
nSIZE(0) = 20 '文字のサイズ、一行目
nSIZE(1) = 14 '2行目
nSIZE(2) = 16 '3行目
としているので、i=3の4行目でnSIZE(3)が無いよとエラーになるのか・・
For i = 0 To UBound(strBOX) - 1 '分割された行数分ループする 配列が0から始まるので-1
If i = 3 Then Exit for '←三行目以降は処理しないので抜ける
↑など、また下に違う条件でチェック用If文を書くとかするのかな?

このあたりは、プログラミング言語も言葉なので、表現はイロイロかなぁ
※いろいろな表現でも、シンプルに伝わるようにコードを書いた方がいいですね。
※※ひねった表現・コードではなく、If文もシンプルなほうがいいと思います。



>関数を作るときは、「Sub~」でも作れるのでしょうか?

↑これは、値を返さない関数なら、Sub XXXXで作成してOKだと思います

>関数といえば「Function~」で始まるものが多いと思っていたのですが…。

値を返さなければ、なんて、上で書いていましたが、
別に
Functionで書いて、リターン値を返さなくてもいいので※お行儀が悪いかもしれないが
はじめは好きなように書いて大丈夫かな?

[gogle:vba sub function]で検索

SubとFunctionで同じプロシージャを作ってみた
http://www.excel-wing.com/study/macro/588

手前味噌解説だと
http://www.ken3.org/vba/backno/vba024.html
http://www.ken3.org/vba/backno/vba022.html
http://www.ken3.org/vba/backno/vba023.html
↑かな

いきなり、トリック満載のコードは書けないと思うので、
シンプルなコードを一つ一つ作成してなれていくと
いろいろとコードが書けるようになると思います。

あとは、痛い目にいっぱいあうと、エラー処理や例外処理も自然と・・

コメントを読み返すと変なところもありますが、
一つでもコード作成の参考となれば幸いです

2019/12/24 07:15:49
id:moon-fondu

度々の質問にご回答いただきまして、ありがとうございます。
split関数で文字列分割、uboundで分割した文字列の個数を出すんですね。

UBound(strBOX)が2なら、三行目があるi=2のとき、2 > 2 となって式を満たさないのでIf文を抜けずに、そのまま下のnLEN = LEN(strBOX(i))に進めるというkとですね。

SubとFunctionの違いもありがとうございます!
教えていただいた解説の方でまた勉強させていただきます(^^;)

2019/12/25 07:26:42
  • id:nepia11
    http://officetanaka.net/excel/vba/tips/tips89.htm
    これを参考に「改行コード」を検索して、それぞれの行の文字数を数えることができそうです。

  • id:moon-fondu
    nepia11さんコメントありがとうございます!すみません、初見で気づかなかったです…。
    リンクありがとうございます。
    0D0A難しいですね…「上位バイトと下位バイトがスワップしていますので、次のように記録されているのがわかります。」ってところで「えっ?」となりました。

    0Aなんてどこにもなく、0xしか見当たらないのですが…もう少しじっくり読み、改行コードの理解を深めていきたいと思います!
  • id:moon-fondu
    yoshiyaさんコメント書いてくれましたか。消えております…またお願いします!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません