Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1793 / 13645 ツリー ←次へ | 前へ→

【71882】特定の文字列を検索し、色をつける、大文字にするVBAを教えてください。 T.K 12/4/21(土) 19:49 質問[未読]
【71883】Re:特定の文字列を検索し、色をつける、大... kanabun 12/4/21(土) 20:34 発言[未読]
【71884】Re:特定の文字列を検索し、色をつける、大... T.K 12/4/21(土) 23:13 発言[未読]
【71885】Re:特定の文字列を検索し、色をつける、大... kanabun 12/4/22(日) 1:14 発言[未読]
【71886】Re:特定の文字列を検索し、色をつける、大... T.K 12/4/22(日) 9:41 発言[未読]
【71887】Re:特定の文字列を検索し、色をつける、大... T.K 12/4/22(日) 13:00 発言[未読]
【71888】Re:特定の文字列を検索し、色をつける、大... kanabun 12/4/22(日) 13:40 発言[未読]
【71889】Re:特定の文字列を検索し、色をつける、大... T.K 12/4/22(日) 17:12 お礼[未読]
【71890】Re:特定の文字列を検索し、色をつける、大... kanabun 12/4/22(日) 18:35 発言[未読]
【71891】Re:特定の文字列を検索し、色をつける、大... kanabun 12/4/22(日) 19:05 発言[未読]
【71892】Re:特定の文字列を検索し、色をつける、大... T.K 12/4/22(日) 19:13 回答[未読]
【71893】Re:特定の文字列を検索し、色をつける、大... kanabun 12/4/22(日) 19:18 発言[未読]
【71894】Re:特定の文字列を検索し、色をつける、大... T.K 12/4/22(日) 19:33 発言[未読]
【71895】Re:特定の文字列を検索し、色をつける、大... kanabun 12/4/22(日) 20:17 発言[未読]
【71896】Re:特定の文字列を検索し、色をつける、大... T.K 12/4/22(日) 21:21 お礼[未読]

【71882】特定の文字列を検索し、色をつける、大文...
質問  T.K  - 12/4/21(土) 19:49 -

引用なし
パスワード
   例を示した方がわかりやすいので簡単に例を示します.
aggttgggtagccgatcgaatcgatgctagcaaggtcagaggtcagggtggggatgaという配列があったとして、たとえば、aggtcaを検索します、その結果
aggttgggtagccgatcgaatcgatgctagcaAGGTCAgAGGTCAgggtggggatgaというふうになり、かつAGGTCAのみに色づけされるようなマクロを組みたいです。
配列はsheet1にA1〜A500程度まで存在して、1つのセルに500文字程度の文字列があります。さらに、検索したい文字列はsheet2にAGGTCAをsheet3のにはAGGTCAから一文字異なるような、GGGTCA,AGGGCAといいた文字列が18種類あり、sheet4には同様にに文字異なる文字列が135種類、それぞれA列に入力しています。
sheet2に入力されている検索キーワードをsheet1の500列の文字列に対して行ったり、sheet3に入力されている検索キーワードをsheet1の500列の文字列に対して行ったり、sheet4も同様にそれぞれ個別に行えるようにしたり、sheet2と3を同時に行うといったことをしたいです。sheet2で検索した結果は赤、sheet3で検索した結果は青、sheet4で検索した結果は緑になるといったように色も自由に決められるようにしたいです。
色づけだけなら検索した文字列の開始文字が何文字目かを持ってきて検索文字列の文字数までをcharacters.font clorで何とかなりそうなんですが、小文字を狙った場所で大文字にすることに苦戦しております。だれかご尽力いただけたら幸いです。よろしくお願いします。

【71883】Re:特定の文字列を検索し、色をつける、...
発言  kanabun  - 12/4/21(土) 20:34 -

引用なし
パスワード
   ▼T.K さん:
手始めに、1つのセルを対象として 部分検索し、見つかった
部分を「大文字」にし、Font色を「赤く」するサブプロシージャ
を呼び出すサンプルです。

Sub Try1()
  Dim c As Range
  For Each c In Selection
    RepChar c, "aggtca", 3 ' サブプロシージャ呼び出し
  Next
End Sub

'c: 対象セル  What:検索文字列  ColorIndex:Font色Index
Sub RepChar(ByVal c As Range, What As String, ColorIndex As Long)
  Dim j As Long
  Do
    j = InStr(j + 1, c.Text, What)
    If j = 0 Then Exit Do
    With c.Characters(j, Len(What))
      .Text = UCase$(What)      ' 大文字にする
      .Font.ColorIndex = ColorIndex' Font色 変更
    End With
  Loop
  
End Sub

【71884】Re:特定の文字列を検索し、色をつける、...
発言  T.K  - 12/4/21(土) 23:13 -

引用なし
パスワード
   ▼kanabun さん:
ありがとうございます。
今試してみたのですが、赤くはなるものの大文字にはなりませんでした。
プロシージャといった手法は知りませんでした。
最悪色は後回しでもいいので、小文字の文字列から別シートにある検索キーワードを多重検索して大文字に変換してくれるようなマクロを作りたいです。
>▼T.K さん:
>手始めに、1つのセルを対象として 部分検索し、見つかった
>部分を「大文字」にし、Font色を「赤く」するサブプロシージャ
>を呼び出すサンプルです。
>
>Sub Try1()
>  Dim c As Range
>  For Each c In Selection
>    RepChar c, "aggtca", 3 ' サブプロシージャ呼び出し
>  Next
>End Sub
>
>'c: 対象セル  What:検索文字列  ColorIndex:Font色Index
>Sub RepChar(ByVal c As Range, What As String, ColorIndex As Long)
>  Dim j As Long
>  Do
>    j = InStr(j + 1, c.Text, What)
>    If j = 0 Then Exit Do
>    With c.Characters(j, Len(What))
>      .Text = UCase$(What)      ' 大文字にする
>      .Font.ColorIndex = ColorIndex' Font色 変更
>    End With
>  Loop
>  
>End Sub

【71885】Re:特定の文字列を検索し、色をつける、...
発言  kanabun  - 12/4/22(日) 1:14 -

引用なし
パスワード
   ▼T.K さん:

>今試してみたのですが、赤くはなるものの大文字にはなりませんでした。

こちらで試したときは、
"aggtca" 部分が "AGGTCA" に変換されて赤くなりましたが?

>>    With c.Characters(j, Len(What))
>>      .Text = UCase$(What)      ' 大文字にする
>>      .Font.ColorIndex = ColorIndex' Font色 変更
>>    End With

【71886】Re:特定の文字列を検索し、色をつける、...
発言  T.K  - 12/4/22(日) 9:41 -

引用なし
パスワード
   ▼kanabun さん:
お世話になっております。再度checkをしましたところ、1つのセル内で256以上になると、赤くなるだけで大文字にならないという事がわかりました。255文字以内であれば大文字になり、赤くなるといった結果がえられました。
なお、私がいろいろ調べて今利用しているマクロが以下のようになっています(完全一致FのシートA1にAGGTCAという文字が入力されています。)。
このマクロに、kanabunさんが考えていただいた大文字にするマクロの一部である
With c.Characters(j, Len(What)
     .Text = UCase$(What)
をどのように組み込めばいいのでしょうか?

Sub 完全一致F()
Dim Myo As Range, Myp As Range, W1 As Long, i As Long
  For Each Myo In Sheets("クローンリスト").UsedRange.Resize(, 1)
    For Each Myp In Sheets("完全一致F").UsedRange.Resize(, 1)
      i = 1
      Do
        W1 = InStr(i, Myo.Value, Myp.Value, vbTextCompare)
        If W1 > 0 Then
          Myo.Characters(Start:=W1, Length:=Len(Myp.Value)).Font.ColorIndex = 3
          i = W1 + Len(Myp.Value)
        Else
          i = 1000
        End If
      Loop While (i <> 1000)
    Next
  Next
End Sub

>▼T.K さん:
>
>>今試してみたのですが、赤くはなるものの大文字にはなりませんでした。
>
>こちらで試したときは、
> "aggtca" 部分が "AGGTCA" に変換されて赤くなりましたが?
>
>>>    With c.Characters(j, Len(What))
>>>      .Text = UCase$(What)      ' 大文字にする
>>>      .Font.ColorIndex = ColorIndex' Font色 変更
>>>    End With

【71887】Re:特定の文字列を検索し、色をつける、...
発言  T.K  - 12/4/22(日) 13:00 -

引用なし
パスワード
   ▼kanabun さん:
お世話になっています。私は初心者なので当たり前のことがわかっていないので知識が足りないコメントをしていたらすいません。私が作ったマクロに組み込むのは大変そうなので、kanabunさんが作成していただいたマクロを少し改変して様々なパターンについてはすべて並列で入力すればいいという事がわかりました。たとえば一文字違いなどについてはtry2に以下のようにするなどすればいいかなとおもいました。実際にうごかしてうまくいきました。
しかも、複数のセルを選択してマクロを動かすとすべてのセルで一気に色が変わり、大文字になるという事がわかりました。ですので256文字の壁さえクリアできればほぼ目的は達成できるのではないかと思います。なぜ256文字以上はうまくいかないのか私の知識ではわかりませんが、もしkanabunさんがお分かりになりましたら教えていただけたら幸いです。
Sub Try2()
  Dim c As Range
  For Each c In Selection
    RepChar c, "gggtca", 4 ' サブプロシージャ呼び出し
    RepChar c, "cggtca", 4
    RepChar c, "tggtca", 4
  Next
End Sub
Sub Try1()
  Dim c As Range
  For Each c In Selection
    RepChar c, "aggtca", 3 ' サブプロシージャ呼び出し
  Next
End Sub

'c: 対象セル  What:検索文字列  ColorIndex:Font色Index
Sub RepChar(ByVal c As Range, What As String, ColorIndex As Long)
  Dim j As Long
  Do
    j = InStr(j + 1, c.Text, What)
    If j = 0 Then Exit Do
    With c.Characters(j, Len(What))
      .Text = UCase$(What)      ' 大文字にする
      .Font.ColorIndex = ColorIndex' Font色 変更
    End With
  Loop
  
End Sub

【71888】Re:特定の文字列を検索し、色をつける、...
発言  kanabun  - 12/4/22(日) 13:40 -

引用なし
パスワード
   ▼T.K さん:
>しかも、複数のセルを選択してマクロを動かすとすべてのセルで一気に色が変わり、大文字になるという事がわかりました。ですので256文字の壁さえクリアできればほぼ目的は達成できるのではないかと思います。なぜ256文字以上はうまくいかないのか私の知識ではわかりません
256文字以上のセル内文字列は一括置換できなくなる、というのはExcelの仕様のようですね
256文字以上の文字列でも、文字列変数にコピーしてなら Replaceで置換できますので、
ちょっと回りくどいけど、指定セル範囲内の各セルについて
  LargeChar 対象セル、 検索文字列リスト、Font色
を呼び出す、という風にしてみましょう。

Sub Try2()
  Dim c As Range
  Dim What
  
  ' '別シートの検索文字列リストを変数 What に取得
  What = Application.Transpose( _
    Worksheets("完全一致F").UsedRange.Resize(, 1)) 
  If Not IsArray(What) Then What = Split(What, "")
  '対象範囲を順にLoopして セルごと処理
  For Each c In Worksheets("クローンリスト").UsedRange.Resize(, 1)
    LargeChar c, What, vbRed
  Next
End Sub

'c: 対象セル  What:検索文字列  Color:Font色
Sub LargeChar(c As Range, What As Variant, nColor As Long)
  Dim j As Long
  Dim sL As String
  Dim ss As String
  Dim wh
  
  For Each wh In What
    sL = UCase$(wh)  '例. wh:"aaa" sL:"AAA"
    ss = Replace(c.Text, wh, sL) '文字列の置換
    c.Value = ss  '変換後の文字列をセルにセット
    Do
      j = InStr(j + 1, ss, sL)
      If j = 0 Then Exit Do
      c.Characters(j, Len(sL)).Font.Color = nColor
    Loop
  Next
End Sub

'Fontの色は vbColor または RGBで指定してください
  vbRed
  vbBlue
  vbGreen
  vbYellow
  vbCyan
  vbMagenta
などが利用できます(パレットの影響をうけません)

【71889】Re:特定の文字列を検索し、色をつける、...
お礼  T.K  - 12/4/22(日) 17:12 -

引用なし
パスワード
   ▼kanabun さん:
お世話になっております。
先ほどすこしためしてみました。文字数に関しては問題なくクリアできました。
しかし、別シートに存在するデータが複数ある場合、すべて大文字にはなるものの一番上にかかれているものだけが色が変わり、データが3個程度の場合はいろがかわるのですが10個程度になると色は変わらないといった事象がおきました。
ですので、新しく作っていただいたマクロを利用して色付けの部分を省いて、別シートにある配列を大文字にしてから、前回作っていただいたものマクロを利用して色付けを行う(色付けに関しては文字数に関係ないようだったので)といった2段構えで行うと、私が行いたかったことを達成できることがわかりました。
Sub 一塩基ゆらぎF()
  Dim c As Range
  Dim What
 
  ' '別シートの検索文字列リストを変数 What に取得
  What = Application.Transpose( _
    Worksheets("一塩基ゆらぎF").UsedRange.Resize(, 1))
  If Not IsArray(What) Then What = Split(What, "")
  '対象範囲を順にLoopして セルごと処理
  For Each c In Worksheets("クローンリスト").UsedRange.Resize(, 1)
    LargeChar c, What
  Next
End Sub
Sub 完全一致F()
  Dim c As Range
  Dim What
 
  ' '別シートの検索文字列リストを変数 What に取得
  What = Application.Transpose( _
    Worksheets("完全一致F").UsedRange.Resize(, 1))
  If Not IsArray(What) Then What = Split(What, "")
  '対象範囲を順にLoopして セルごと処理
  For Each c In Worksheets("クローンリスト").UsedRange.Resize(, 1)
    LargeChar c, What
  Next
End Sub

'c: 対象セル  What:検索文字列
Sub LargeChar(c As Range, What As Variant)
  Dim j As Long
  Dim sL As String
  Dim ss As String
  Dim wh
 
  For Each wh In What
    sL = UCase$(wh)  '例. wh:"aaa" sL:"AAA"
    ss = Replace(c.Text, wh, sL) '文字列の置換
    c.Value = ss  '変換後の文字列をセルにセット
    Do
      j = InStr(j + 1, ss, sL)
      If j = 0 Then Exit Do
      c.Characters(j, Len(sL)).Font.Color = nColor
    Loop
  Next
End Sub
Sub 色づけtest()
  Dim c As Range
  For Each c In Selection
    RepChar c, "AGGTCA", 3
RepChar c, "AGTTCA", 7
RepChar c, "ATTTCA", 22
RepChar c, "TGACCT", 5
RepChar c, "TGAACT", 8
RepChar c, "TGAAAT", 17
'c: 対象セル  What:検索文字列  ColorIndex:Font色Index
Sub RepChar(ByVal c As Range, What As String, ColorIndex As Long)
  Dim j As Long
  Do
    j = InStr(j + 1, c.Text, What)
    If j = 0 Then Exit Do
    With c.Characters(j, Len(What))
       .Font.ColorIndex = ColorIndex ' Font色 変更
    End With
  Loop
 
End Sub
このような形にして、完全一致や、一塩基ゆらぎのマクロを動かした後に大きくなった文字を検索して色づけtestのマクロを動かすといった具合にしました。
1つのマクロですべてを対処するのは非常に難しいのだと実感いたしました。
ありがとうございました。これで仕事が非常に効率的になりました。

【71890】Re:特定の文字列を検索し、色をつける、...
発言  kanabun  - 12/4/22(日) 18:35 -

引用なし
パスワード
   ▼T.K さん:
>▼kanabun さん:
>先ほどすこしためしてみました。文字数に関しては問題なくクリアできました。
>しかし、別シートに存在するデータが複数ある場合、すべて大文字にはなるものの一番上にかかれているものだけが色が変わり、データが3個程度の場合はいろがかわるのですが10個程度になると色は変わらないといった事象がおきました。

むむ、その不具合ですが、
Sub LargeChar サブプロシージャの
◆の1行を加えたら解消されませんか?

>'c: 対象セル  What:検索文字列
>Sub LargeChar(c As Range, What As Variant)
>  Dim j As Long
>  Dim sL As String
>  Dim ss As String
>  Dim wh
> 
>  For Each wh In What
>    sL = UCase$(wh)  '例. wh:"aaa" sL:"AAA"
>    ss = Replace(c.Text, wh, sL) '文字列の置換
>    c.Value = ss  '変換後の文字列をセルにセット
     j = 0 '◆ この行追加
>    Do
>      j = InStr(j + 1, ss, sL)
>      If j = 0 Then Exit Do
>      c.Characters(j, Len(sL)).Font.Color = nColor
>    Loop
>  Next
>End Sub

【71891】Re:特定の文字列を検索し、色をつける、...
発言  kanabun  - 12/4/22(日) 19:05 -

引用なし
パスワード
   あ、↑上のレス、勘ちがいでした。そういう問題ではありません
でした。 無視してください。
スミマセン m(_ _)m

ただいま、デバッグ中です。

【71892】Re:特定の文字列を検索し、色をつける、...
回答  T.K  - 12/4/22(日) 19:13 -

引用なし
パスワード
   ▼kanabun さん:
お世話になっております。今行を追加してみましたが、やはり配列データシートにある配列が複数の場合は、大文字にはなるものの色はつきません。
事前に色がついていたりすると、すべて赤になってしまったりすることもおきます。
とりあえず、2つマクロをかまして、大文字にしてから、色づけをする方向でやってみます。

【71893】Re:特定の文字列を検索し、色をつける、...
発言  kanabun  - 12/4/22(日) 19:18 -

引用なし
パスワード
   ▼T.K さん:

検索文字列のリストが書いてあるシートのB列は空いていますか?
もし空いていれば、B列に 大文字変換後の カラーインデックスを
書いておきます。
たとえば、以下のように:
「完全一致F」シート
 A     B
aggtca  3
agttca  7
atttca  22
tgacct  5
tgaact  8
tgaaat  17


そうしておいて、たとえば、
>Sub 完全一致F()
を次のように変えます。

Sub Try3()
  Dim c As Range
  Dim What

  ' '別シートの検索文字列リストを変数 What に取得
  What = Worksheets("完全一致F").UsedRange.Resize(, 2) 'A,B2列取得
 
  '対象範囲を順にLoopして セルごと処理
  For Each c In Worksheets("クローンリスト").UsedRange.Resize(, 1)
    CharToUpper c, What
  Next
End Sub


'c: 対象セル  Spec:検索文字列とFont色の2次元配列
Private Sub CharToUpper(c As Range, Spec As Variant)
  Dim i As Long, j As Long
  Dim sL As String
  Dim ss As String
  Dim nColor As Long
  Dim wh as string

  For i = 1 To UBound(Spec)
    wh = Spec(i, 1)
    sL = UCase$(wh)  '例. wh:"aaa" sL:"AAA"
    c.Value = Replace(c.Text, wh, sL) '文字列の置換
  Next
  ss = c.Text
  For i = 1 To UBound(Spec)
    sL = UCase$(Spec(i, 1))
    nColor = Spec(i, 2)
    Do
      j = InStr(j + 1, ss, sL)
      If j = 0 Then Exit Do
      c.Characters(j, Len(sL)).Font.ColorIndex = nColor
    Loop
  Next
End Sub

【71894】Re:特定の文字列を検索し、色をつける、...
発言  T.K  - 12/4/22(日) 19:33 -

引用なし
パスワード
   ▼kanabun さん:
お世話になっております。今試しました。とりあえず、うまくいきました。細かい挙動はまだわかりませんが多分問題なさそうです。ありがとうございます。
ただ、大文字にすることと色分けをすることを別々に行うようなマクロを組んでいただいたあたりから選択したセルだけでなく、クローンリストのA行にあるデータすべてを行うようになりました。10列程度しかデータを入れていない状態なのですが、文字も色も変化し終わっているのに計算がずっと続いているような形です。検索文字列のリストは今は18列分で試しているのですが、1行500文字程度で10行で1分ほどかかっています。135列の検索をおこなうにはかなりPCに負荷がかかりそうなのですが、選択したセルのみこのマクロを働かせることはできないでしょうか?

【71895】Re:特定の文字列を検索し、色をつける、...
発言  kanabun  - 12/4/22(日) 20:17 -

引用なし
パスワード
   ▼T.K さん:
> 選択したセルのみこのマクロを働かせることはできないでしょうか?

>>   '対象範囲を順にLoopして セルごと処理
>>  For Each c In Worksheets("クローンリスト").UsedRange.Resize(, 1)
>>    CharToUpper c, What
>>  Next
ここを Try1() のように

  '対象範囲を順にLoopして セルごと処理
  For Each c In Selection
    CharToUpper c, What
  Next

とすれば、そうなります。

【71896】Re:特定の文字列を検索し、色をつける、...
お礼  T.K  - 12/4/22(日) 21:21 -

引用なし
パスワード
   ▼kanabun さん:
お世話になっております。今試したところ、非常に軽くなりました。重かったのはデータがないのに最終行まで検索していたのだと思われます。
これで非常に効率的な文字列の検索ツールが完成しました。
配列データの各配列ごとに色を設定できるようになったので、完全一致と一塩基ゆらぎの配列データを1つのシートにおいてそれぞれ別の色を設定することで私が行いたいことも可能になると思われるので非常に助かりました。
本当にありがとうございました。また何かありましたら質問させていただきたいと思います。
>▼T.K さん:
>> 選択したセルのみこのマクロを働かせることはできないでしょうか?
>
>>>   '対象範囲を順にLoopして セルごと処理
>>>  For Each c In Worksheets("クローンリスト").UsedRange.Resize(, 1)
>>>    CharToUpper c, What
>>>  Next
>ここを Try1() のように
>
>   '対象範囲を順にLoopして セルごと処理
>  For Each c In Selection
>    CharToUpper c, What
>  Next
>
>とすれば、そうなります。

1793 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free