Excel (VBA)

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

 
(Windows 11全般 : Microsoft 365)
特定文字を赤色に
投稿日時: 23/03/01 11:49:16
投稿者: 春麗

特定文字に対して、赤色に変更する様にしたいのですが、
セル内に複数の特定文字が存在すると最初の特定文字しか赤くなりません。何がたりないのでしょうか。
 
Sub 特定文字にカラー()
Dim IntRow As Long
Dim IntColumn As Long
Dim UsedRow As Long
Dim UsedClm As Long
Dim i As Long
Dim Target As String
Dim Start As Long
 
    'データ入力エリアを取得
    With ActiveSheet.UsedRange
        UsedRow = .Rows(.Rows.Count).Row
        UsedClm = .Columns(.Columns.Count).Column
    End With
 
    Target = "特定文字"
 
    '列ループ
    For IntRow = 1 To UsedClm
 
        '行ループ
        For IntColumn = 1 To UsedRow
 
            'セルに対象文字が含まれているか
            Start = InStr(Cells(IntColumn, IntRow), Target)
 
            If Start >= 1 Then
 
                '文字に色付け
                With Cells(IntColumn, IntRow)
                    .Characters(Start:=Start, Length:=Len(Target)).Font.ColorIndex = 3
                End With
 
            End If
         Next IntColumn
     Next IntRow
 
End Sub

回答
投稿日時: 23/03/01 14:51:17
投稿者: WinArrow
投稿者のウェブサイトに移動

現象とは、関係ないと思いますが、
変数の使い方が、「行」と「列」が逆になっている・・・
コードをよんでいて、混乱するよ!!
変えて方がよい。
 
でも、色付けのコードをテストした結果、問題はない。
 
 

回答
投稿日時: 23/03/01 15:36:34
投稿者: simple

これでいかがでしょうか。

Sub 特定文字にカラー()
    Dim IntRow  As Long
    Dim IntColumn   As Long
    Dim UsedRow As Long
    Dim UsedClm As Long
    Dim r       As Range
    Dim Target  As String
    Dim pos     As Long
    Dim s       As String

    'データ入力エリアを取得
    With ActiveSheet.UsedRange
        UsedRow = .Rows.Count
        UsedClm = .Columns.Count
    End With

    Target = "特定文字"

    For IntColumn = 1 To UsedClm
        For IntRow = 1 To UsedRow
            Set r = Cells(IntRow, IntColumn)
            s = r.Text
            If s <> "" Then
                pos = InStr(s, Target)
                Do Until pos = 0
                    r.Characters(Start:=pos, Length:=Len(Target)).Font.ColorIndex = 3
                    pos = InStr(pos + 1, s, Target)
                Loop
            End If
        Next
    Next
End Sub

回答
投稿日時: 23/03/04 11:57:51
投稿者: Nubo

多分、表型式じゃないのにUsedRangeを使っているからでは ?
 
simpleさんのコードを以下に変更でどうですか ?
 
   'データ入力エリアを取得
    With ActiveSheet.Range("A1").SpecialCells(xlLastCell)
        UsedRow = .Row '行カウント
        UsedClm = .Column '列カウント
    End With

回答
投稿日時: 23/03/04 13:07:53
投稿者: simple

(1)UsedRangeが必ずしもA列や1行目から始まっていないケースもあり得ます。
   私の提示したコードではその点がNGでした。処理漏れのセルが出て来てしまいます。

   For Each r In ActiveSheet.UsedRange
        'ここにセルrについての処理を書く
   Next
のように変更してください。
(2)この件についていえば、それほど色々な方法があるとも思えません。
   一つのセルの中に"特定文字"がいくつ現れるか事前にわからないとすれば、
   逐一調べるしか方法はありません。それが、Do ... Loopを使った方法です。
(3)もっとも細かく言えば、いくつか書き方はあります。例えば、
   Do While pos > 0 .... Loopのような書き方もあるでしょう。
   ただし、Do Loopを使うという基本は変わりません。
 
回答に不明な点があれば、遠慮なく追加質問をしてください。
もし、もう必要がなくなってしまっているのであれば、その旨書いて閉じて頂けますか?
また、単に忙しくなってしまっているだけであれば、簡単にそうコメント頂ければと思います。
ダンマリを続けられるのは気持ちのいいものではありません。

投稿日時: 23/03/08 11:38:05
投稿者: 春麗

WinArrowさん
行列のご指摘ありがとうございました。
 
Nuboさん
simpleさん
一行ずつ動かしてみると、私が作成したものと処理の動きの違いがハッキリわかります。
今使用しているデータはテンプレートですのでA列の1行目から必ず始まります。
でも他での活用も視野に入れて教えていただいた変更を加えてみました。
他のファイルで、幾つかのパターンがある全てのファイルで期待通りの動きが確認できました。
 
どうもありがとうございました。
助かりました。
ご報告遅くなり申し訳ありませんでした.