• ベストアンサー

エクセルのマクロでの満年齢および経過時間の表示

はじめまして、初めて質問させていただきます。 私は、社会福祉施設に勤務しているのですが、 入所されている方のデータをユーザーフォームを使って 管理したいと考えています。 ユーザーフォーム自体は以前に作った事があるのですが 日付のデータは扱ったことがありませんでした。 自動で、入所時の年齢、現在の年齢、入所期間を表示させたいと 考えています。 エクセル上では   A         B       C         D      E        F  名前 生年月日  入所年月日 入所時年齢 現在の年齢 入所期間 1 Aさん 2007/02/21 2008/02/21  50歳   51歳   3ヶ月 2 Bさん 2007/02/21 2008/02/21  55歳   62歳   6ヶ月 3 Cさん 2007/02/21 2009/02/21  60歳   73歳   7ヶ月 4 Dさん 2007/02/21 2010/02/21  65歳   84歳   8ヶ月 5 Eさん 2007/02/21 2012/02/21  70歳   90再   9ヶ月 というようなデータになっています。(数字は適当です) マクロでは、datediffを使えば、計算させることはできるのですが 満年齢ではないと、入所した時の年齢などに不整合が生じてしまい ます。(たとえば、月をまたぐと、一日し変わらないのに入所期間が一月分増えているなど。) エクセルの関数ではdatedifを使えて楽なのですが… (datedifを使って上の表を作ることはできます) マクロで扱うやり方がわかりません。 いくつかのサイトで答えらしきものも見たのですが、 ユーザーフォームを作る以上、変数でも処理しなくてはいけないので たとえば Cells(gyou,1) (gyouは行番号をあらわす変数)など このように変数も使って扱うのでさらに混乱しております。 http://okwave.jp/qa2511599.html なども参考にしては見たのですが 長々としたので質問の要旨は 1マクロで満年齢、満経過日数を扱う方法 2その際に、変数を使えるのかrenge("a1")などのセル指定以外の  指定の仕方、cells(1.1)などでも扱えるのか です。 マクロに関しては、初心者なので、なにとぞよろしく御願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.9

こんにちは。 せっかく、zap35さんが書いていただいたので、私から少し書かせていただきたいのですが、A1 方式で書くと、別になりますが、R1C1 方式ですと、相対参照にする場合は、すべて同じ式になってしまいます。 前回のレイアウトから、コントロールツールの[テキストボックス]を一つ増やしました。 ワークシート      名前   生年月日  入所年月日 行数  ---------------------------------------------------    TextBox1  TextBox2  TextBox3  TextBox4 コマンドボタン  [日付] ←名前-定義-登録[今日] ================================================== ←ウィンドウ枠の固定 TextBox4 に行数を入れる。 (コマンドボタンをクリックすると、最終データの次の行が出る)        数式の保護はなされてはいません。        今は、自動スクロールがされていません。 TextBox4 に、入力してある行を入力すると、その行に入力されているデータが出てきます。 ----------------------------------------------------- '*********************** 'シートモジュール (シートタブから、コードの表示をクリック) '*********************** '----------------------------------------------------- Private Sub CommandButton1_Click()   Dim gyou As Long   Dim Tx1 As String, Tx2 As String, Tx3 As String   '行数のチェック   If Val(TextBox4.Value) = 0 Then     MsgBox "行数が入っていません。", vbInformation     Exit Sub   Else     gyou = Val(TextBox4.Value)   End If      '名前   If TextBox1.Text = "" Then     MsgBox "お名前が入っておりません。", vbInformation     Exit Sub   Else     Tx1 = TextBox1.Text   End If      '生年月日   If Not IsDate(TextBox2.Value) Or Year(DateValue(TextBox2.Value)) < 1900 Then     MsgBox "生年月日の日付の入れ方が違います。 " & TextBox2.Text, vbInformation     Exit Sub   Else     Tx2 = CDate(TextBox2.Text)   End If      '入所年月日   If Not IsDate(TextBox3.Value) Or Year(DateValue(TextBox2.Value)) < 1900 Then     MsgBox "入所年月日の日付の入れ方が違います。" & TextBox2.Text, vbInformation     Exit Sub   Else     Tx3 = CDate(TextBox3.Text)   End If      '本日に対する日付のチェック   If Not (DateValue(Tx3) > DateValue(Tx2) And _     Date > DateValue(Tx3) And _     Date > DateValue(Tx2)) Then     MsgBox "日付の入力をもう一度調べてください。本日より先の日付は入れられません。", vbInformation     Exit Sub   End If   '入力   Cells(gyou, 1).Value = Tx1      Cells(gyou, 2).NumberFormatLocal = "yy/mm/dd" '日付書式   Cells(gyou, 2).Value = Tx2      Cells(gyou, 3).NumberFormatLocal = "yy/mm/dd" '日付書式   Cells(gyou, 3).Value = Tx3      Cells(gyou, 4).FormulaLocal = "=DATEDIF(RC[-2],RC[-1]-1,""y"")&""歳"""   Cells(gyou, 5).FormulaLocal = "=DATEDIF(RC[-3],今日-1,""y"")&""歳"""   Cells(gyou, 6).FormulaLocal = "=DATEDIF(RC[-3],今日,""m"")&""ヶ月""" 'データの最後の次の行   TextBox4.Value = Cells(65536, 1).End(xlUp).Offset(1).Row End Sub Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '名前  If KeyCode.Value = 9 Or KeyCode.Value = 13 Then   TextBox2.Activate  End If End Sub Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '生年月日  If KeyCode.Value = 9 Or KeyCode.Value = 13 Then   TextBox3.Activate  End If End Sub Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) '入所年月日 If KeyCode.Value = 9 Or KeyCode.Value = 13 Then   TextBox1.Activate  End If End Sub Private Sub TextBox4_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)   '行数の入力   Dim i As Integer   Dim gyou As Long   gyou = Val(TextBox4.Value) '行をずらす場合は、数字を足します   If gyou > 0 Then     If KeyCode = 13 Then       If IsDate(Cells(gyou, 2).Value) Then         For i = 1 To 3           Me.OLEObjects("TextBox" & i).Object.Value = Cells(gyou, i).Text         Next i       Else         '2列目が文字列の場合は、終了(タイトルの場合)                  If VarType(Cells(gyou, 2)) = vbString Then Exit Sub         For i = 1 To 3           Me.OLEObjects("TextBox" & i).Object.Value = ""         Next i         TextBox1.Activate       End If     End If   End If End Sub

kaeruhousi
質問者

お礼

本当に何度もありがとうございます。 全て試したわけではないですが、なんかうまくいきそうな予感がします。 やはり、値そのものより式を入れるという発送の転換が 大切でした。 いろいろな本を読んでも、それぞれ書いてあることが違って 迷っていたのですが、皆さんのおかげで何とかなりそうです。 これからも他にこの欄を参考にされる方もいると思うので、ユーザーフォームや日付などのことについて触れられていた、私の持っている本を書いておきます。 『すっきりわかったエクセルVBA』 →ユーザーフォームについては書いてあり、  満年齢の表示は触れられていません。回答していただいた  中にあった、エラーの処理については触れられています。 『かんたんプログラミングEXCELBVA』 →基礎的な内容らしく、フォームには触れられていません。 『EXCELVBAスーパーマスター』 →満年齢の表示にdateddiffを使っていますが他に操作を  している様子があります。該当部分以外の内容もほとんど  理解できませんでした。全体的に敷居が高いようです。 『やさしく学ぶエクセルVBA』 →満年齢の表示にマクロのdateddiffは使うなと書いてありました。 『日経PCエクセルマクロ活用バイブル』 →満年齢については触れられていない。 です。 本当の所、私が習作で作ったコードとかも貼っていきたいのですが 業界は結構狭いので私の身元が割れてしまうこともあるので、 それは、ご容赦願います。これからは自分で努力しますが もし、他にも質問が出た場合には (実は他に列が40以上もあったりします…) いつかご協力を御願いいたします。 皆さん本当にありがとうございました。

その他の回答 (9)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.10

こんばんは。 #2さんの方法の延長として、#8のzap35さんの方法のイベント方式も、試してみる価値はあると思います。 かなり本をお持ちのようですね。VBAの勉強は、体系的に覚えるのがよいのですが、あまり体系的に書かれたものがありません。 >『かんたんプログラミングEXCELBVA』 >→基礎的な内容らしく、フォームには触れられていません。 私が、長年お勧めしているのは、この本のシリーズですが、フォームは、次の「コントロール・関数編」にあります。ただ、どうも、この本は、細かすぎる傾向があって、まじめな人は、全部読もうとして、挫折する向きがあります。 このシリーズの三部(2007は、今の所、二部まで)の最後まで読み進めると、ちょうど、一通り、入門レベルが終わったことになります。それ以上に、特に、一般の人が何か書籍が必要とは思いません。もし、必要となると、コントロールの辺りは、どうしても、VB6の解説本がないと、何も解説がありません。Office 2003?からは、VB 6 のCommon Dialog Control が入っています。 >『やさしく学ぶエクセルVBA』 >→満年齢の表示にマクロのdateddiffは使うなと書いてありました。 ---- >→満年齢の表示にdateddiffを使っていますが他に操作を > している様子があります。該当部分以外の内容もほとんど > 理解できませんでした。全体的に敷居が高いようです。 私は、何度も、この件は書いていますが、この辺りは、非常に難しいです。人によって、正しいとか間違っているとか言う人がいますが、自分が何を求めているかであって、他に問題を摩り替えてしまうと、一般の人たちは、さっぱり訳がわからなくなってしまいます。 もともと、DATEDIF は、米国の商習慣や慣習の中から生まれたもので、わが国の慣習には、とても似ているものがあるのですが、それと合わないものがあってもしかるべきだと思っています。(この辺りは、インターネット検索してもよいとは思いますが、あまり付和雷同式に、参考にはしなくてよいと思います。) 民法の考え方を紹介しましたが、その中に書かれていた内容のように、「誕生日」や「満年齢」というものは、必ずしも、「365日」で完了になるというような考え方ではありません。そこに矛盾が生じてしまいます。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.8

ちょっと目先を変えてみます。 >datediffを使えば、計算させることはできるのですが 計算自体はDATEDIF関数で良いが、不慣れな操作者が行を挿入してもきちんと計算されるようにしたいなら、変更された行に「関数式を埋め込むマクロ」にしたらどうでしょう。 B列、C列の値が変更されたとき、  ・B列、C列ともに日付データである  ・B列の値 <= C列の値 の時に関数式を埋め込むマクロにしてみました Private Sub Worksheet_Change(ByVal Target As Range) Dim trgR As Long  trgR = Target.Row  If Target.Column = 2 Or Target.Column = 3 Then   If IsDate(Cells(trgR, "B").Value) And IsDate(Cells(trgR, "C").Value) And _    Cells(trgR, "B").Value <= Cells(trgR, "C").Value Then     Cells(trgR, "D").Formula = "=DATEDIF(" & "B" & trgR & ",C" & trgR & ",""Y"")"     Cells(trgR, "E").Formula = "=DATEDIF(" & "B" & trgR & ",TODAY()" & ",""Y"")"     Cells(trgR, "D").Resize(1, 2).NumberFormatLocal = "0""歳"""     Cells(trgR, "F").Formula = "=DATEDIF(" & "C" & trgR & ",TODAY()" & ",""M"")"     Cells(trgR, "F").NumberFormatLocal = "0""カ月"""   Else     Cells(trgR, "D").Resize(1, 3).Formula = ""   End If  End If End Sub マクロはシート名右クリック→コードの表示で開くシートに貼り付けてください。 余談ですが最近質問者の質が下がって(?)、かつ私の気力も下がっていることも相まって回答しないことが多いのですが、kaeruhousiさんのようにきちんと要点を整理した質問を書いてくださると、答える側としてもやる気が出ますね(^^;

kaeruhousi
質問者

お礼

回答ありがとうございます。 単純にformulaを使うのは、私もやっては、見たのです たとえば cells(gyou,3).formula="=datedif(B2,C2,""y"")" と入れてみたのですが、これだと セルを相対的に判別することができないかったのです。 cells(gyou,3).formula="=datedif(cells(gyou,2),cells(gyou,3),""y"")"だと動かなかったので。そうしたこともあり 質問しました。上のやり方については、私もまったく想像も付 かなかったので、少しやってみます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

こんにちは。 私のほうも、ここ1週間ぐらいで、完全に書き込みが出来なくなりますので、場合によっては、9月半ば頃まで出来ない可能性があります。 それまでに、レスが付かなくても、以下の2点はまとめておきます。 その要件としては  ・数式を入れるマクロ ・バックアップシステム(お使いにならないかもしれませんが)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 大変なお仕事のようですね。 お金の絡むものを作るときには、万全に作らないといけないので、私も真剣に考えさせていただきます。 >ボタンを押すたびに、表示される行が変わっていくように作っていました。 それはそれでよいと思います。 >誰でもデータの入力と、変更を行えるものを作る必要があったのです。 今回、私が作りきれなかった一つに、修正をどうするか、という問題に、良い案が出なかったと言うか、今まで、修正の段になってUserForm による方法を断念せざるを得なかった経験があります。もちろん、 ワークシートメニューのデータ--フォームというスタイルを、UserForm に行わせるぐらいのマクロは作れます。それでも、なんとなくシックリとしてこないのです。 前回は、やむを得ず、ワークーシートに貼り付ける前に、MsgBox で確認する方法を取りました。間違いなく、入力できたかというメッセージですが、後で気が付いたときに、どうするか、というような問題も発生します。今のままでは、直接上書きしても、そこでは、数値が変わりませんね。 そこで、私からの提案ですが、 UserForm の中で表示することはしても、値をそのまま貼り付けるのではなく、私は、数式を貼り付ける方法をとったらどうか、と思うのです。 それと、UserForm ではなく、コントロールツールをワークシートに貼り付けておくと、そのまま、入れることが可能です。(以下の図) 万が一、自分がいなくても、誰かが、データの部分(名前、生年月日、入所年月日)のところさえ、変えてくれれば、それですぐに変更が可能です。 それと、仕事上、たぶん、 #2 さんの、 =DATEDIF(B2,TODAY(),"Y") をお借りして、 TODAY()という、自動入力は、どこか、別のセルに、名前定義登録をして「今日」として、=TODAY() を置き、 =DATEDIF(B2,今日,"Y") とすると、作成するシートは、[○月○日付け現在]というシートが出来上がります。 一例: ワークシート(UserForm の起動がいらない) --------------------------------------------------- [A1]   TextBox1  TextBox2  TextBox3  コマンドボタン  [日付] ←名前-定義-登録[今日] ================================================== ←ウィンドウ枠の固定  ↑ A1に行数を入れる(コマンドボタンで、1つ加算)        実際のデータ  数式の部分は自動的に保護 ----------------------------------------------------- スクロールしても、テキストボックスの行の部分は、動きません。 なお、数式は、R1C1 方式でみると、列を変えなければ、全部同じですから、マクロでは簡単です。最初から入れておいてもよいのですが、マクロの場合は、同じことです。 まず、こんなアイデアを考えましたが、それでよかったら、少し加えていきたいと思います。 >私の職場では、エクセルの罫線を引くのもままならない人がいるので・・・ 私の経験ですが、女の人は、年配の人でも、なんとか覚えるような気がします。ただ、男性の場合は、しないでほしいというような人がいることもあります。 どうしたら、そんなような状態にしてしまうか、想像の付かないようなトラブルを発生する人がいますので、見える部分よりも、起動時にバックアップを取るようなシステムを作ります。ファイルとしては、起動前に戻るだけです。私のところでは、標準装備の「自動保存」は、マクロ付きのファイルには、あまり調子よくありません。私の使っているのは、特殊なマクロですが、マクロの動いている最中でも、どうも割り込みが入るらしいのです。それに、設定されているようなサイクルで保存が必要ではないのです。

kaeruhousi
質問者

お礼

ありがとうございます。 たしかに、無理に全てをマクロで作るのではなく 行を数式を入れたまま、増やすというのは、一番楽 カも知れないです。それなら、そのまま、ワークシートの 関数を使えますし。 この方法で、試してみます。 実は私は、事務屋ではなく、入所している方の 援助をしながらの作業なので、作業結果のレスが 遅れるかもしれないですが、すみませんです。 何度も、本当にありがとうございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

#3のコードの補足です。 過去のログの記録のままに使いましたが、年齢は、民法第143条の規定を準用することとすれば、365日目が誕生日の前日となるので、誕生日の前日で満1歳と数えることとなります。 例えば、2007/8/1 生まれの赤ちゃんは、2008/7/31 で、民法上の満1歳を迎えるという計算になります。 年齢の数え方について http://www.jtw.zaq.ne.jp/jingchuan/age.html ということは、私のユーザー定義関数の Function mDATEDIF '× Ldate = CLng(日付2) - i '満年齢を出す場合 Ldate = CLng(日付2) + i '満年齢を出す場合 ということになります。ただ、上記のサイトの説明のあるように、はたして、その計算が、正確に「満」を表すというのには、疑問がありますが、一応、法律に、準用することにします。一般的な考え方にするなら、 + i は、取り去ってしまってもよいと思います。それによって、1日の違いがあるのですが、その違いについて、一般的には問題になることはないと思います。

kaeruhousi
質問者

お礼

何度もありがとうございます。 確かに1日の違いが問題になることは一般的には 無いのですが、その一日が問題になることが ままあるのです… たとえば、ここでは、直接関係ないのですが 子供の学年も生まれたのが4月1日なのか2日でも変わって しまうことがあるので、なるべくきちんと出したいと思い まして…。(実は1日違いでもらえるお金が変わることがあるのです) 質問の範囲を超えたことにまで、気を使っていただいて すみませんm(_ _)m。

  • rooksan
  • ベストアンサー率66% (4/6)
回答No.4

1.マクロで満年齢を扱うには以下のような感じで (1)subプロシジャーを定義します (2)その中で満年齢と入所期間を計算するfunctionプロシジャーを定義します  満年齢 プロシジャー 誕生日と計算対象の日時が引数。満年齢が返ります  入所期間プロシージャー    入所日時と計算対象の日時が引数。満の月数が返ります  ※ともにdatediff関数を利用しています Sub check() Set s = Sheet1.Cells(1, 1).CurrentRegion Dim 現在の日時 現在の日時 = Now() For i = 2 To s.Rows.Count s.Cells(i, 4) = 満年齢(s.Cells(i, 2), s.Cells(i, 3)) s.Cells(i, 5) = 満年齢(s.Cells(i, 2), 現在の日時) s.Cells(i, 6) = 入所期間(s.Cells(i, 3), 現在の日時) Next i End Sub Function 満年齢(誕生日, 日時) 満年齢 = DateDiff("yyyy", 誕生日, 日時) If (Month(日時) < Month(誕生日) Or (Month(日時) = Month(誕生日) And Day(日時) < Day(誕生日))) Then 満年齢 = 満年齢 - 1 End If End Function Function 入所期間(入所日, 日時) 入所期間 = DateDiff("m", 入所日, 日時) If Day(日時) < Day(入所日) Then 入所期間 = 入所期間 - 1 End If End Function 満年齢と入所期間は標準モジュールに定義すれば、ユーザー定義関数と して扱えるので、ワークシートの計算式として使えます  たとえば セルに =満年齢(A2,NOW()) に入力する 2その際に、変数を使えるのかrenge("a1")などのセル指定以外の  指定の仕方、cells(1.1)などでも扱えるのか? 扱えます Set s = Sheet1.Cells(1, 1).CurrentRegion Sheet1.Cells(1,1)はSheet1のA1と同等です  その次のCurrentRegionですが、A1で囲まれたデータがあるセルを  sのRangeに設定するマクロ命令です。  つまり A1:E5がsに設定されます  そのRangeの2行目(1行目は表題ですので)から行数分(s.rows.count) 計算します

kaeruhousi
質問者

お礼

ひとつひとつに丁寧な回答ありがとうございます。 ユーザー定義関数のことについては、過去ログなどにも 触れられ、他のサイトでも触れられていたのですが よくわからなかったのです。rooksanのとおりにやってみます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 全体的な組み立て方が、分かりませんが、UserForm の テキストボックス を三つを入力すると、 ---------------------- 名前   「TextBox1      」 生年月日 「TextBox2      」 入所年月日 「TextBox3      」 CommandButton1 --------------------- セルには、 名前、生年月日、入所年月日、入所年齢、現在の年齢、入所期間 の5つが入れられるようにしたいというわけですね。 しかし、問題は、 >Cells(gyou,1) >(gyouは行番号をあらわす変数)など このgyou をどうするか、という具体的な案が出されていません。 以下は、データの最後の行にしてありますが、「現在の年齢」「入所期間」は、「今日」に対する差ですから、実際、マクロで入れてしまうというのには、少し、無理があるのかなって思います。 私が、ご質問者さんの同じ立場なら、マクロにはしないで、#2さんのようなスタイルにします。リストされたデータがあれば、圧倒的に、ワークシートスタイルのほうが入力が早いです。私は、現役の時は、数千件のデータを、延べ6時間ぐらいで入力していましたから。マクロは使っても、数式を入れる程度です。それは、データ量にもよります。 'UserForm モジュール --------------------------- Private Sub CommandButton1_Click() Dim myDate1 As Variant Dim myDate2 As Variant Dim o1 As Long Dim o2 As Long Dim o3 As Long Dim i As Long      myDate1 = "": myDate2 = ""   o1 = 0: o2 = 0: o3 = 0      If TextBox2.Value <> "" And TextBox3.Value <> "" Then     If IsDate(TextBox2.Value) And IsDate(TextBox3.Value) Then       myDate1 = CDate(TextBox2.Value) '生年月日       myDate2 = CDate(TextBox3.Value) '入所年月日              o1 = mDATEDIF(myDate1, myDate2) '入所時の年齢       o2 = mDATEDIF(myDate1, Date) '現在の年齢       o3 = mDATEDIF(myDate2, Date, "m") '入所期間              With ActiveSheet       '行数の決定(データの最後の次)       i = .Range("A65536").End(xlUp).Offset(1).Row       If MsgBox(TextBox1.Value & "さん" & vbCrLf & _           CDate(myDate1) & vbCrLf & _           CDate(myDate2) & vbCrLf & _           o1 & "歳" & vbCrLf & _           o2 & "歳" & vbCrLf & _           o3 & "ヶ月" & vbCrLf & _           i & "行目に書き込みますが、これでよろしいですか?", vbOKCancel) = vbCancel Then          Exit Sub        End If              .Cells(i, 1).Value = TextBox1.Value & "さん"       .Cells(i, 2).Value = myDate1       .Cells(i, 3).Value = myDate2       .Cells(i, 4).Value = o1 & "歳"       .Cells(i, 5).Value = o2 & "歳"       .Cells(i, 6).Value = o3 & "ヶ月"      End With     End If   End If   End Sub Function mDATEDIF(日付1 As Variant, 日付2 As Variant, Optional typ As String) Dim Fdate As Long Dim Ldate As Long Dim i As Integer  If typ = "" Then   typ = """y"""   i = 1  Else   typ = """" & typ & """"   i = 0  End If  Fdate = CLng(日付1)  Ldate = CLng(日付2) - i '満年齢を出す場合 mDATEDIF = Evaluate("DATEDIF(" & Fdate & "," & Ldate & "," & typ & ")") End Function '------------------------------ たぶん、もし、こういうスタイルで、不満を感じるとしたら、やはり、行数の決め方にあるとは思います。別途、TextBox に行数を入れるようなスタイルがよいのかもしれません。

kaeruhousi
質問者

お礼

ありがとうございます。 実際のところ、私も、マクロは使いたくないのです。 実際に、上記のデータ以外にも、入所されている方のデータは たくさんあり、入所者のデータベースは横に長いデータベース になります。実際には、それの簡便に行う関数は全て作ってあり 自分で操作をする分には何の支障も無いのですが、私以外の 人が使えないというデメリットがあります、誰でもデータの 入力と、変更を行えるものを作る必要があったのです。 私の職場では、エクセルの罫線を引くのもままならない人がいるので・・・ gyouをどうするのかが不明確というのは、指摘いただいて、気がつき増した。実際には、 私は『すっきりわかったエクセルVBAマクロ作成のつぼ』などの 本に準拠して作ったのですが、 private sub commanndbutton_click() gyou=cells(1.1)'行の番号が表示されているセル gyou=gyou+1 とし、ボタンを押すたびに、表示される行が変わっていくように作っていました。 ご指摘に答えられたかどうかも自信がありませんが、これからも 学習していきます。

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.2

>たとえば、月をまたぐと、一日し変わらないのに入所期間が一月分増えているなど。 が良くわらないのですが、関数で D列 =DATEDIF(B2,C2,"Y") E列 =DATEDIF(B2,TODAY(),"Y") F列 =DATEDIF(C2,TODAY(),"M") 下までコピィ C2が 2007/7/31で 8月1日になっても F列は0を表示しますが。

kaeruhousi
質問者

お礼

ありがとうございます。 datedifを使うのが一番便利で楽なのですけれど 私以外の人はあまり、パソコンを使えないのです… 全部私が、パソコン仕事をするとだんだんつらくなってきたので どうしてもマクロを使ってほぼすべてを児童で処理させたかったのです。コピーがずれると直すのが私の役目になってしまうので・・・

  • kigoshi
  • ベストアンサー率46% (120/260)
回答No.1

あまりスマートなコードではありませんが、とりあえずやりたいことは これでできるかと思います。 Range と Cells の使い方は参考URLをご覧下さい。 Sub sample() Dim gyou As Long For gyou = 2 To Range("A65536").End(xlUp).Row Cells(gyou, 4).Value = DateDiff("yyyy", Cells(gyou, 2).Value, Cells(gyou, 3).Value) If Month(Cells(gyou, 2).Value) * 100 + Day(Cells(gyou, 2).Value) > Month(Cells(gyou, 3).Value) * 100 + Day(Cells(gyou, 3).Value) Then Cells(gyou, 4).Value = Cells(gyou, 4).Value - 1 Cells(gyou, 5).Value = DateDiff("yyyy", Cells(gyou, 2).Value, Now) If Month(Cells(gyou, 2).Value) * 100 + Day(Cells(gyou, 2).Value) > Month(Now) * 100 + Day(Now) Then Cells(gyou, 5).Value = Cells(gyou, 5).Value - 1 Cells(gyou, 6).Value = DateDiff("m", Cells(gyou, 3).Value, Now) If Day(Cells(gyou, 3).Value) > Day(Now) Then Cells(gyou, 6).Value = Cells(gyou, 6).Value - 1 Next End Sub

参考URL:
http://excelfactory.net/inukouza/inu06.htm
kaeruhousi
質問者

お礼

ありがとうございます。 早速試してみます。 Cells(gyou, 4).Value = DateDiff("yyyy", Cells(gyou, 2).Value, Cells(gyou, 3).Value)は、私も普通に組めたのですが、 下の式の意味がわからないので、少し研究してみます。 どうしても、ほぼ自動でできて、しかも直感的にわかるフォームを 作らないと、永遠に、パソコンの仕事から解放されないので… がんばって覚えます。ありがとうございました。

関連するQ&A

  • エクセル生年月日から満年齢を出したい

    一難去ってまた一難… E2セルに今日の日付、C4セルに生年月日で、 =DATEDIF(C4,$E$2,"Y") の式で今日現在の年齢を出すことはできたのですが、今日現在の年齢ではなく満年齢を出す方法はあるでしょうか? よろしくお願いします。

  • マクロで年齢の自動計算

    エクセルのA1のセルに生年月日を入力するとB1のセルに年齢が自動入力されるマクロを組みたいのですが教えてください。関数(DATEDIF)を利用してのやりかたはわかるのですがマクロを組んで同じことはできないでしょうか。よろしくお願いいたします。

  • 年齢表示: ◯歳Xヶ月

    「DATEDIF」関数で、満年齢を表示させる方法がありますが、これを応用するか、或いは応用しなくても、生年月日から基準日までの; 「何歳と何ヶ月」 を表示させる関数、方法を教えてください。

  • EXCEL エクセル 年齢 DATEDIF関数 空白の場合

    EXCEL2007 年齢を計算するのに A1セルに 生年月日を入力、 B1セルに年齢  =DATEDIF(A1,TODAY(),"y")で  満年齢がでると思うのですが A1セルが空白の場合 109となります。 A1セルが空白の場合 B1セルも空白になる関数を教えてください。 本を見ながらの初心者です。よろしくお願いします。

  • エクセルの年齢の計算方法について

    エクセルで、A1に「現在の日付」、A2に「生年月日」を入れ、 A3のセルで次のとおり計算式、 =DATEDIF(A2,$A$1,"Y")&"年"&DATEDIF(A2,$A$1,"YM")+1&"ヶ月" を入力し、「○○年○○ヶ月」と表示させました。 このA2「生年月日」と、A3「○○年○○ヶ月」のデータがいくつかあるのですが、「○○年○○ヶ月」の平均値を求めることは可能でしょうか? その場合の、計算式等をお教えていただけないでしょうか? 分かりにくい説明で申し訳ありません。 よろしくお願いいたします。

  • エクセルで年齢式がコピーできない

    エクセルで名簿を作っています。 最初の一人の生年月日と今日の日付から満年齢を出せたまではいいのですが、全員分の満年齢を出そうとして式をドラッグしてコピーしようとしたところ、#VALUE!と#NUM!が交互に出て、年齢が表示されません。 E2セルに今日の日付(=TODAY())、C4に最初の人の生年月日を入力しています。 最初の人の年齢は=DATEDIF(C4,E2,"Y")の式で正常に表示されているのですが、この式をドラッグでコピーすると、以下、#VALUE!と#NUM!が交互に表示されます。コピーされた式をひとつずつ調べると、 =DATEDIF(C4,E2,"Y") ←正常に表示 =DATEDIF(C5,E3,"Y") ←#VALUE!と表示 =DATEDIF(C6,E4,"Y") ←#NUM!と表示 =DATEDIF(C7,E5,"Y") ←#VALUE!と表示 =DATEDIF(C8,E6,"Y") ←#NUM!と表示 … といった感じで続いていて、要は今日の日付を入力しているE2セルを正しく参照していないようです。これを、 =DATEDIF(C4,E2,"Y")  =DATEDIF(C5,E2,"Y")  =DATEDIF(C6,E2,"Y")  =DATEDIF(C7,E2,"Y")  =DATEDIF(C8,E2,"Y")  のように、常にE2を参照させる方法があるはずだと思うのですが、どうすればいいでしょうか? よろしくお願いします。

  • 年齢の表示を桁合わせする

    今日現在の年齢を表示したときに、”月”を二桁表示にする方法を教えてください。見た目を 〇〇歳〇〇ヶ月と表示したい。   下記のような表です。 式は '=DATEDIF(C5,$A$5,"y")&"歳"&DATEDIF(C5,$A$5,"ym")&"ヶ月" と作りました。  今日    氏名 生年月日   年齢 2014/9/4 aa S25.10.31 63歳10ヶ月       bb S58.8.10  31歳0ヶ月      cc H20.7.20   6歳1ヶ月 ※OKWaveより補足:「富士通FMV」についての質問です。

  • Excelマクロで・・・

    任意の変数nを参照し、範囲A1:(A1+n)の最大値を 計算するマクロを作りたいと考えています。 とりあえず Formula="max(Cells(1,1),Cells(1,n))"と書いてみた のですが、(当然なのでしょうが)ダメでした。 良く分からないですがFormulaを使う時はA1とかB15 しか入力出来ないようです。何か良い方法をご存知 でしたらどうかよろしくお願い致します。

  • 元号入力した生年月日から満年齢を求める方法

    セルA1に元号で生年月日を入力しセルA2に今日(入力日)現在の満年齢を表示させることができますか? 可能な場合の設定を教えてください。 よろしくお願いします。

  • エクセル マクロ起動中のメッセージを表示したい

    いつもお世話になります。 エクセルで、マクロを起動して、動作が終了するのに時間がかかるため、起動中に、「マクロ起動中です」のメッセージが表示されるようにしたいのです。 自分なりに考えて、"A"というメッセージのみのユーザーフォームを作って、マクロの最初と最後に A.show ~中略~ A.Hide としたのですが、表示されたユーザーフォームの×印を押さないとマクロが動きません。 宜しくお願い致します。

専門家に質問してみよう