Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
文字列の一部のフォントの色を変更
投稿日時: 21/01/02 18:33:08
投稿者: myubu

選択肢がなかったので Excel 2016 としてますが Excel 2019 です
 
点訳のお手伝いをさせていただいておりますが、たとえば
セルの中に『1枚』の文字があった場合、次のセルに『#1まい』と点訳するための
文字列に変換しています(基本はひら仮名を使用)
※『#』は『点字線付』フォントでは右図のように       −●
 6点の内 3、4、5、6の点で逆L字型となり         −●
 その後の点字は数字ですよという『数符』を表す       ●●
 
あまり一般的ではないため『ゴシック』の中に1〜2文字『明朝』が混じっている
みたいに考えていただければ良いかと思います 
 
この『数符』を目立つように赤に色付けするため下記のマクロを作成しました
 
上記の『#1まい』の場合はOKなんですが   ※『#』は『点字線付』フォント
例えば『#1おく #5000まん』のように  ※『#』は『点字線付』フォント
一つのセルに2個あった場合に最初の『#(点字線付フォント)』が
『#(MSゴシックフォント)』に戻ってしまいます
 
※EXCEL全体は『MSゴシック』フォントが標準で
 『数符』のみ『点字線付』フォントに変更しています
 
『myRng』セルの中を1文字ずつ順番に調べてフォント名が『点字線付』だったら
赤色に変更するというマクロです
---------------------------------------------------------
  For i = 1 To Len(myRng)
    If myRng.Characters(i, 1).Font.Name = "点字線付" Then
      myRng.Characters(i, 1).Font.ColorIndex = 3
    End If
  Next i
---------------------------------------------------------
 
1文字がOKで2文字目がダメな理由がわかりません
正月早々恐縮ですがご教示いただければと思います
 
説明がわかりにくいかと思いますが、よろしくお願いいたします

回答
投稿日時: 21/01/02 20:04:44
投稿者: WinArrow
投稿者のウェブサイトに移動

参考オード
 
Dim myRNG As Range
Dim i As Long
    Set myRNG = Range("A1")
    With myRNG
        For i = 1 To Len(.Value)
            If .Characters(Start:=i, Length:=1).Font.Name = "○○○" Then
                .Characters(Start:=i, Length:=1).Font.ColorIndex = 3
            End If
        Next
    End With

回答
投稿日時: 21/01/02 21:02:09
投稿者: simple

当方もExcel2019ですが、再現しませんねえ。
(一つのセルの中で、フォントを二種類設定した箇所を複数作り、
特定フォントのみ赤字にすると、その部分だけ赤くなりますよ。)
 
念のための確認ですが、
(1)コードを省略せずに提示してもらえますか?
   Sub から 変数宣言とかも省略せずに End Subまで記載してもらえますか?
   なにか記載を省略している作業は無いですか?
(2)
>セルの中に『1枚』の文字があった場合、次のセルに『#1まい』と点訳するための
>文字列に変換しています(基本はひら仮名を使用)

とのことですが、#以外はどんなフォントなんですか?
#以外は点字ではない普通のフォントなんですか?
 
まったく別のブックで、再度トライしてみては々でしょうか。
なんらかの思い違いとか混入していないでしょうか。
ちょっと普通では想定しにくいことですよね。
(だから質問なさったのでしょうけど。)
 
# WinArrowさんのコードは、質問者さんのコードとほぼ同じような気がしますが・・・。

投稿日時: 21/01/02 22:14:27
投稿者: myubu

正月の休みにもかかわらず早速回答いただきましてありがとうございます
 
WinArrowさんの回答にてテストいたしましたが結果は同じでした
 
simpleさんの回答に対して下記を追加します
 
(2)#以外は点字ではない普通のフォントなんですか?
セルには『#1まい』と『MSゴシック』フォントで入力後『#』を選択し
『点字線付』フォントに変換しています
 
(1)コードを省略せずに提示してもらえますか?
コードは下記の通りです
-------------------------------
Sub mojiiro()
 
Dim myRng As Range
Dim i As Integer
 
Worksheets(1).UsedRange.Select
For Each myRng In Selection
 
'----異なるフォントが混在するセルのみ処理する
'----セルの中にフォントが混在していると『Null』を返す
  If (IsNull(myRng.Font.Name) = True) Then
 
'----セルの文字列を1文字ずつ順番に調べる
  For i = 1 To Len(myRng)
    If myRng.Characters(i, 1).Font.Name = "点字線付" Then
      myRng.Characters(i, 1).Font.ColorIndex = 3
    End If
  Next i
  End If
Next myRng
 
End Sub
---------------------------------
出来ればどこが悪いのかもお教えいただけると助かります
 
以上、よろしくお願いいたします

回答
投稿日時: 21/01/02 22:26:48
投稿者: WinArrow
投稿者のウェブサイトに移動

このコードを実行すると、
フォントが変わってしまう
ということでしょうか?
 
私の環境には、『点字線付』フォントがありませんので、
同じ条件では、再現テストはできません。
 
フォント名をイミディトウィンドウに表示するなどを追加して
ステップ実行してみましょう。
 

投稿日時: 21/01/02 22:37:05
投稿者: myubu

すみません
さっきのに追記しておけばよかったのですが・・・
 
『#1おく #5000まん』をステップ実行すると
最初の『#』は『点字線付』フォントのまま赤色になります
これは意図したとおりです
そのあとは 1、お、く、(スペース)、までは黒色のまま進みます
ここまでは意図したとおりに進みます
次のステップで
2度目の『#』が『点字線付』フォントのまま赤色になると同時に
最初の『#』が赤色のまま『MSゴシック』フォントに変わります
これがなぜなのかわかりません
 
以上、よろしくお願いいたします

回答
投稿日時: 21/01/02 22:40:08
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
セルには『#1まい』と『MSゴシック』フォントで入力後『#』を選択し
『点字線付』フォントに変換しています

↑は、手操作ですか?
若し、手操作でしたら、その時に赤字に変更すればよいのではの?
VBAで操作しているのでしたら、対象文字列を指定しているんだから、一緒に色も変更すれば?

投稿日時: 21/01/02 22:47:11
投稿者: myubu

そうですよね
『点字線付』フォントなんて使う人は少ないですよね
 
例えば『MSゴシック』の中に数文字『HGP創英角ポップ体』を入れる
とかでも結果的に同じようになるのではないかと思いますが
 
なんて、お願いしている身で申し訳ありません

回答
投稿日時: 21/01/02 22:49:57
投稿者: WinArrow
投稿者のウェブサイトに移動

myubu さんの引用:
すみません
さっきのに追記しておけばよかったのですが・・・
 
『#1おく #5000まん』をステップ実行すると
最初の『#』は『点字線付』フォントのまま赤色になります
これは意図したとおりです
そのあとは 1、お、く、(スペース)、までは黒色のまま進みます
ここまでは意図したとおりに進みます
次のステップで
2度目の『#』が『点字線付』フォントのまま赤色になると同時に
最初の『#』が赤色のまま『MSゴシック』フォントに変わります
これがなぜなのかわかりません
 
以上、よろしくお願いいたします

 
最初の質問時に、このようn説明をすべきではないでしょうか?
 
フォントによるものなのか?
を検証するために
別のフォントで確かめるとよいでしょう。
 
 

回答
投稿日時: 21/01/02 23:28:22
投稿者: simple

回答ありがとうございました。
 
Excel2010,2019の両方で、検証してみましたが、再現できませんでした。
ただし、こちらの検証範囲が狭いのかも知れませんので、
そうした事象が発生しないと断言するつもりもありません。
フォントの関係かも知れませんね。
お力になれませんでした。
 
参考までに検証コードを挙げておきます。

Sub test()
    Call defaultfont([A1])
    Call changefontColor([A1])
    Call changefontColor([A1])
End Sub

Function defaultfont(r As Range)
    With r
        .Value = "aaaaabbbccc"
        .Font.ColorIndex = xlAutomatic
        .Font.Name = "MS P明朝"
        .Characters(Start:=1, Length:=1).Font.Name = "MS Pゴシック"
        .Characters(Start:=6, Length:=1).Font.Name = "MS Pゴシック"
        .Characters(Start:=9, Length:=1).Font.Name = "MS Pゴシック"
    End With
End Function
Sub changefontColor(r As Range)
    Dim i&
    If IsNull(r.Font.Name) Then
        For i = 1 To Len(r)
            With r.Characters(i, 1).Font
                Debug.Print i; .Name; .ColorIndex
                If .Name = "MS Pゴシック" Then
                    .ColorIndex = 3
                End If
            End With
        Next i
        Debug.Print "----------------"
    End If
End Sub

投稿日時: 21/01/02 23:33:31
投稿者: myubu

WinArrow さんの引用:

若し、手操作でしたら、その時に赤字に変更すればよいのではの?
VBAで操作しているのでしたら、対象文字列を指定しているんだから、一緒に色も変更すれば?

 
そうですね、今後増やすデータについてはそうしようと思いますが
実はかなりの数フォントを変更したデータがあるんです
 
で、あとから目立つようにできないかと言われて簡単にできるのでは・・・
と作ってみたものの何故か2個以上になったら質問のようになってしまって
 
もう一度最初から別ファイルを作って検証してみます。

回答
投稿日時: 21/01/03 02:14:51
投稿者: K.Hiwasa
投稿者のウェブサイトに移動

墨点字フォントを入れて、A1セルに『#1まい』、A2セルに『#1おく #5000まん』と入力して、#を点字線付に変更して実行したところ、再現しました。
他のフォントでも、再現しました。
 
2回目の色設定の際に、1回目の色変更箇所のフォントがMSゴシックになります。
しかも1回目の色変更箇所が1文字目の場合のみのようです。
また、マクロでフォントを設定した場合は、大丈夫なようです。
(2回目の実行では、追加部分なしでも戻されません。)
なぜこの現象が起こるかはわかりませんが、上記を踏まえて対処しました。
 

Sub mojiiro()
 
Dim myRng As Range
Dim i As Integer

Worksheets(1).UsedRange.Select
For Each myRng In Selection
 
'----異なるフォントが混在するセルのみ処理する
'----セルの中にフォントが混在していると『Null』を返す
  If (IsNull(myRng.Font.Name) = True) Then
 
'----セルの文字列を1文字ずつ順番に調べる
     For i = 1 To Len(myRng)
        If myRng.Characters(i, 1).Font.Name = "点字線付" Then
           myRng.Characters(i, 1).Font.ColorIndex = 3
'----1文字目の場合、フォントをマクロで再設定
           If i = 1 Then
              myRng.Characters(i, 1).Font.Name = "点字線付"
           End If
        End If
     Next i
  End If
Next myRng
 
End Sub

繰り返しになりますが、理由はわかりません。

投稿日時: 21/01/03 10:12:08
投稿者: myubu

WinArrowさん、simpleさん、K.Hiwasaさん
皆さん正月早々からありがとうございました
 
K.Hiwasaさんの『VBAによる再設定』でうまくいきました
 
残念ながら原因については不明(おそらく、バグ?)との事
当然、私にわかるはずもないと納得しました
 
皆さんお忙しい中、本当にありがとうございました