|
ichinoseさん、ご回答ありがとうございます。
早速試してみました。が、単独で用いるとうまく動作するのですが、
既存のプログラムに組み込むとループが行われなくなりました。
(最初の文字列だけ色が変わる)
小生はVBA初心者で、問題点がよくわかりません。すみませんが、
全体を載せておきますので、もし原因がお分かりでしたら指摘して
いただけないでしょうか?
何度も申し訳ありませんが、よろしくお願い致します。
Private Sub CommandButton1_Click()
Columns("A:H").Select
Range("A1").Activate
ActiveSheet.Unprotect
Range("A15000").Value = 読み仮名.Text
Range("B15000").Value = 接頭語.Text
Range("C15000").Value = 化合物名.Text
Range("D15000").Value = 包装.Text
Range("E15000").Value = 単位.Text
Range("F15000").Value = 本数.Text
Range("G15000").Value = 特記事項.Text
Range("H15000").Value = 保管場所.Text
Range("A7:H15000").Select
Selection.Sort Key1:=Range("A7"), Order1:=xlAscending, Key2:=Range("C7") _
, Order2:=xlAscending, Key3:=Range("B7"), Order3:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin
Dim rng As Range
Dim 開始 As Range
Dim 色かえる文字列 As String
色かえる文字列 = "有害"
Set 開始 = Cells.SpecialCells(xlCellTypeLastCell)
Set rng = find_rng(開始, Cells, 色かえる文字列)
Do While Not rng Is Nothing
Call chg_char_color(rng, 色かえる文字列, 3, True)
Set rng = find_rng(開始)
Loop
End Sub
Function find_rng(開始 As Range, Optional 検索範囲 As Range = Nothing, Optional fwd = "") As Range
Static sv検索範囲 As Range
Static svfwd
Static first_fd As Range
Dim fd As Range
If Not 検索範囲 Is Nothing Then
Set sv検索範囲 = 検索範囲
svfwd = fwd
Set first_fd = Nothing
End If
With sv検索範囲
If first_fd Is Nothing Then
Set fd = .Find(svfwd, 開始, LookIn:=xlValues, MatchCase:=True, MatchByte:=True)
Set first_fd = fd
Set 開始 = fd
Set find_rng = fd
Else
Set fd = .FindNext(開始)
If Not Intersect(first_fd, fd) Is Nothing Then
Set find_rng = Nothing
Else
Set 開始 = fd
Set find_rng = fd
End If
End If
End With
End Function
Function chg_char_color(rng As Range, col_str As String, color_idx As Long, Optional whole As Boolean = False) As Long
Dim st As Long
Dim c_len As Long
st = 1
c_len = Len(col_str)
Do While st < Len(rng.Value)
st = InStr(st, rng.Value, col_str)
If st > 0 Then
With rng.Characters(Start:=st, Length:=c_len).Font
.ColorIndex = color_idx
End With
st = st + c_len
If whole = False Then Exit Do
Else
Exit Do
End If
Loop
ActiveSheet.Protect
Unload Me
End Function
|
|