
はじめまして、初めて質問させていただきます。
私は、社会福祉施設に勤務しているのですが、
入所されている方のデータをユーザーフォームを使って
管理したいと考えています。
ユーザーフォーム自体は以前に作った事があるのですが
日付のデータは扱ったことがありませんでした。
自動で、入所時の年齢、現在の年齢、入所期間を表示させたいと
考えています。
エクセル上では
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)などでも扱えるのか
です。
マクロに関しては、初心者なので、なにとぞよろしく御願いします。
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
本当に何度もありがとうございます。
全て試したわけではないですが、なんかうまくいきそうな予感がします。
やはり、値そのものより式を入れるという発送の転換が
大切でした。
いろいろな本を読んでも、それぞれ書いてあることが違って
迷っていたのですが、皆さんのおかげで何とかなりそうです。
これからも他にこの欄を参考にされる方もいると思うので、ユーザーフォームや日付などのことについて触れられていた、私の持っている本を書いておきます。
『すっきりわかったエクセルVBA』
→ユーザーフォームについては書いてあり、
満年齢の表示は触れられていません。回答していただいた
中にあった、エラーの処理については触れられています。
『かんたんプログラミングEXCELBVA』
→基礎的な内容らしく、フォームには触れられていません。
『EXCELVBAスーパーマスター』
→満年齢の表示にdateddiffを使っていますが他に操作を
している様子があります。該当部分以外の内容もほとんど
理解できませんでした。全体的に敷居が高いようです。
『やさしく学ぶエクセルVBA』
→満年齢の表示にマクロのdateddiffは使うなと書いてありました。
『日経PCエクセルマクロ活用バイブル』
→満年齢については触れられていない。
です。
本当の所、私が習作で作ったコードとかも貼っていきたいのですが
業界は結構狭いので私の身元が割れてしまうこともあるので、
それは、ご容赦願います。これからは自分で努力しますが
もし、他にも質問が出た場合には
(実は他に列が40以上もあったりします…)
いつかご協力を御願いいたします。
皆さん本当にありがとうございました。
No.10
- 回答日時:
こんばんは。
#2さんの方法の延長として、#8のzap35さんの方法のイベント方式も、試してみる価値はあると思います。
かなり本をお持ちのようですね。VBAの勉強は、体系的に覚えるのがよいのですが、あまり体系的に書かれたものがありません。
>『かんたんプログラミングEXCELBVA』
>→基礎的な内容らしく、フォームには触れられていません。
私が、長年お勧めしているのは、この本のシリーズですが、フォームは、次の「コントロール・関数編」にあります。ただ、どうも、この本は、細かすぎる傾向があって、まじめな人は、全部読もうとして、挫折する向きがあります。
このシリーズの三部(2007は、今の所、二部まで)の最後まで読み進めると、ちょうど、一通り、入門レベルが終わったことになります。それ以上に、特に、一般の人が何か書籍が必要とは思いません。もし、必要となると、コントロールの辺りは、どうしても、VB6の解説本がないと、何も解説がありません。Office 2003?からは、VB 6 のCommon Dialog Control が入っています。
>『やさしく学ぶエクセルVBA』
>→満年齢の表示にマクロのdateddiffは使うなと書いてありました。
----
>→満年齢の表示にdateddiffを使っていますが他に操作を
> している様子があります。該当部分以外の内容もほとんど
> 理解できませんでした。全体的に敷居が高いようです。
私は、何度も、この件は書いていますが、この辺りは、非常に難しいです。人によって、正しいとか間違っているとか言う人がいますが、自分が何を求めているかであって、他に問題を摩り替えてしまうと、一般の人たちは、さっぱり訳がわからなくなってしまいます。
もともと、DATEDIF は、米国の商習慣や慣習の中から生まれたもので、わが国の慣習には、とても似ているものがあるのですが、それと合わないものがあってもしかるべきだと思っています。(この辺りは、インターネット検索してもよいとは思いますが、あまり付和雷同式に、参考にはしなくてよいと思います。)
民法の考え方を紹介しましたが、その中に書かれていた内容のように、「誕生日」や「満年齢」というものは、必ずしも、「365日」で完了になるというような考え方ではありません。そこに矛盾が生じてしまいます。
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さんのようにきちんと要点を整理した質問を書いてくださると、答える側としてもやる気が出ますね(^^;
回答ありがとうございます。
単純にformulaを使うのは、私もやっては、見たのです
たとえば
cells(gyou,3).formula="=datedif(B2,C2,""y"")"
と入れてみたのですが、これだと
セルを相対的に判別することができないかったのです。
cells(gyou,3).formula="=datedif(cells(gyou,2),cells(gyou,3),""y"")"だと動かなかったので。そうしたこともあり
質問しました。上のやり方については、私もまったく想像も付
かなかったので、少しやってみます。
No.7
- 回答日時:
こんにちは。
私のほうも、ここ1週間ぐらいで、完全に書き込みが出来なくなりますので、場合によっては、9月半ば頃まで出来ない可能性があります。
それまでに、レスが付かなくても、以下の2点はまとめておきます。
その要件としては
・数式を入れるマクロ
・バックアップシステム(お使いにならないかもしれませんが)
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 方式でみると、列を変えなければ、全部同じですから、マクロでは簡単です。最初から入れておいてもよいのですが、マクロの場合は、同じことです。
まず、こんなアイデアを考えましたが、それでよかったら、少し加えていきたいと思います。
>私の職場では、エクセルの罫線を引くのもままならない人がいるので・・・
私の経験ですが、女の人は、年配の人でも、なんとか覚えるような気がします。ただ、男性の場合は、しないでほしいというような人がいることもあります。
どうしたら、そんなような状態にしてしまうか、想像の付かないようなトラブルを発生する人がいますので、見える部分よりも、起動時にバックアップを取るようなシステムを作ります。ファイルとしては、起動前に戻るだけです。私のところでは、標準装備の「自動保存」は、マクロ付きのファイルには、あまり調子よくありません。私の使っているのは、特殊なマクロですが、マクロの動いている最中でも、どうも割り込みが入るらしいのです。それに、設定されているようなサイクルで保存が必要ではないのです。
ありがとうございます。
たしかに、無理に全てをマクロで作るのではなく
行を数式を入れたまま、増やすというのは、一番楽
カも知れないです。それなら、そのまま、ワークシートの
関数を使えますし。
この方法で、試してみます。
実は私は、事務屋ではなく、入所している方の
援助をしながらの作業なので、作業結果のレスが
遅れるかもしれないですが、すみませんです。
何度も、本当にありがとうございます。
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日の違いがあるのですが、その違いについて、一般的には問題になることはないと思います。
何度もありがとうございます。
確かに1日の違いが問題になることは一般的には
無いのですが、その一日が問題になることが
ままあるのです…
たとえば、ここでは、直接関係ないのですが
子供の学年も生まれたのが4月1日なのか2日でも変わって
しまうことがあるので、なるべくきちんと出したいと思い
まして…。(実は1日違いでもらえるお金が変わることがあるのです)
質問の範囲を超えたことにまで、気を使っていただいて
すみませんm(_ _)m。
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)
計算します
ひとつひとつに丁寧な回答ありがとうございます。
ユーザー定義関数のことについては、過去ログなどにも
触れられ、他のサイトでも触れられていたのですが
よくわからなかったのです。rooksanのとおりにやってみます。
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 に行数を入れるようなスタイルがよいのかもしれません。
ありがとうございます。
実際のところ、私も、マクロは使いたくないのです。
実際に、上記のデータ以外にも、入所されている方のデータは
たくさんあり、入所者のデータベースは横に長いデータベース
になります。実際には、それの簡便に行う関数は全て作ってあり
自分で操作をする分には何の支障も無いのですが、私以外の
人が使えないというデメリットがあります、誰でもデータの
入力と、変更を行えるものを作る必要があったのです。
私の職場では、エクセルの罫線を引くのもままならない人がいるので・・・
gyouをどうするのかが不明確というのは、指摘いただいて、気がつき増した。実際には、
私は『すっきりわかったエクセルVBAマクロ作成のつぼ』などの
本に準拠して作ったのですが、
private sub commanndbutton_click()
gyou=cells(1.1)'行の番号が表示されているセル
gyou=gyou+1
とし、ボタンを押すたびに、表示される行が変わっていくように作っていました。
ご指摘に答えられたかどうかも自信がありませんが、これからも
学習していきます。
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を表示しますが。
ありがとうございます。
datedifを使うのが一番便利で楽なのですけれど
私以外の人はあまり、パソコンを使えないのです…
全部私が、パソコン仕事をするとだんだんつらくなってきたので
どうしてもマクロを使ってほぼすべてを児童で処理させたかったのです。コピーがずれると直すのが私の役目になってしまうので・・・
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
ありがとうございます。
早速試してみます。
Cells(gyou, 4).Value = DateDiff("yyyy", Cells(gyou, 2).Value, Cells(gyou, 3).Value)は、私も普通に組めたのですが、
下の式の意味がわからないので、少し研究してみます。
どうしても、ほぼ自動でできて、しかも直感的にわかるフォームを
作らないと、永遠に、パソコンの仕事から解放されないので…
がんばって覚えます。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 会社・職場 Excel、Googleスプレッドシートなどへのデータ入力 2 2023/07/06 05:59
- 電車・路線・地下鉄 「大人の休日倶楽部ジパング」の「夫婦会員」入会資格 姉さん女房だけ優遇 変じゃないですか? 2 2022/10/08 22:31
- その他(IT・Webサービス) どうしよつ高校生なのにGoogleアカウントの年齢7歳にしてしまいました スマホやGoogleは何年 3 2022/11/04 22:43
- 国民年金・基礎年金 年金繰り上げに関する相談 9 2022/11/17 16:29
- Excel(エクセル) Excelの関数 5 2023/07/07 05:26
- 電車・路線・地下鉄 大人の休日倶楽部ジパングの入会資格、男性65歳以上 女性60歳以上 男性差別では? 1 2022/04/05 00:48
- 国民年金・基礎年金 老齢基礎年金が追納できない根拠は? 2 2022/07/25 14:10
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- JavaScript 質問すいません。 javascriptの質問で、 人物4名、名前と年齢をオブジェクトと指定し人物1人 2 2022/06/26 22:08
- Excel(エクセル) Excelへのデータ入力作業 4 2023/07/01 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
重度知的障害者の姉
-
施設での掲示物の貼り方
-
介護老人保健施設退所後 再入所...
-
DVシェルターに一時保護で滞在...
-
特別養護老人ホームへ看取りを...
-
デイサービスを受けるには市が...
-
突然の親戚の訃報
-
特養空床利用について
-
20年後に老人ホーム入居を希望...
-
中学校の集団風呂で水滴検査は...
-
温浴施設の家族風呂って、一般...
-
市販の入浴剤で、何の香りが一...
-
グループホームに入居している...
-
特養における預金通帳の管理に...
-
人が入浴中に脱衣所に入ってく...
-
実家の母が祖母との関係につい...
-
お風呂を覗かれている気がする
-
親の保険証から子供の事はわか...
-
介護施設での入浴回数
-
風呂に入る国と入らない国の文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
介護老人保健施設退所後 再入所...
-
特別養護老人ホームのショート...
-
施設での掲示物の貼り方
-
DVシェルターに一時保護で滞在...
-
就労継続支援A型作業所の違反...
-
短期入所事業の併設型、空床型...
-
育児休業に関する厚労省の通達...
-
介護施設への支払いが現金か現...
-
特別養護老人ホームの入所につ...
-
病院へ入院・施設へ入所などの...
-
特養での入所前面接終了後の待機
-
保育園最後の年にリストラによ...
-
特養乳中の入院は、施設代をす...
-
介護施設での物販&販売会
-
特別養護老人ホームへ看取りを...
-
介護老人保健施設の3ヶ月間で...
-
老健の短期集中リハ加算について
-
特別養護老人ホームへの入所
-
敬老会
-
エクセルのマクロでの満年齢お...
おすすめ情報