今、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の場合でして。
この各行の文字数はランダムに違うので…なんとかそちらにも対応できたらと考えております。
お力添えいただけますと幸いです。
よろしくお願い致します。
テストでコードを作ってみました
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
↑失敗したデバッグ解説最初から※失敗を時間のある時に見て笑ってください・・・
>「vblf」という文字でもない改行コードを探すなんて、思いつかないです自分は…(^^;)
この質問のコメント欄でnepia11さんが紹介されていた
セル内の改行コードに注意
http://officetanaka.net/excel/vba/tips/tips89.htm
↑がコードと結果の画像が出ていてわかりやすいと思います。
[gogle:vba vbcr vblf]で検索
あとは、なれかなぁ。
私も動画で失敗していたみたいに、初めvbcrlfを探したりして間違ってたし ぉぃぉぃ
↑これは、私のコメントや説明がよくなかったかな。
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
度々の質問にご回答いただきまして、ありがとうございます。
2019/12/25 07:26:42split関数で文字列分割、uboundで分割した文字列の個数を出すんですね。
UBound(strBOX)が2なら、三行目があるi=2のとき、2 > 2 となって式を満たさないのでIf文を抜けずに、そのまま下のnLEN = LEN(strBOX(i))に進めるというkとですね。
SubとFunctionの違いもありがとうございます!
教えていただいた解説の方でまた勉強させていただきます(^^;)