VBで生年月日からの年齢換算の方法が分からず困っています;;

やりたいことは
1886/01/22 などの生年月日文字列 → 23歳3ヶ月26日のように年齢に換算するという内容です。

うるう年や各月の日数の違いなどを考慮し始めるとどんどんこんがらがってきて大変困っています。
だれか詳しい方がおりましたらご教授いただけないでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

年齢というのは、ふつうは「歳」までで、「月数・日数」が必要なことは非常に稀です。

「歳」までなら、極めて簡単なのですが、ご質問の趣旨は「月数・日数」を必要とされるのですね。この場合は、#1さんが言われるように、多少のドロ臭さは我慢します。

今日がy/m/dで、生年月日がy0/m0/d0とします。
m>=m0、d>=d0 なら「超簡単」ですよね。
次に、m<m0なら、y0に1を加え、m0から12を引きます。
さらに、d<d0なら、m0に1を加え、d0から「月内日数」を引きます。

この「月内日数」は、y0、m0によって28~31の間で変動します。この値を求めるための非常に簡単なアルゴリズムがあるのですが、ご自分で工夫してもできるでしょう。2000年が「うるう年」でしたから「グレゴリオ補正」は、してもしなくてもいいでしょう。

上記の処理ができれば、あとは(y-y0)歳(m-m0)月(d-d0)日で求められます。
    • good
    • 0

質問はVB6(VBA)かVB.NET系統か書いてありますか。

コードを左右するのでは。VBは今はVB2008などに決まっていると言えるのかな。
ーーーーー
Googleで「b.net 年齢計算」で照会すれば、記事がそこそこ出るじゃない。それさえやってないのでは。
http://7ujm.net/etc/age.html
参考
http://www5b.biglobe.ne.jp/~yone-ken/VB/Func/vbT …
http://homepage1.nifty.com/rucio/main/dotnet/Sam …
http://jeanne.wankuma.com/tips/vb.net/datetime/
    • good
    • 0

まず、基本と例外をごちゃ混ぜにしていっぺんに考えるとややこしくて仕方ないと思います。


まずは基本的なやりかた(たとえば2008年10月2日生まれで2009年11月1日なら・・とか、9/10なら・・とか)ではどう計算するのか考えます。

次に例外となる状態を一つずつ整理してリストアップしていきます。
多分面倒なのは月末の処理ですよね?
10月31日生まれで11月30日なら一ヶ月なのか30日なのか
10月31日生まれで12月1日なら一ヶ月+1日とみなすのかどうか
9月30日生まれで10月30日なら一ヶ月なのか31日なのか
9月30日生まれで10月31日なら一ヶ月なのか一ヶ月と1日なのか

思いつくパターンを全部拾い上げて、どうするのが良いのかを決めていくことでしょう。面倒臭がらずにとにかく思いつくものをきちんとリストアップして対処方法を決めていくことです。なるべくシンプルになるように決めるほうが良いでしょうね。
これが決まったら、先ほどの基本プログラムの中で「例外処理」として埋め込んでいけば良いわけですね。多少泥臭い判定方法でも良いと思いますよ。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QVBでの簡易電卓の作成(減算方法)で困っています。

技術評論社のVisual Basic5.0入門編という、
参考書を見ながら、作成したのですが。
どうも、参考書のコードが間違っているみたいでした
良かったら、お知恵をお貸しください。
とりあえず、足し算と引き算処理の作成です。

※使用コントロール
0から9までのコマンドボタンをコントロール配列と、
足し算、引き算、クリアーのコマンドボタンが3つ、
後、数字入力用のテキストボックスが1つです。


コード
****************************************************

Option Explicit
Dim EnterFlag As Boolean 'プラス、マイナスキーが押された直後ならTrueを示すフラグ。
Dim S As Long


Private Sub Command3_Click() 'クリアーボタン
Text1.Text = ""
S = 0
End Sub

Private Sub Plas_Click() '加算処理
S = S + Val(Text1.Text)
Text1.Text = S
EnterFlag = True
End Sub

Private Sub Mainas_Click() '減算処理
S = S - Val(Text1.Text)
Text1.Text = S
EnterFlag = True
End Sub

Private Sub Form_Load()
Text1.Text = ""
S = 0
End Sub

Private Sub key_Click(Index As Integer)
If EnterFlag Then
Text1.Text = ""
EnterFlag = False
End If

If Len(Text1.Text) < 10 Then '10桁以内のとき
Text1.Text = Text1.Text & Index
End If

End Sub

*********************************************************

とこんな感じです。
加算処理は、上手くできますが。
減算処理は、明らかにコードが間違っていると思いました。
初めて(1回目)マイナスボタンを押した時に、変数Sには、必ずマイナス
が入ってしまう状態です。

上手く減算処理出来る方法のアドバイスよろしくお願いします。

技術評論社のVisual Basic5.0入門編という、
参考書を見ながら、作成したのですが。
どうも、参考書のコードが間違っているみたいでした
良かったら、お知恵をお貸しください。
とりあえず、足し算と引き算処理の作成です。

※使用コントロール
0から9までのコマンドボタンをコントロール配列と、
足し算、引き算、クリアーのコマンドボタンが3つ、
後、数字入力用のテキストボックスが1つです。


コード
****************************************************

Option Explicit
Dim Ente...続きを読む

Aベストアンサー

これは、業務用でよく使われる電卓と同じ仕様ですね。
初めてマイナスを押したときに結果がマイナスになるのは正しい動作です。
どういう理由だったか忘れましたが、この方が効率が良い場合があるので
先に数値、その次に演算という入力順序になっているそうです。

それはさておき、普通の電卓と同じ処理をしたいのであれば、
一つ前に押された演算キーを記憶しておいて、新しい演算キーが押されたときに
一つ前の演算を処理する、というような流れになるのではないかと思います。
そうすると、Plas_Click、Mainas_Clickも変更が必要で、演算自体は
一つ前の演算処理、演算子を新しく自分のものに更新する。

Private Sub Plas_Click() '加算処理
 select case <演算子>
  case 1
   S = S + Val(Text1.Text)
   Text1.Text = S
  case 2
   S = S - Val(Text1.Text)
   Text1.Text = S
end select
 EnterFlag = True
 <演算子>=1
End Sub

といった感じでしょうか?
とりあえず、ぱっと思いついただけなので他にも良い方法があるかもしれません。
がんばってください。

これは、業務用でよく使われる電卓と同じ仕様ですね。
初めてマイナスを押したときに結果がマイナスになるのは正しい動作です。
どういう理由だったか忘れましたが、この方が効率が良い場合があるので
先に数値、その次に演算という入力順序になっているそうです。

それはさておき、普通の電卓と同じ処理をしたいのであれば、
一つ前に押された演算キーを記憶しておいて、新しい演算キーが押されたときに
一つ前の演算を処理する、というような流れになるのではないかと思います。
そうすると、Plas_Clic...続きを読む

Q実数の整数部,小数部の取得

OS:windows2000pro
VB:VB6.0sp5

実数 num(変数) [as currency]
 (但し 小数点以下2位まで)の値の
1.整数部 num_int(変数) [as long]
2.小数部 num_dec(変数) [as long]
を上記変数に格納するのは、どのようにすればいいのでしょうか?

(例1)num = 123.02 の場合、num_int=123, num_dec=2
(例2)num = 4.20 の場合、num_int= 4, num_dec=20
(例3)num = 0.23 の場合、num_int= 0, num_dec=23

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

Aベストアンサー

VB6ならこうです。
num_int = Fix(num)
num_dec = 100 * (num - num_int)

QTextBoxに半角数字のみの入力しかできないようにしたい

タイトルどおりです。
フォームに貼り付けた、TextBoxに、半角数字のみしか入力できないようにしたいです。
000000~999999までのコード(数字)を入力させるようにするわけですが、そのままだと半角英数も全角も入力できてしまいます。

GrapeCity社製のカスタムコントロール「InputMan」の“Number”を用いると簡単なのですが、これだとカーソルがボックス内の右端にきて、一の位から入力が始まってしまいます。
数字は、ボックス内の左側から入力されていくようにしたいのですが、“Number”だとなんか出来なさそう・・・?
(“Number”で左側から入力できるならそれがいいのですが)

そこで、TextBoxを使うことにしたのですが、TextBoxだと、半角数字のみしか入力できないような制限がかけるのかが、わかりません。

もし、お分かりの方がいらっしゃいましたら、ご教授下さいませ。

Aベストアンサー

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ' Ctrl + V
Case &H18 ' Ctrl + X
Case &H1A ' Ctrl + Z
Case Else
KeyAscii = 0
End Select
End Sub

で、いかがでしょうか。

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ...続きを読む

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

QVB.NETの配列にExcelから読み込んできたデータを格納したい

今回もお世話になります。
VisualBasic.NETでプログラムを作っています。
Excelからデータを読み込んで配列に格納したいのですが、どうしてもうまくいきません。
原因とその解決法を教えていただけないでしょうか?
また、他の解決法や参考にできるサイトがあれば教えていただきたいです。
Excel,VB.NETともに2003を使っています。


以下エラー内容
--------------------
'System.NullReferenceException' のハンドルされていない例外が 重度障害者用入力装置自動選択システム.exe で発生しました。
追加情報 : オブジェクト参照がオブジェクト インスタンスに設定されていません。
--------------------


以下ソースです
--------------------
Option Explicit On
Imports Microsoft.Office.Interop

Public Class Form2
Inherits System.Windows.Forms.Form


Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim xl As Object 'Excel.Application
Dim wb As Object 'Excel.Workbook
Dim ws As Object 'Excel.Worksheet

xl = CreateObject("Excel.Application")
 wb = xl.Workbooks.Open("C:\abc.xls")
xl.Visible = True

ws = wb.Worksheets("Sheet1")

配列(1, 1, 1) = xl.Cells(2, 1).Value←ここでエラーが出る
配列(1, 1, 2) = xl.Cells(2, 2).Value
配列(1, 1, 3) = xl.Cells(2, 3).Value

状態表示テキストボックス.Text = "配列(1, 1, 1) = " & 配列(1, 1, 1) & "と" _
& "配列(1, 1, 2) = " & 配列(1, 1, 2) & "と" _
& "配列(1, 1, 3) = " & 配列(1, 1, 3)

xl = Nothing
wb = Nothing
ws = Nothing

End Sub
End Class
--------------------
回答よろしくお願いします。

今回もお世話になります。
VisualBasic.NETでプログラムを作っています。
Excelからデータを読み込んで配列に格納したいのですが、どうしてもうまくいきません。
原因とその解決法を教えていただけないでしょうか?
また、他の解決法や参考にできるサイトがあれば教えていただきたいです。
Excel,VB.NETともに2003を使っています。


以下エラー内容
--------------------
'System.NullReferenceException' のハンドルされていない例外が 重度障害者用入力装置自動選択システム.exe で発生しました。
...続きを読む

Aベストアンサー

こんにちは

********引用*******
の部分で「型excel.Applicationが定義されていません」というエラーが出てしまいます。
*******************

私の場合、参照設定が、上手くいっていないと
このエラーが出るみたいです。

プロジェクトのプロパティを見て、
参照設定を見て、エクセルのオブジェクトライブラリーが追加されているか??
確認してみてください。

QVBAにてデータが数字か文字かを判定するには

VBAにてデータが数字か文字かを判定するには、
どうすれば良いのでしょうか?

文字数は任意で決まっていません。


123 ← 数字
あい ← 文字
1F  ← 文字
G  ← 文字

Aベストアンサー

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Then
  MsgBox "文字列"
 Else
  MsgBox "その他" '代表的なものはエラー値です
 End If
End Sub

-----------------------------------------
こちらの場合は、全角数字も、数字として扱われます。

Sub Test2()
 If IsNumeric(Range("A1").Value) Then
   MsgBox "数字"
 Else
   MsgBox "数字ではない"
 End If
End Sub

こんにちは。

数字か文字かなら、IsNumeric でよいと思いますが、数値か文字かでしたら、VarType を使います。私の場合は、IsNumericは、めったに使いません。VarTypeのほうが多いですね。IsNumeric は、文字通り、文字か数字かで、文字列書式の数字も含まれます。なお、VBAでは、数字は、数値型に型キャストされますので、特に問題は発生しません。

ご参考までに。

Sub Test()
 If VarType(Range("A1").Value) = vbDouble Then
  MsgBox "数値"
 ElseIf VarType(Range("A1").Value) = vbString Th...続きを読む

QVBで既存エクセルシートを新規ブックにコピー

VB6,Excel2003です。
既存のエクセルシートを新規ブックにコピーする
プログラムを作成してみましたが
タスクバーに新規ブックのタスクバーボタンが2つできてしまいます。
どこが原因か教えてください。よろしくお願いします。

Private Sub Command1_Click()
Dim xlsApp As Excel.Application
Dim xlsBookTemp As Excel.Workbook 'コピー元ブック
Dim xlsBookCopy As Excel.Workbook 'コピー先ブック
Dim xlsSheetTemp As Excel.Worksheet 'コピー元シート
Dim xlsSheetCopy As Excel.Worksheet 'コピー先シート

Set xlsApp = CreateObject("Excel.Application")
Set xlsBookTemp = xlsApp.Workbooks.Open("C:\Temp.xls")
Set xlsSheetTemp = xlsBookTemp.Sheets(1)
Set xlsBookCopy = xlsApp.Workbooks.Add
Set xlsSheetCopy = xlsBookCopy.Sheets(1)

xlsApp.Visible = True
'コピー元のSheet1を新規ブックにコピーする
xlsSheetTemp.Copy Before:=xlsSheetCopy
'コピー元のブックは閉じる
xlsBookTemp.Close

'///新規ブックの編集処理///

Set xlsSheetTemp = Nothing
Set xlsBookTemp = Nothing
Set xlsSheetCopy = Nothing
Set xlsBookCopy = Nothing
Set xlsApp = Nothing
End Sub

VB6,Excel2003です。
既存のエクセルシートを新規ブックにコピーする
プログラムを作成してみましたが
タスクバーに新規ブックのタスクバーボタンが2つできてしまいます。
どこが原因か教えてください。よろしくお願いします。

Private Sub Command1_Click()
Dim xlsApp As Excel.Application
Dim xlsBookTemp As Excel.Workbook 'コピー元ブック
Dim xlsBookCopy As Excel.Workbook 'コピー先ブック
Dim xlsSheetTemp As Excel.Worksheet 'コピー元シート
...続きを読む

Aベストアンサー

またまた登場、onlyromです。

>'///新規ブックの編集処理///の中には今は何も記入していません
>VBを終了してやりなおすと、2つ表示されてしまいました

おかしいですね。
ということでブレークポイントをセットしてどこでそうなるかみてみないと。

Set xlsApp = CreateObject("Excel.Application")
▲▲xlsApp.Visible = True
Set xlsBookTemp = xlsApp.Workbooks.Open("C:\Temp.xls")
Set xlsSheetTemp = xlsBookTemp.Sheets(1)
●●Set xlsBookCopy = xlsApp.Workbooks.Add
Set xlsSheetCopy = xlsBookCopy.Sheets(1)

'コピー元のSheet1を新規ブックにコピーする
xlsSheetTemp.Copy Before:=xlsSheetCopy
'コピー元のブックは閉じる
●●xlsBookTemp.Close


▲▲のところに、xlsApp.Visible = True を移動
●●のところに、ブレークポイント

少なくともこれでどの時点で、質問の件が起こるかわかりますよね。


そしてそれが済んだら、
ブレークポイントを外して、
▲▲xlsApp.Visible = True を
●●xlsBookTemp.Close の後に移動
要するにコピーが済んでTempをクローズしてから、ExcelをActiveにするということです。

以上2つを試してみてください。
 

またまた登場、onlyromです。

>'///新規ブックの編集処理///の中には今は何も記入していません
>VBを終了してやりなおすと、2つ表示されてしまいました

おかしいですね。
ということでブレークポイントをセットしてどこでそうなるかみてみないと。

Set xlsApp = CreateObject("Excel.Application")
▲▲xlsApp.Visible = True
Set xlsBookTemp = xlsApp.Workbooks.Open("C:\Temp.xls")
Set xlsSheetTemp = xlsBookTemp.Sheets(1)
●●Set xlsBookCopy = xlsApp.Workbooks.Add
Set xlsSheetCopy = x...続きを読む

QDataGridViewの特定列に入力されている重複チェックをしたい

VisualBasic2005です。
例えばDataGridViewの3列目にコードが入力されるとします。
その列のコードには重複入力をさせたくないのです。

重複チェックをするのは、そのセルの入力が確定したときでも、
特定のボタンが押されたときでもかまわないので、
チェックする方法はないでしょうか?

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

Aベストアンサー

そのDataGridViewはDataTableをバインドしてますか?
もしそうなら、DataTableの方で重複をさせたくない列を主キーに設定すれば、重複値を入力したときエラーがでるようになります。
主キーの設定の仕方は例えば
'dtはDataTable
dt.PrimaryKey = New DataColumn() {dt.Columns(2)}

Qエクセルで、列内が同じ名前を集計する方法は?

エクセルで以下のような表を作成したとします。

      A列   B    C    D
 1行   名前   項目   金額
 2    すずき  あいう  100
 3    すずき  かきく  200
 4    すずき  さしす  450
 5    さとう  あいう  150
 6    さとう  さしす  200
 7    はやし  あいう  250 
 8    はやし  かきく  170
 9    はやし  たちつ  980

B列の名前が同じ者の、金額の合計をD列に出したいのです。
D4に すずきの合計 750、D6にさとうの合計 350、
D9にはやしの合計 1150  というふうに。
全部で100人分位、データ行数は15000ほどあるのですが
これをさっとできるようにはどのようにしたら良いのでしょうか?

Aベストアンサー

次の方法は如何でしょうか。
D2に=IF(COUNTIF(A:A,A2)=COUNTIF($A$2:A2,A2),SUMIF(A:A,A2,C:C),"")を入力→D2を選択→フィルハンドル(D2セル枠右下の■)をダブルクリック
但し、C列途中に空白がある場合、その直前までしかコピーされませんので、空白セル前のセルを下方向にコピー後、同様にフィルハンドルをダブルクリックし下さい。


人気Q&Aランキング