- ベストアンサー
エクセルVBA
生年月日(F3:F187)から85歳6か月になる人を(I3:I187)に☆を入力する構文を教えてください。 sheet名は入力です。よろしくお願いします
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2の回答者です。 >うまくいきません。ちなみにオフィースバージョンは2003です、標準モジュールにコピーして使用しましたが動きません。 うまくいかなかったというのは、全然、処理しなかったのか、それとも、エラーが発生したのか、どちらでしょうか。 >ファンクションもそのまま貼り付けたのが良くなかったのでしょうか?生年月日はF3:F187ではなくE3:E187にして使用しました。よろしくお願いします。 別に、2003でも、問題ない初歩的レベルの内容ですし、そのまま二つセットで、標準モジュールに貼り付けして構いません。データがあったら、その3列右に出力しますから、E列対象なら、H列に「☆」が返ることを意味しています。しかし、#2の中でも、誤動作について、ちょっと触れましたが、問題になるのは、その生年月日自体の中身がシリアル値でなければ、話が全然変わってきます。その場合は、一旦、シリアル値に戻さなくてはなりません。 こちらからでは、見えない部分の注意点を事細かには申すこともできませんので、それだけは、確認してください。また、主要な点に、デバッグのタブの中などの、「ブレークポイント」を設けて、ローカル・ウィンドウで、きちんと値が返っているか、見てもよいかと思います。 なお、#3さんのコードは、数式自体を、どこか空いている計算列に、「☆」を出して、それを、ループで、然るべき所に「☆」を置いても構わないはずです。こちらで試してみましたが、私のコードとの違いはありませんでした。この辺りは、必ず、その場所に式を置かなければならないわけではありませんので、臨機応変に考えてください。私は、基本的にはコードが完成品でしたら、誰のでも構いません。
その他の回答 (3)
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! No.1さんの >ワークシートには既に物の関数を埋め込んでいますので使用不可です がよく理解できないのですが、 I3:I187セルには関数は当然入っていないですよね? No.2さんの回答にもあるのですが、DATEDIF関数の不具合は色々指摘されていますが、 そのDATEDIF関数で I3セルに =IF(DATEDIF(F3,TODAY(),"y")+DATEDIF(F3,TODAY(),"ym")/12=85.5,"☆","") という数式を入れフィルハンドルでI87セルまでコピーしておいてはダメなのでしょうか? どうしてもVBAというコトであれば 手っ取り早く上記数式を使う方法です。 Sub Sample1() With Range("I3:I187") .Formula = "=IF(DATEDIF(F3,TODAY(),""y"")+DATEDIF(F3,TODAY(),""ym"")/12=85.5,""☆"","""")" .Value = .Value End With End Sub ※ VBAだと日付が変わるたびにマクロを実行する必要がありますので、 関数の方が向いていると思うのですが・・・m(_ _)m
お礼
この数式は大事に使います、ありがとうございました、
補足
ありがとうございます、 =IF(DATEDIF(F3,TODAY(),"y")+DATEDIF(F3,TODAY(),"ym")/12=85.5,"☆","") この数式で計算できましたがVBAでは反応がありませんでした、これをもとに考えましてNew Data Rowで入力ごとに蓄積されたセルに数式が埋め込まれた状態で使用できますのでこれで行こうかなとも思っていますが、もう少し考えてみます。
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 エクセルVBAの構文を教えて下さい、というわけですが、これは、簡単にみえて、久々の難問でした。理由は、ワークシート関数も、VBA関数も、この計算には、まったく信用がおけないということです。 今回は、#1の方の数式も試してみました。10進で返ってしまうので、85.6 でなくて、85.5 が、6ヶ月のはずです。数式では、DateDif を使えばよいのかもしれませんが、これまた、バグが存在するという話もあります。 しかし、それでも、まだ、例えば、本日 2015/1/25 としますと、85歳6ヶ月の該当者は、1929/6/26~1929/7/25 までの人が該当するはずですね。ここらが、誕生日計算のややこしいところです。 それはともかくとして、誕生日の計算というのは、独特ですね。 以下を参考にしました。 http://www.relief.jp/itnote/archives/excel-calculate-age-no-datedif.php 誕生日の考え方は 「日本の法律では、誕生日の前日が終了する瞬間(すなわち誕生日をむかえる午前0時00分の直前)に1歳を加える。」 「うるう年など、年によって期間を定めた場合において最後の月に応当する日がないときは、その月の末日をもってその年齢が満了する。」 ただし、一応、今回、うるう年の計算処理も含めましたが、その部分は、あまり自信がありません。たぶん、大丈夫だと思いますが。 雑なコードですみません。 最後に、どうしても、誤動作が発生するので調べたら、どうやら、こちらのデータは、ドラッグ・コピーで作成したので、浮動小数点誤差が発生してしまったようです。 '// Sub Sample2() Dim rng As Range Dim toDate As Date Dim mDate As Date Dim c, y, m Const sSRCH As String = "85/6" '85歳と6ヶ月 y = Left(sSRCH, InStr(sSRCH, "/") - 1) m = Replace(sSRCH, y & "/", "") Set rng = Range("F3:F187") '検索範囲 toDate = Date For Each c In rng If DatemDiff(c.Value, Date) = y * 12 + m Then c.Offset(, 3).Value = "☆" End If Next c End Sub Function DatemDiff(a, b) Dim t, i, j, x, z, m, d, y1, y2, y If a = "" Or b = "" Then Exit Function If a > b Then t = b b = a a = t End If 'うるう年の計算処理 If (Month(a + 1) = 3 Or Month(b + 1) = 3) And (Day(a) = 29 Or Day(b) = 29) Then If Day(a) = 29 Then a = a - 1 If Day(b) = 29 Then b = b - 1 End If y1 = Year(a): y2 = Year(b) i = Month(a): j = Month(b) x = Day(a): z = Day(b) y = (y2 - y1) m = j - i: d = z - x If m < 0 Then y = y - 1 m = j + 12 - i End If If d < 0 Then m = m - 1 '誕生日計算 DatemDiff = y * 12 + m 'DatemDiff = y & "." & Format(m, "00") '文字列出力 End Function なお、単独でユーザー定義関数は使えますが、数が多くなると、呼び出しが増えますので、ワークシートが重くなりますので、お勧めしません。
お礼
計算できました。ベストアンサーにさせていただきます。 うるう年計算がまだ理解できずにいますが勉強します。 有難うございました。
補足
有難うございます、うまくいきません。ちなみにオフィースバージョンは2003です、標準モジュールにコピーして使用しましたが動きません。ファンクションもそのまま貼り付けたのが良くなかったのでしょうか?生年月日はF3:F187ではなくE3:E187にして使用しました。よろしくお願いします。
- t-aka
- ベストアンサー率36% (114/314)
実際の使用方法が不明なのですが、 ワークシート関数でも実現することは可能です。 I3に以下の数式を貼り付けて、下方向へフィルを実施してください。 =IF(YEARFRAC(F3,TODAY())>=85.6,"☆","")
お礼
ありがとうございました。
補足
有難うございます、使用法は高齢の表示方法です。 ワークシートには既に物の関数を埋め込んでいますので使用不可です。 別のセルで試しましたがダメでした。 宜しくお願いします
お礼
有難うございました
補足
ありがとうございます、処理しませんでした私のレベルではこの構文を理解するのに手間取っている次第です。 理解できるように頑張ります。