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

おせわになります。

セルに文字列が入っていて、その中の決まった場所の数字が年月の数値なのですが、これと今日の月が正しいかを比較して、違っていれば条件付き書式で赤字になるようにしたいのですが。

例えば7月の場合、B10にAX227Z123というように 左端から3つ目から3桁が年月になっているのですが、10、11,12月になると10月の場合、左から3つ目から4桁AZ2210S98が年月になってしまいます。

このような場合の条件付き書式で当月と違った場合赤字になるような式を教えて頂きたく。

A 回答 (15件中1~10件)

DATE関数が使えると思います。


DATE(年,月,日)

年月日のそれぞれは、決まった場所の数字ということなので、
MID(セルの文字列,開始位置,2)
で抜き出せばよいです。

今日の月は、以下になります。
MONTH(TODAY())
    • good
    • 1
この回答へのお礼

1.>MID(セルの文字列,開始位置,2)
では抜き出す数字の数が2つになるのでは?
1-9月までは1桁になるので2桁抜いてしまうと質問の
>AX227Z123
の場合は7Zになるのでは?

2.出来れば年2桁+月を条件にしたいのですが。


=TEXT(TODAY(),"yymm")➣4桁
の時と
=TEXT(TODAY(),"yym")➣3桁
の時でMIDで抜き出す桁数が違ってしまうので困っています。

お礼日時:2022/07/29 15:20

条件付き書式の条件式を



=IFERROR(MID(A1,3,4)*1,MID(A1,3,3)*1)<>TEXT(TODAY(),"yym")*1

とかではどうでしょうか?
    • good
    • 1

あ、A1は該当セルに変えてください。

    • good
    • 1
この回答へのお礼

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

早速試してみました。
AZ227YC001
の227を228(22年8月)にしても赤色になりません。

お礼日時:2022/07/29 15:53

直接の回答になっていなくてごめんなさいね。


コンピューターと人との関わりを考えて、どこまで人がするか、どこからコンピューターに任せるかという線引きを考えておくのは大事です。

いま、お困りになっているのは、月や日の数字が1桁の数字と2桁の数字が混在すると言うことですね。

一番単純で確実な解決策は、人が日付を入力するときに、月も日も必ず2ケタで入力するように決めておくことです。
例えば、2022年7月29日は、20220729のように一桁の場合に0をつけて二文字にして入力するようにすること。

人間側でしっかりとその処理をして、コンピューター側で8文字の場合のみ入力を受け付けるようにしておくと、月の数字は左側先頭から5文字目と6文字目、日付の数字は右から2文字を取り出せば良いだけ。シンプルになるでしょ。

逆に、ご質問の内容をそのままコンピューターで処理をさせようとすると処理が複雑になってバクが生じたり、いろいろな人がプログラムのメンテナンスをする時に面倒なことになってきます。

もし、現在までに入力している数値が少ないなら、日付の部分だけ入力し直して月や日を2文字で入力するように変更することをお勧めします。
    • good
    • 1
この回答へのお礼

この表記(文字列)はLOT Noとか製造NoとかプロダクトIDというやつで、世の中のあらゆる製品で割り付けられている識別のための文字列で企業が製品毎に決められたルールで割り付けられる文字列なので桁数やら割付を変えることは出来ない文字列です。
10~12月をX,Y,Zで表記する場合もあります。
(これは既に解決しています)

自分で決めるなら当然20220729がいいのですが、表記する限られた文字数で個体を識別するためのいろんな情報を盛り込みたいのでこのようになっています。

お礼日時:2022/07/29 15:31

>TEXT(TODAY(),"yym"



№2です。よく考えたら「ym」で良かった。

多分、質問者さん側ではどうにもできないコードだから質問されているんだと思いますけどね。
    • good
    • 1
この回答へのお礼

忘れていました。
このような使い方をしたことが無かった(見たことは有った)ので思いつきませんでした。
通常は桁須賀変わるとやっかいなので桁数を

デモ、問題はセルの文字列から抜き出す数字の数はどうすれば良いのでしょう?

お礼日時:2022/07/29 15:42

こんにちは


マクロ側で変換してあげないと無理だと思います
使い方が分からなかったら補足を付けて下さい

Sub test()
Dim lRow As Long
For lRow = 10 To Cells(Rows.Count, "B").End(xlUp).Row
Cells(lRow, "B").Offset(0, 1) = GetYM(Cells(lRow, "B").Value)
Next
End Sub
Function GetYM(strTarget As String) As String
Dim RE As Object
Set RE = CreateObject("VBScript.RegExp")
Dim result As Object
GetYM = ""
With RE
.Global = False
.Pattern = "[A-Z]{2}([0-9]{2})([0-9]+)[A-Z]"
Set result = .Execute(strTarget)
End With
If result.Count > 0 Then
GetYM = "20" & result(0).SubMatches(0) & "/" & result(0).SubMatches(1)
End If
End Function
    • good
    • 0
この回答へのお礼

大作をありがとうございます。

取り合えずコピペで試してみましたが、C列に288.9が入力されてしまうようです。
また、入力の度にVBAを動かす必要が有るので、実際にはセルのイベントVBAにもする必要が有ったり・・・・
これは、当方には使えないレベルのようです。

当方の想定をはるかに超える課題だったようです。
最後の手段として作業列を追加すれば何とかなりそうな気がしていますのでそちらで考えてみます。

お礼日時:2022/07/29 16:07

No.2さんの回答が一番妥当ですね


パチパチパチパチ
文字を無理やり引き抜く事しか考えてませんでした(__)
    • good
    • 0

>227を228(22年8月)にしても赤色になりません



私の方はなりますよ。
条件付き書式の適用先と式のセル指定が合致していないのでは?
    • good
    • 1

No.1です。



> 1.…1-9月までは1桁になるので2桁抜いてしまうと
では、「1」にしてください。
    • good
    • 0
この回答へのお礼

=today()が10~12月は2でないと不味いのでは?

お礼日時:2022/07/29 16:34

ちなみに、IFERRORの式だけでセルで試してもらうと分かると思いますが、文字列に1を掛けて数値化しようとするとエラーになるのを利用し、コードの頭3文字目から4文字抜き出して数値化、それでエラーなら3文字抜き出して数値化するようにしていますので、抜き出しに関しては問題ないと思います。

    • good
    • 1
この回答へのお礼

検証不足ですみません。
では少し時間を頂いて再度Tryしてみます。


私も無い知恵を絞って、セルから3桁抜いてtoday()と4桁抜いてtoday()と比較して、どちらも合わない場合は赤字、で下記を試してみましたがうまく行きません。

=AND(LEFT(C6,3)<>TXT(TODAY(),"ym"),LEFT(C6,4)<>TEXT(TODAY(),"ym"))

どこか間違っているのでしょうね。

お礼日時:2022/07/29 16:32

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