personal.xls 強化講座

Home What's
New
Site
Concept
生産性向上
基本テクニック
トラブル回避
テクニック
生産性向上
リンク
personal.xls
強化講座
生産性向上
ツール
Site
Map
Coffee
Break
Guest
Book
地球風
画像館
Q&A Salon
EXCELの質問はこちらへ

 

1.あるとちょっと便利なマクロ(21- )
05/06/2000 -

このページのマクロ(テキスト)の表示

(21) 文字列を検索し、その文字だけに書式を設定する
 


Excelでドキュメントを作成していると、ある文字(または文字列)だけに書式を設定する(したい)ということがたまにあります。

例えば、下の図はファンクションキーのページをExcelに貼り付けたものですが、このシートで★だけ文字の色を赤く太字にして強調させたいというような場合です。

    

もちろん、数式バー上で(あるいはF2を押してセルを編集モードにしてセルの中で)★だけ選択して、メニューやツールバーのボタンから「書式設定」することは可能ですが、数が多いと大変な手間がかかります。セル全体ではなく一部分の文字だけの書式設定なので、F4などの繰り返しキーも役に立ちません。
 

Excel2002からは、「置換」オプションを指定することで、置換後のセルの書式を変更することが可能になりました。(Excel2000では出来ません)
そこで、置換後の文字列を検索文字と同じにして、書式設定することで解決するかと思い、やってみました。

右図で「オプション(T)」ボタンを押すと、


 
書式指定のボタンが現れます。

ここで、「置換後の文字列(E)」の方の「書式(M)」ボタンを押すと、
「書式の変換」という設定画面が表示されます。

この画面はセルの書式設定と同じ画面ですが、「罫線」は指定できません。

例として「文字色を赤で太字」という書式を指定すると、
プレビューとして先ほど設定した書式を確認することが出来ます。

これで、「すべて置換(A)」を押して★がに置き換わってくれるとうれしいのですが、

残念なことに★という文字を含むセル全体の書式が変わってしまいます。★だけがに置換されるわけではありません。

    
 

そこで、personal.xls に追加していつでも使用できるマクロを考えました。 (Excel2000とExcel2002で動作確認しています)

以下で紹介しているマクロは、アクティブな(表示されている)シート全体に対して処理します。選択した範囲だけを対象に処理するわけではないので、注意してください。
 
起動すると、最初に「検索文字の指定」を求めてきます。

数字でも日本語(漢字)でも、複数文字でも構いません
ので、書式設定したい文字を入力します。
次に、文字の色を指定します。
指定可能な色は、一応カラーパレットのすべての色に対応していますが、順番はVBAのカラーインデックス値の順番になっています。
   
 
その後、太字にするか、
斜体にするか、
下線を付けるか、
取り消し線をつけるか、

聞いてくるので、それぞれ答えます。

ここまで指定すると、アクティブなシートから指定した文字(または文字列)を検索し、その文字だけに書式を設定して、結果を表示します(下図)。
1つのセルの中に指定した文字(または文字列)が2つ以上入っていても、それぞれについて書式を設定します。

    

もし処理結果が気に入らなければ、再度マクロを起動して同じ文字列を指定し、あとは色・太字・斜体・下線・取り消し線ともすべてEnterキーを押していけば、書式設定されていない状態に戻せます。

なお、マクロをちょっと改造すれば文字サイズの指定も可能(マクロの書式設定の部分で、 .Size = 変数 とすればOK)ですが、文字サイズを変更するときとしないときでコードを分岐させないといけないので、今回は見送っています。
 
この機能を頻繁に使われる方は、メニューバーに登録しておくと、呼び出しやすいでしょう。
右図はExcel2002で一番下に追加した例です。

メニューバーへの登録方法は、こちらを参考にしてください。
今回は、メニューバーへの登録方法のページは修正していませんが、追加の方法は他のメニューと同様です。右図のサンプルでは、FaceID558番を使っています。
   
 
Sub search_and_fontstylechange()            '2003/11/30 指定した文字列を検索し、その文字だけに書式を設定する。
'
    Dim i As Long
    Dim tmpValue As Variant
    Dim response As Integer
    Dim tmpRange As Range
    Dim tmpCount As Long

    Dim search_char As String
    Dim search_char_len As Long
    Dim start_pos As Long

    Dim tmpColorIndex As Long
    Dim flgBold As Boolean
    Dim flgItalic As Boolean
    Dim tmpUnderLine As Variant
    Dim flgStrikethrough As Boolean
    Dim tmpFontStyle As String
    Dim arColorIndex As Variant
    arColorIndex = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, _
                        10, 11, 12, 13, 14, 15, 16, _
                        33, 34, 35, 36, 37, 38, 39, _
                        40, 41, 42, 43, 44, 45, 46, 47, 48, 49, _
                        50, 51, 52, 53, 54, 55, 56)
    tmpColorIndex = -1
    flgBold = False
    flgItalic = False
    flgStrikethrough = False
    tmpUnderLine = xlUnderlineStyleNone

                                                'シートが保護されているとこのマクロはエラーが発生する
    For Each tmpRange In ActiveSheet.UsedRange  'UsedRangeは使用している範囲全体が全て選択される
        If Not IsError(tmpRange.Value) Then     '#VALUE!や#DIV/0!などのエラーがあるとValueが参照できない
            If tmpRange.Value <> "" Then
                tmpCount = tmpCount + 1
            End If
        End If
    Next
    If tmpCount = 0 Then
        response = MsgBox("文字・数値が入力されているセルがありません", vbOKOnly + vbCritical, "エラー")
        Exit Sub
    End If

    search_char = InputBox("書式設定したい文字列を入力してください", "検索文字の指定")
    search_char_len = Len(search_char)
    If search_char_len = 0 Then
        Exit Sub
    End If

    Do While tmpColorIndex = -1
        tmpValue = InputBox("検索文字に設定する色を次の中から数字で指定してください" & vbCr & vbCr & _
                            "0:自動 , 1:黒 , 2:白 , 3:赤 , 4:明るい緑 , 5:青 , 6:黄 ," & vbCr & _
                            "7:ピンク , 8:水色 , 9:濃い赤 , 10:緑 , 11:濃い青 , 12:濃い黄 ," & vbCr & _
                            "13:紫 , 14:青緑 , 15:25%灰色 , 16:50%灰色 , 33:スカイブルー ," & vbCr & _
                            "34:薄い水色 , 35:薄い緑 , 36:薄い黄 , 37:ペールブルー ," & vbCr & _
                            "38:ローズ , 39:ラベンダー , 40:ベージュ , 41:薄い青 ," & vbCr & _
                            "42:アクア , 43:ライム , 44:ゴールド , 45:薄いオレンジ ," & vbCr & _
                            "46:オレンジ , 47:ブルーグレー , 48:40%灰色 , 49:濃い青緑 ," & vbCr & _
                            "50:シーグリーン , 51:濃い緑 , 52:オリーブ , 53:茶 ," & vbCr & _
                            "54:プラム , 55:インディゴ , 56:80%灰色", "文字色の指定", 0)
        If IsNumeric(tmpValue) Then
            For i = 1 To 41                                             'option base 1 が前提
                If Val(tmpValue) = arColorIndex(i) Then
                    tmpColorIndex = Val(tmpValue)
                    Exit For
                End If
            Next
        End If
    Loop

    response = MsgBox("検索文字を<太字>にしますか?", _
                vbYesNoCancel + vbQuestion + vbDefaultButton2, "書式")
    If response = vbYes Then
        flgBold = True
    Else
        If response = vbCancel Then
            Exit Sub
        End If
    End If
    response = MsgBox("検索文字を<斜体>にしますか?", _
                vbYesNoCancel + vbQuestion + vbDefaultButton2, "書式")
    If response = vbYes Then
        flgItalic = True
    Else
        If response = vbCancel Then
            Exit Sub
        End If
    End If
    response = MsgBox("検索文字に<下線>を付けますか?", _
                vbYesNoCancel + vbQuestion + vbDefaultButton2, "書式")

    '下線にはSingle,Double,各会計用の4種類あるが、今回はsingle下線のみ
    If response = vbYes Then
        tmpUnderLine = xlUnderlineStyleSingle
    Else
        If response = vbCancel Then
            Exit Sub
        End If
    End If
    response = MsgBox("検索文字に<取り消し線>を付けますか?", _
                vbYesNoCancel + vbQuestion + vbDefaultButton2, "書式")
    If response = vbYes Then
        flgStrikethrough = True
    Else
        If response = vbCancel Then
            Exit Sub
        End If
    End If

    tmpFontStyle = "標準"
    If flgBold Then
        tmpFontStyle = "太字"
        If flgItalic Then
            tmpFontStyle = "太字 斜体"
        End If
    Else
        If flgItalic Then
            tmpFontStyle = "斜体"
        End If
    End If

    tmpCount = 0
    start_pos = 0
    For Each tmpRange In ActiveSheet.UsedRange
        If Not IsError(tmpRange.Value) Then  '#VALUE!や#DIV/0!などのエラーがあるとValueが参照できない
            start_pos = InStr(1, tmpRange.Value, search_char, 0)
            Do While start_pos > 0
                tmpRange.Select
                With ActiveCell.Characters(Start:=start_pos, Length:=search_char_len).Font
                    .ColorIndex = tmpColorIndex
                    .Underline = tmpUnderLine
                    .Strikethrough = flgStrikethrough
                    .FontStyle = tmpFontStyle
                End With
                tmpCount = tmpCount + 1
                start_pos = InStr(start_pos + Len(search_char), tmpRange.Value, search_char, 0)
            Loop
        End If
    Next

    response = MsgBox(tmpCount & " 箇所に書式を設定しました。", _
                                    vbOKOnly + vbInformation, "処理終了")
'
End Sub
 
今回のマクロコードは、このページ上で紹介するために、上記の実行例のような動き(太字や斜体の設定を何度も確認してくる)にしましたが、本来は右図のようなユーザーフォームを1つ用意して、一度に書式等を指定できるようにした方がよいと思います。
というか、実際に私はそうして使っています。

ただその場合は、色や下線をドロップダウンリストから選ぶための設定もしないといけないし、テキストボックス・コンボボックス・チェックボックス・ボタンそれぞれについて入力された場合・押された場合のコードを書かないといけないし、ユーザーフォームとコード(今回だとsearch_and_fontstylechange)との間で値を受け渡すための変数宣言も変わります。
つまり、ホームページ上でコードを紹介するのが難しくなります。ということで、今回は断念しました。

ユーザーフォームの作成の経験がある方は、ご自分で改造してみてください。




色の指定をしているところ
 

←目次へ戻る / このページのマクロ(テキスト)の表示

Back Next

モーグ

Google
  Web excel7.com