人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセルVBA、文字列の中に、数字(半角、全角とも)が含まれていない場合、色をつけたい。

A、I、E列の、2行、6行、10行、14行・・・(102行まで4行飛び)

に住所の文字列が入っています。


そのときに、半角、全角問わず、1234567890、1234567890の数字が入って【いない】ときだけ、フォントを赤く、太字で表示させたいのです。

条件付き書式をやってみましたが、どうもうまくいきませんでした。
(countif利用の相対参照等で)

ですので、マクロ回答を期待いたします。

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

1517674342
●拡大する

●質問者: リセール京都買取
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● ken3memo
●200ポイント ベストアンサー

>半角、全角問わず、
>1234567890、
>1234567890
>の数字が入って【いない】ときだけ、
>フォントを赤く、
>太字で表示させたいのです。

下記、テスト動画です。
https://www.youtube.com/watch?v=aqiy53cyVGs
D

北海道
北海道札幌市1-2-3
神奈川県横浜市99番地
神奈川県町田市五丁目六番七号
沖縄XXXアパート201号

1.下記のモジュールを貼り付ける
※alt+F11や開発から

Option Explicit

'半角の0から9
'全角の0から9
'が、一文字でも入っていたら"OK"の文字を返す
'入っていないときは"NG"を返す そんなユーザ関数を作成

Public Function chk0_9(strCHK As String) As String

 Dim strRET As String  'リターン値
 
 Dim n As Integer
 
 Dim strMOJI As String  '一文字
 Dim nCODE As Integer '文字コードを保管
 
 strRET = "NG"  'NG エラーで初期化
 
 For n = 1 To Len(strCHK)  '先頭1文字目から文字数分ループ
 strMOJI = Mid(strCHK, n, 1)  '一文字取り出す
 nCODE = Asc(strMOJI)  '文字コードに変換
 
  '範囲をチェックする
 If Asc("0") <= nCODE And nCODE <= Asc("9") Then
 strRET = "OK"  '一文字でも見つかったのでリターン値にOKセット
 Exit For  'ひとつでも見つかればループを抜ける
 End If

  '全角数字のチェック
 If Asc("0") <= nCODE And nCODE <= Asc("9") Then
 strRET = "OK"  '一文字でも見つかったのでリターン値にOKセット
 Exit For  'ひとつでも見つかればループを抜ける
 End If

 Next
 
 chk0_9 = strRET  '最後にリターン値をセットして、関数終了
 
End Function

2.セルの条件書式に式を貼り付ける

2.1 セルの強調表示ルール

その他を選択する

2.2 数式を使用して、書式設定するセルを決定
式に =chk0_9(チェックするセル)="NG" を 入れ
書式をアカにする

2.3 条件書式をコピーする
ペンキのハケみたいなアイコン?
から
書式をコピーする

ユーザ関数と条件書式でやってみました。
何かの参考となれば、うれしいです・・・
※ぐだぐたのテスト動画は笑ってゆるしてください・・・


ken3memoさんのコメント
↑ごめんなさい、条件書式でユーザー関数使うと、再計算の問題か?保存した後開きなおすと変な感じになっていたりしますね・・・ 保存して、開きなおすとおかしかったり。。。※編集した瞬間は動くけど、なんか変でした 素直にVBAだけでやったほうがいいかもしれません。 中途半端な回答ですみませんでした。

リセール京都買取さんのコメント
ありがとうございます!すごすぎる回答なので、一度ゆっくりみさせてくださいね。時間をかけたいので、お待ちくださいませ。心より感謝いたします。

リセール京都買取さんのコメント
ありがとうございます。しっかりできました。動画回答に驚きました。お時間かけてくださって感謝します。

2 ● きむむ
●200ポイント

以下を試してみてください。
Excel2016で確認しています。


Sub chkNum()
Dim wkSh As Worksheet
Dim wkRange As Range
Dim wkAddRange As Range
Dim wkCell As Range
Dim wkStr
Dim wkI
Dim wkFlg

Set wkSh = ActiveSheet

'チェック対象セル群を決定
Set wkRange = wkSh.Range("A2, I2, E2")
For wkI = 6 To 102 Step 4
Set wkAddRange = wkSh.Range("A" & wkI & ",I" & wkI & ",E" & wkI)
Set wkRange = Union(wkRange, wkAddRange)
Next wkI

'セル毎に数字を含むかチェックする
For Each wkCell In wkRange
wkStr = StrConv(wkCell, vbNarrow) '半角に統一してからチェックする
wkFlg = 0
For wkI = 1 To Len(wkStr)
If Mid(wkStr, wkI, 1) >= "0" And Mid(wkStr, wkI, 1) <= "9" Then
wkFlg = 1
Exit For
End If
Next wkI

If wkFlg = 0 Then
'If wkFlg = 0 And (Trim(wkCell) <> "") Then
' ↑セルがヌルおよびブランクのみの場合、処置しない(必要でもないけど)
'数字を含まない場合、セルの文字フォントの属性を変更する
wkCell.Font.Color = RGB(255, 0, 0)
wkCell.Font.Bold = True
Else
'設定を戻す
wkCell.Font.ColorIndex = xlAutomatic
wkCell.Font.Bold = False
End If
Next

End Sub


リセール京都買取さんのコメント
ありがとうございます!ばっちりできました!

3 ● 空腹おやじ
●20ポイント

条件付き書式でうまくいかないとのことですが
どううまくいかないのかわかりませんが
判定処理だけVBAとして、それを条件付き書式に使用すればできませんか?

判定条件は、
半角、全角問わず、1234567890、1234567890の数字が入って【いない】
とのことなので、
「0?9または、0?9が1文字でも含まれているか」の結果を否定すればよろしいかと。

例えば、次のようにすれば、数字が含まれていない時、TRUEが返ります。

Public Function notExistsDigits(ByVal sValue As String) As Boolean

notExistsDigits = Not sValue Like "*[0-90-9]*"

End Function

ちなみに、上記の例では、長さ0の文字列もTRUEが返ります。


リセール京都買取さんのコメント
ありがとうございます。条件付き書式に使用すればできませんか?←この条件付き書式が具体的にどのような数式になるのかわかりませんでした(スキル不足で申し訳ありません)ご回答に感謝します。

4 ● webnave
●100ポイント

条件付き書式
=SUMPRODUCT(ISNUMBER(VALUE(MID(A1,COLUMN(OFFSET($A$1,,,,LEN(A1))),1)))*1)=0


これで出来るはずですが


リセール京都買取さんのコメント
ごめんなさい。なぜかできませんでした。

リセール京都買取さんのコメント
と、思いましたらA1を該当セルに変えたらできました。感謝いたします!

5 ● いつか
●0ポイント

ガイドラインの
2.?「同一あるいは類似の内容の質問や回答を連続してあるいは多数投稿する行為」
に違反する内容の回答をしてしまったため、消しました。

すみませんでした。


リセール京都買取さんのコメント
とんでもないです!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ