質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

4回答

1012閲覧

エクセルマクロで「セル内の文字の変更した部分だけを赤文字に変更」したい。

aarai

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2022/08/22 23:49

エクセルマクロで「セル内の文字の変更した部分だけを赤文字に変更」したい。

マクロ初心者です。
現在、Worksheetでターゲット使用してセルを実行した部分を赤文字に変更するコードを使用しています。
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Font.ColorIndex = 3 End Sub

こちらを修正して「セル内の文字の変更した部分だけを赤文字に変更」にしたいです。
いろいろ検索してみましたが、セルの範囲を設定Range("A1:Y65")、変更文字の設定Characters(Start:=4, Length:=3)などが必要と記載されています。

シート1内のセル範囲やセル内の文字数は関係なしに、修正したセルで、そのセルによって Characters(Start:=4, Length:=3)が違う内容のデータは「セル内の文字の変更した部分だけを赤文字に変更」はできないでしょうか?

そもそも、Range("A1:Y65")のようにセル範囲設定はできますが、「シート全体が対象」のコードが分かりません。
セル内の設定も同様に例えば<UFB-2F-3007-PWH同等品>という内容を、<UFB-2F-5002-PWH同等品>と5002だけを赤文字にしたい。他のセルでは<UWV-2F-3007-PWH同等品>とWVだけを赤文字にしたい。という事です。
「Characters(Start:=4, Length:=3)の設定を行わないコードも探してみましたが見つかりませんでした。

Windows10 Excel® 2019 MSO 64ビット使用です。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2022/08/23 02:30

「セル内の文字の変更した部分」というのは何と比較して変更したということでしょうか。 質問の内容でいくと、「<UFB-2F-3007-PWH同等品>」という値がどこかのセルにあって、それと比較してということでしょうか。 それとも、編集したセルの編集後の値と編集前の値と比較してという意味でしょうか。
aarai

2022/08/23 02:56

ご質問ありがとうございます。 何かと比較とはではなく、単純に手入力で書き換えて変更するだけです。名前ですと<山田 太郎><山口 太郎>と書き換えた時に<口>だけを赤文字にしたいということです。シート内のすべてのセル内2文字目ですといいのですが、セルによってstart文字目が違うのです。 こちらの内容で伝わりましたでしょうか? よろしくお願い致します。
退会済みユーザー

退会済みユーザー

2022/08/23 04:13 編集

「<UFB-2F-3007-PWH同等品>という内容を、<UFB-2F-5002-PWH同等品>と5002だけを赤文字にしたい。」 この場合5と2の2文字を赤にするんじゃなくて「5002」の4文字を赤にするってことは、区切り文字の認識や単語の解析みたいなのが必要なんで、けっこうむずかしいんじゃないですかね。
aarai

2022/08/23 04:07

コメントとご回答ありがとうございます。 不快な思いをさせてしまい申し訳ございません。 セル内の範囲を設定しないコードがいくら検索しても見つからなかったので、ご質問させていただきました。ど素人ですので丸投げのような質問になってしまい失礼致しました。ご回答、参考にさせ頂きます。 ありがとうございました。
hatena19

2022/08/23 04:47

不一致の判定の仕様を明確にしないと、いろいろ難しいですね。 例えば、- で区切って比較するとして、 3007 と 5002 だと、5002すべて赤字、 UFB と UWV だと、WV だけ赤字、 となると、仕様として矛盾がありますよね。 あと、複数セルを一度に変更した場合も考慮する必要があるのか、どうかも、提示してください。
aarai

2022/08/23 05:14

コメントありがとうございます。 そうですね、何文字目と決めれないのが難しいです。 3007と5002ですと、5と2という設定でも大丈夫です。見え方としては5002すべて赤字がベストですが、 手修正を行えますので、5と2で大丈夫です。「UFB と UWV だと、WV だけ赤字」というように。 「あと、複数セルを一度に変更した場合も考慮する必要があるのか」ですが、あります。 それは、「3007 」が複数ありすべて「5002」へ一度に変更する。という感じです。 よろしくお願い致します。
hatena19

2022/08/23 05:28

ここでやり取りした結果は質問を編集して反映させてください。ここは「質問への追記・修正の依頼」ですので。
aarai

2022/08/23 05:32

了解致しました。本日中は無理なのですが、自分なりに作成してみてまた結果を反映させていただきます。 ありがとうございます。
guest

回答4

0

やはりセル内の範囲や比較対象が必要のようで、いろいろ調べた結果、任意で範囲を設定しておき、データ変更後手作業で文字色を変更することにしました。回答いただきました参考テキストで「変更された部分の文字を変更する処理」を作成してみましたがうまくいかないので、最終のテキストにしました。

参考のテキスト

Private Sub Worksheet_Change(ByVal Target As Range) Dim c As Range For Each c In Target '変更された部分の文字色を変更する処理 c = Characters(Start:=1, Length:=5) If Target.c.Font.ColorIndex = 3 Then ElseIf Target.Cell.Characters(Start:=6, Length:=10).Font.ColorIndex = 3 Then ElseIf Target.Cell.Characters(Start:=11, Length:=15).Font.ColorIndex = 3 Then Else: Target.Cell.Characters(Start:=15).Font.ColorIndex = 3 NextIf End Sub

最終のテキスト

Private Sub Worksheet_Change(ByVal Target As Range) Target.Characters(Start:=1, Length:=3).Font.ColorIndex = 3 End Sub

投稿2022/08/24 02:31

aarai

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考程度です。
(先頭から1文字ずつ比べるだけの簡易版)

Dim VAL As Variant Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count <> 1 Then Exit Sub VAL = Target.Value End Sub Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim maxLen As Integer Dim targetCount As Integer Dim charCount As Integer If Target.Cells.Count <> 1 Then Exit Sub If Target.Value = VAL Then Exit Sub If Len(VAL) > Len(Target.Value) Then maxLen = Len(VAL) Else maxLen = Len(Target.Value) End If For charCount = 1 To maxLen Dim char1 As String Dim char2 As String Dim isChar1Under As Boolean Dim isChar2Under As Boolean If charCount <= Len(VAL) Then char1 = Mid(VAL, charCount, 1) isChar1Under = True Else char1 = "" isChar1Under = False End If If charCount <= Len(Target.Value) Then char2 = Mid(Target.Value, charCount, 1) isChar2Under = True Else char2 = "" isChar2Under = False End If If char1 <> char2 Then If isChar2Under Then Target.Characters(Start:=charCount, Length:=1).Font.Color = vbRed End If Else: If isChar2Under Then Target.Characters(Start:=charCount, Length:=1).Font.Color = vbBlack End If End If Next End Sub

https://blog-tips.sekenkodqx.jp/2019/08/07/excel-vba-str-dif-emphasis00001/#google_vignette
https://koukimra.com/archives/1945

投稿2022/08/23 03:33

編集2022/08/23 04:15
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aarai

2022/08/23 04:09

ご回答ありがとうございます。 質問のコメントに回答させていただきました。お時間使っていただき、ありがとうございました。
guest

0

何と比較するかという点が不明瞭なので、それはおいておいて、
まず、下記の点、

シート1内のセル範囲やセル内の文字数は関係なしに、修正したセルで、そのセルによって

そもそも、Range("A1:Y65")のようにセル範囲設定はできますが、「シート全体が対象」のコードが分かりません。

処理をしたいセルは、修正したセルですよね。ならば、シート全体を対象にする必要はありません。
修正したセル範囲は、Target引数に格納されていますので、それを対象にして処理を実行すればいいでしょう。

下記のような感じで、ループで対象セル範囲を1セルずつ処理していきます。

vba

1Private Sub Worksheet_Change(ByVal Target As Range) 2 Dim c As Range 3 For Each c In Target 4 '変更された部分の文字色を変更する処理 5 Next 6End Sub

次に、2つの文字列を比較して、どの部分が異なっているかを取得する必要がありますが、これは簡単ではありません。比較する文字列の長さが同じなら、前から一文字ずつ比較していけれはいいのですが、文字列の長さが異なっていたり、変更された部分の長さが異なっているとかなり面倒です。

とりあえず、参考になりそうなリンクを置いておきます。

Excelマクロ・VBA 2つの文字列を比較し、違う個所の文字色を赤に変更する方法 | 誰でもできる業務改善講座

Excel VBAで文字列の差分

投稿2022/08/23 03:20

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aarai

2022/08/23 03:56

ご回答ありがとうございます。 VBAと参考リンクを使用してみたいと思います。 ど素人でして、申し訳ございませんでした。 ありがとうございました。
guest

0

Characters(Start:=4, Length:=3)が違う内容のデータは「セル内の文字の変更した部分だけを赤文字に変更」はできないでしょうか?

Startは何文字目から、LengthはStartから何文字という意味なので、どこが変わっているか確認して値を変えれば可能です。

「シート全体が対象」のコードが分かりません。

Cells.Selectでシート内のセルすべてを選択できます。

投稿2022/08/23 00:28

RiaFeed

総合スコア2701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aarai

2022/08/23 01:07

ご回答ありがとうございます。 表現方法がおかしかったですね、すいません。 Characters(Start:=4, Length:=3)のStartは何文字目から、LengthはStartから何文字という意味は承知しております。今回は、それぞれStartもLengthも値が違いますので、こちらの設定方法ではなくそれぞれのセル内文字を変更した部分のみ赤文字に変更する設定コードが知りたいと思い質問させていただきました。 「Cells.Select」は試してみます。 よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問