
| Home | What's New |
生産性向上 基本テクニック |
トラブル回避 テクニック |
生産性向上 リンク |
personal.xls 強化講座 |
生産性向上 ツール |
Site Map |
Coffee Break |
Guest Book |
地球風 画像館 |
Q&A
Salon EXCELの質問はこちらへ |
| 1.あるとちょっと便利なマクロ(21- ) |
05/06/2000 -
|
| (21) 文字列を検索し、その文字だけに書式を設定する | ||
|
もちろん、数式バー上で(あるいはF2を押してセルを編集モードにしてセルの中で)★だけ選択して、メニューやツールバーのボタンから「書式設定」することは可能ですが、数が多いと大変な手間がかかります。セル全体ではなく一部分の文字だけの書式設定なので、F4などの繰り返しキーも役に立ちません。 |
||
| Excel2002からは、「置換」にオプションを指定することで、置換後のセルの書式を変更することが可能になりました。(Excel2000では出来ません) そこで、置換後の文字列を検索文字と同じにして、書式設定することで解決するかと思い、やってみました。 右図で「オプション(T)」ボタンを押すと、 |
![]() |
|
| 書式指定のボタンが現れます。 ここで、「置換後の文字列(E)」の方の「書式(M)」ボタンを押すと、 |
![]() |
|
| 「書式の変換」という設定画面が表示されます。 この画面はセルの書式設定と同じ画面ですが、「罫線」は指定できません。 例として「文字色を赤で太字」という書式を指定すると、 |
![]() |
|
| プレビューとして先ほど設定した書式を確認することが出来ます。 これで、「すべて置換(A)」を押して★が★に置き換わってくれるとうれしいのですが、 |
![]() |
|
残念なことに★という文字を含むセル全体の書式が変わってしまいます。★だけが★に置換されるわけではありません。 ![]() |
||
そこで、personal.xls に追加していつでも使用できるマクロを考えました。 (Excel2000とExcel2002で動作確認しています) 以下で紹介しているマクロは、アクティブな(表示されている)シート全体に対して処理します。選択した範囲だけを対象に処理するわけではないので、注意してください。 |
||
| 起動すると、最初に「検索文字の指定」を求めてきます。 数字でも日本語(漢字)でも、複数文字でも構いません ので、書式設定したい文字を入力します。 |
![]() |
|
| 次に、文字の色を指定します。 指定可能な色は、一応カラーパレットのすべての色に対応していますが、順番はVBAのカラーインデックス値の順番になっています。 ![]() |
![]() |
|
| その後、太字にするか、 | ![]() |
|
| 斜体にするか、 | ![]() |
|
| 下線を付けるか、 |
![]() |
|
| 取り消し線をつけるか、 聞いてくるので、それぞれ答えます。 |
![]() |
|
ここまで指定すると、アクティブなシートから指定した文字(または文字列)を検索し、その文字だけに書式を設定して、結果を表示します(下図)。 1つのセルの中に指定した文字(または文字列)が2つ以上入っていても、それぞれについて書式を設定します。 ![]() もし処理結果が気に入らなければ、再度マクロを起動して同じ文字列を指定し、あとは色・太字・斜体・下線・取り消し線ともすべてEnterキーを押していけば、書式設定されていない状態に戻せます。 なお、マクロをちょっと改造すれば文字サイズの指定も可能(マクロの書式設定の部分で、 .Size = 変数 とすればOK)ですが、文字サイズを変更するときとしないときでコードを分岐させないといけないので、今回は見送っています。 |
||
| この機能を頻繁に使われる方は、メニューバーに登録しておくと、呼び出しやすいでしょう。 右図はExcel2002で一番下に追加した例です。 メニューバーへの登録方法は、こちらを参考にしてください。 今回は、メニューバーへの登録方法のページは修正していませんが、追加の方法は他のメニューと同様です。右図のサンプルでは、FaceIDは558番を使っています。 |
![]() |
|
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)との間で値を受け渡すための変数宣言も変わります。 つまり、ホームページ上でコードを紹介するのが難しくなります。ということで、今回は断念しました。 ユーザーフォームの作成の経験がある方は、ご自分で改造してみてください。 |
![]() ![]() 色の指定をしているところ |
|
