プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。
特定の文字列を見つけて色をつけたいです。

コードを書いてみました。
ですが、エラーがでます。
おかしいとこをご教示お願いします。

Dim myStr As String
Dim i As Integer
Dim k As Long
Dim c As Range

myStr = "◎◎" -------※固定です

     For i = 1 To Cells(Rows.Count, "E").End(xlUp).Row

Set c = Range(Cells(i, 1), Cells(i, 5))
c.Font.ColorIndex = xlAutomatic

If InStr(c, myStr) > 0 Then ----※ここでエラー「型が一致しません」

For k = 1 To Len(c)

If Mid(c, k, Len(myStr)) = myStr Then
c.Characters(Start:=k, Length:=Len(myStr)).Font.ColorIndex = 3

End If
Next k
End If
   Next i

A 回答 (3件)

こんにちは、すでに的確なアドバイスがありますが、



>If InStr(c, myStr) > 0 Then ----※ここでエラー「型が一致しません」
InStr関数は、 InStr([ start ], string1, string2, [ compare ]) は、のようにしなければなりません。
https://docs.microsoft.com/ja-jp/office/vba/lang …

Set c =セル を範囲に変えたらいきなりエラー、、ありがちかと思います。?

Dim c As Range
なので単一セルの値を取得(c.value)できますが、セル範囲の値を一度に取得する事は出来ません。

方法としては、Set cを使用したいなら、Set c = Range(Cells(i, 1), Cells(i, 5)) 範囲をやめ
Range(Cells(i, j))のようにループを増やすか、Set c = Range(Cells(i, 1), Cells(i, 5))をそのままにして
ループを増やし レンジcのアドレスで取得するかになります。配列に似ていますが、RangeなのでFont設定などが出来ます。

例:
Dim myStr As String
Dim i As Long, j As Integer
Dim k As Integer
Dim c As Range

myStr = "◎◎"

Set c = Range(cells(1, "A"), cells(cells(Rows.Count, "E").End(xlUp).Row, "E"))
For i = 1 To cells(Rows.Count, "E").End(xlUp).Row
For j = 1 To 5 '列方向のループを増やす。
c(i, j).Font.ColorIndex = xlAutomatic
If InStr(c(i, j), myStr) > 0 Then
For k = 1 To Len(c(i, j))
If Mid(c(i, j), k, Len(myStr)) = myStr Then
c(i, j).Characters(Start:=k, Length:=Len(myStr)).Font.ColorIndex = 3
End If
Next k
End If
Next j
Next i
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
補足に入れようと思ったら文字数が足らなくて新たに質問しました。
教えて頂いたコードで出来ました。ありがとうございました。

お礼日時:2020/09/03 15:42

こんにちは!



前回回答した者です。
原因はNo.1様が仰っている通りです。

手直しされたコードを拝見すると、A1セル~E列最終行の範囲が対象なのですね。

Sub Sample2()
 Dim c As Range
 Dim k As Long
 Dim lastRow As Long
 Dim myStr As String

  myStr = Application.InputBox("特定文字を入力")
   lastRow = Cells(Rows.Count, "E").End(xlUp).Row  '//←E列最終行を取得//
    For Each c In Range(Cells(1, "A"), Cells(lastRow, "E")) '//A1セル~E列最終行範囲内をループ//
     If InStr(c, myStr) > 0 Then
      For k = 1 To Len(c)
       If Mid(c, k, Len(myStr)) = myStr Then
        c.Characters(Start:=k, Length:=Len(myStr)).Font.ColorIndex = 3
       End If
      Next k
     End If
    Next c
End Sub

※ 今回の質問では1セルずつ舐めるように検索するしかないようなので、
変数「c」は1セルにしないとエラーになります。

※ 今回は元のフォント色はそのままにしています。m(_ _)m
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
その質問です。補足に入れようと思ったら文字数が足らなくて新たに質問しました。
言葉足らずですみませんでした。E列が最終でした。教えて頂いたコードで出来ました。ありがとうございました。

お礼日時:2020/09/03 15:43

こんにちは



>コードを書いてみました。
>ですが、エラーがでます。
これかな?
https://oshiete.goo.ne.jp/qa/11867679.html

勝手な思い込みでいじらずに、それぞれのセンテンスがどのような構造になっているのかを理解した上で、修正すれば問題は起きないかと。

>If InStr(c, myStr) > 0 Then ----※ここでエラー「型が一致しません」
原文とは違って、変数cが「セル範囲」になっているのが原因でしょう。
その後でも、あたかもcが文字列であるかのような記述になっていますけれど、みるからに怪しそうですね。

せっかく(模範?)回答をもらっているのだから、それを教材に内容を研究なさったほうがよいでしょう。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございました。
その質問です。補足に入れようと思ったら文字数が足らなくて新たに質問しました。
お礼が遅くなりましたが出来ました。
ありがとうございました。

お礼日時:2020/09/03 15:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!