[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Characters について』(よん)
【やりたい事】
A1セルの文字列を1文字ずつ抽出して、太字であればその文字色を赤色にする。
【問題点】
A1セルに入力した文字列のうち、「1文字目が太文字の場合」のみうまく動作しません。
※太字が解除されたり、色が着かなかっり。
●原因が分かる方居りましたらよろしくお願いします。
___
Sub test()
Dim n As Long '文字数 Dim i As Long '繰り返し変数
'文字数を設定 n = Len(Range("A1"))
'1文字ずつ抽出して、太字であれば赤字にする。 For i = 1 To n If Range("A1").Characters(i, 1).Font.Bold = True Then Range("A1").Characters(i, 1).Font.Color = vbRed End If Next i End Sub
< 使用 Excel:Excel2016、使用 OS:Windows8 >
「1文字目が太文字の場合」これがちょっと解らない。
まあ、10数年前の知識だけですけど。
(Ihaveapen) 2021/06/16(水) 12:35
Sub 研究用() Dim i As Long
For i = 1 To Len(Range("A1").Value) With Range("A1").Characters(i, 1) Debug.Print .Text, "Bold = " & .Font.Bold If .Font.Bold = True Then .Font.Color = vbRed End With Next i End Sub
(もこな2) 2021/06/16(水) 12:38
当方Excel2010ですが、 1文字目のBoldが解除されてしまう現象は確認できました。 (色が付かないって方は再現できず)
以下の悪あがきコードで、一見何とかなってる風には見えます。 (見えるだけかも知れませんけど)
Sub 太字は赤字に() Dim i As Long For i = 1 To Len(Range("A1").Characters.Text) With Range("A1").Characters(i, 1) If .Font.Bold Then .Font.Bold = False .Font.Color = vbRed .Font.Bold = True End If End With Next i End Sub
(白茶) 2021/06/16(水) 12:45
回答ありがとうござます。問題解決出来ず追加の情報を記載させて頂きます。
言葉足らずで分かりづらく申し訳ありません。よろしくお願いします。
___
まず、うまくいかない場合のパターンがもう少し具体的に分かったので、追記します。
●うまくいかないパターン
・A1セルに 『確認用文字列』と入力
・A1セル選択状態のまま、『確認用』の文字だけ選択して、リボンの太字ボタンを押して太字にする
・エンターを押してA2セルに移動
・マクロを実行 → 『確』の文字が太字赤字、『認用文字列』が細字黒字になりうまくいかない
●うまくいくパターン
・A1セルに『確認用文字列』と入力
・A1セル選択状態のまま、『確認用文字列』全てを選択して、リボンの太字ボタンを押して太字にする
・エンターを押してA2セルに移動
・再度A1セルを選択して、『文字列』の文字だけ選択して、リボンの太字ボタンを押して細字に戻す
・エンターを押してA2セルに移動
・マクロを実行 → 『確認用』の文字のみが太字赤字となり、うまくいく
●●ステップ実行について
上記の『うまくいかないパターン』を、もこな2様のマクロでステップ実行してみたところ、
1文字目『確』の『.Font.Color = vbRed』を実行した時点で、
【『確』の文字が太字赤字、『認用文字列』が細字黒字】となり、
以降『認用文字列』はFont.Bold=Trueでないと判断されてしまいます。
※白茶様のマクロステップ実行でも同様に1文字目で不具合が生じます。
(よん) 2021/06/16(水) 13:34
更に足掻いてみましょう...
Sub 太字は赤字に2() Dim i As Long, ary() As Boolean Dim c As Range Set c = Range("A1") ReDim ary(1 To Len(c.Characters.Text)) For i = 1 To UBound(ary) ary(i) = c.Characters(i, 1).Font.Bold Next i For i = 1 To UBound(ary) With c.Characters(i, 1) .Font.Bold = False If ary(i) Then .Font.Color = vbRed .Font.Bold = ary(i) End With Next i End Sub
パターン1 1.A1に[確認用文字列]と入力 2.[文字列]部分だけBold パターン2 1.A1に[確認用文字列]と入力 2.A1自体をBoldに 3.[確認用]部分だけBold解除
の両方で確認してみました。 こちらの環境では大丈夫そうです。
途中、パターン2で何度か、勝手に文字が増殖するケースが発生しました。 For i = 1 To UBound(ary) With c.Characters(i, 1) If ary(i) Then .Font.Bold = False .Font.Color = vbRed .Font.Bold = ary(i) End If End With Next i とした場合です。
[確認用文認用文字列] 黒黒黒赤茶茶茶赤赤 ←[茶]ってなんやねん... 太太太太細細細太太
但し数式バーの内部は[確認用文字列]のまま 別セルで =A1 として参照しても[確認用文字列] でもA列の列幅をAutoFitさせると[確認用文認用文字列]の幅に合わせられる。 摩訶不思議....
(白茶) 2021/06/16(水) 14:01
回避するなら、一旦情報を記録しておいて、
その情報に従って全部設定しなおす感じでしょうか?
Sub test()
Dim chs As Characters Dim v() As Boolean Dim i As Long
ReDim v(1 To Range("A1").Characters.Count)
For i = LBound(v) To UBound(v) v(i) = Range("A1").Characters(i, 1).Font.Bold Next
For i = LBound(v) To UBound(v) If v(i) Then With Range("A1").Characters(i, 1).Font .Bold = True .Color = vbRed End With End If Next End Sub
もっとうまいロジックがあるような気がしないでもないですが、
思いつかないです^^;
(まっつわん) 2021/06/16(水) 15:05
回答ありがとうございます。
双方試してみましたが、無事解決しました!
(白茶様の文字増殖バグ?も確認しました 笑)
配列にBooleanにと、自分では思いつかない対処法で大変参考になりました。
早急な回答本当にありがとうございました^^
(よん) 2021/06/16(水) 15:38
(マナ) 2021/06/20(日) 17:55
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.