プロが教えるわが家の防犯対策術!

当方VBA勉強中の者です。
以下のことをしたくて学習を始めました。

①特定フォルダ内に格納されている全テキストファイルを読み込み
② ①の内容を新規シートに張り付け、これを繰り返す。

ここまでは諸々調べて出来たように思えます。(Excel2016)
諸事情によりコードを掲載すると質問が通りませんでしたので検索したのですが、
こちらのご回答者様と類似した内容のVBAを作成してみました。
https://oshiete.goo.ne.jp/qa/6689790.html

少し逸れましたが、この後以下のことをしたくなりました。

③各シートの13,14,15,16行目に特定の文字列(数字の1以上)が含まれている場合、シート見出しの色を赤色にしたい。

参考までですが、テキスト内容はこのような形です。
>>>>>>>>>>
1~6行目:文字列
7行目:空白
8~最大16行目 ;テキストによって13行目まで等、行数が異なり不定です。
約17行目:空白 ; 以後何かしらの文字列が18行目以降にあります。

8~最大16行目は以下のようになっています。 ;あくまでイメージです。
8 -------------------------------
9 **** **** *****
10 **** **** *****
11 **** **** *****
12 -------------------------------
13 userA no 6 ******
14 userB no 0 ******
15 userC no 0 ******
16
>>>>>>>>>>

Tabプロジェクト内のColorIndexプロジェクトを使う等、所々アタリはついているのですが、
一度Subを区切ってしまったので、追記するのが良いのか。
そもそも内容をループ処理に変更してその中で処理しなければなのか。
不定の行数の表現や、そもそもの抽出方法をどうすべきか方針が固まらず、
行き詰ってしまいました。

有識者の方、上記を満たすようなVBAはどのようなものになりますでしょうか。
ご教示いただけますと大変助かります。

A 回答 (3件)

こんにちは



>特定の文字列(数字の1以上)が含まれている場合~~
がわかればよいものと解釈しました。

表現を変えれば、セル範囲内に1~9の文字が存在するか否かを調べればよいことになるので、"*数字*"で検索してヒットすれば「あり」と判定できます。
(正規表現を用いる方法も考えられますが、面倒なので・・)

以下は、ひとまずアクティブシートを対象にしてありますが、変数wsの内容を対象シートにすれば、そのシートを検索します。
対象のセル範囲が列全体なのか、A列だけでよいのかわかりませんけれど、とりあえずA列にしてあります。
(違っている場合は、セル範囲を変えればそのまま応用できるはずです)
「1~9」の文字があれば「あり」、無ければ「なし」と表示されます。

Sub Sample()
Set ws = ActiveSheet

i = 1
Set r = Nothing
While i < 10 And r Is Nothing
 Set r = ws.Range("A13:A16").Find("*" & i & "*")
 i = i + 1
Wend

If r Is Nothing Then MsgBox "なし" Else MsgBox "あり"
End Sub
    • good
    • 0
この回答へのお礼

ご回答いただきありがとうございます。

>表現を変えれば、セル範囲内に1~9の文字が存在するか否かを調べればよいことになるので...
→なるほど。多角的に見るとヒントがあったりするのですね。

まずは言葉が不足しておりすみません。
汲んで頂いた通り、問題の箇所はA13~A16になります。

試しにいくつかのシートで実行してみたところ、
0を含めたどの数字が入っていようと、メッセージボックス"あり"の判定となってしまいます。
範囲もFindの数字も誤ってないように見受けられるのですが、、
この原因を探すことはできますでしょうか?

お礼日時:2021/10/28 16:04

こんばんは。



>③各シートの13,14,15,16行目に特定の文字列(数字の1以上)が含まれている場合、シート見出しの色を赤色にしたい。

userA no 6 ****** : これは対象
userB no 0 ****** : これは対象外

Like演算子が、便利に使えると思います。 例えば下記はどうでしょうか?
全シートのA13:A16を検索しています。

Sub test11()
Dim mySh As Worksheet, myRng As Range

For Each mySh In Worksheets
For Each myRng In mySh.Range("A13:A16")
If myRng Like "user* no [1-9]*" Then
’処理内容を記載
MsgBox myRng.Address & "OK!"
End If
Next myRng
Next mySh
End Sub
    • good
    • 0

No1です。



>0を含めたどの数字が入っていようと、メッセージボックス
>"あり"の判定となってしまいます。
私の環境では、含まれている数字が0だけの場合は「なし」と判定されます。

>範囲もFindの数字も誤ってないように見受けられるのですが、
No1のコードの意味を変えて実行しているものと推測します。
例えば、
「 i = 1 」としているところを、「 i = 0 」に変えればそのようになりますけれど・・?
    • good
    • 0

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