• 締切済み

Accessのフォームのオープンのコマンド。

テーブル1 ・名前 ・誕生日 ・年齢 フォーム1 ・名前 ・誕生日 ・年齢 ・コマンドボタン コマンドボタンのコード Private Sub コマンド6_Click() Age_Keisan End Sub 関数Age_Keisanのコード Private Sub Age_Keisan() Dim Age As Integer Dim Birth_Y As Integer Dim Birth_M As Integer Dim Birth_D As Integer Dim Now_Y As Integer Dim Now_M As Integer Dim Now_D As Integer Birth_Y = Left([誕生日], 4) Birth_M = Right(Left([誕生日], 7), 2) Birth_D = Right([誕生日], 2) Now_Y = Left(Date, 4) Now_M = Right(Left(Date, 7), 2) Now_D = Right(Date, 2) Select Case Birth_M Case Is < Now_M Age = Now_Y - Birth_Y Me![年齢] = Age Case Is > Now_M Age = Now_Y - Birth_Y - 1 Me![年齢] = Age Case Is = Now_M Select Case Birth_D Case Is <= Now_D Age = Now_Y - Birth_Y Me![年齢] = Age Case Is > Now_D Age = Now_Y - Birth_Y - 1 Me![年齢] = Age End Select End Select End Sub となっています。 これですと、年齢を入れて、ボタンを押さないと誕生日が過ぎた場合、年齢が増えていきません。 クエリーを使用してフォームをつくればよかったのですが、テーブルから直接フォームを作成しているので 計算もできません。 できればフォームのオープンコマンドに上記のボタンと同じような機能を入れたいのですが、 どのようにすればいいのでしょうか?

みんなの回答

  • ryuu001
  • ベストアンサー率61% (46/75)
回答No.4

まだ締め切られていませんが、 何か 分からないことございますか?

  • ryuu001
  • ベストアンサー率61% (46/75)
回答No.3

> 1番最初に出てくるレコードと、レコード移動して見てみたものしか 変らないんですよね? レコード数は 1件ではないのですか? KODAMARさんの コードでは 複数レコードに対応されていないようです。 複数レコード対応にするには、yoishoさんの方法とか、 recordsetを使い、レコードの最初から最後まで読む方法をとります。 yoishoさんの ***具体的には、*** のところが良いと思います。 参考までに、recordset を使用する場合の例を書きます。 フォームを開いたときのイベントです。 Private Sub Form_Open(Cancel As Integer) Dim Db As DAO.Database Dim Rs As DAO.Recordset Set Db = CurrentDb() Set Rs = Db.OpenRecordset("テーブル1") Rs.MoveFirst Do Until Rs.EOF = True Rs.Edit Rs!年齢 = Int(DateDiff("d", Rs![誕生日], Now()) / 365) Rs.Update Rs.MoveNext Loop Rs.Close Set Rs = Nothing Db.Close Set Db = Nothing End Sub

  • yoisho
  • ベストアンサー率64% (331/516)
回答No.2

単にフォーム上の表示だけの目的でしたら、 フォーム1の [年齢] テキストボックスのコントロールソースを (テーブル1の [年齢] フィールドではなくて、) =Int(Format(Date(),"yyyy\.mmdd")-Format([誕生日],"yyyy\.mmdd")) としてやれば、現在の年齢が表示できると思います。 テーブル1 の [年齢] フィールドの値は [誕生日] の値から一意に決まります(しかも現在の日付によって変動する)ので、あえてフィールドとして持つ必要はないと思うのですが、 もし、その後の計算の簡略化等の目的で、どうしても必要なら、 フォーム1の Openイベントで、(更新クエリーのSQLを利用して)テーブル1の [年齢] の値の更新を行えば、全ての年齢データの更新が可能だと思います。 具体的には、 Private Sub Form_Open(Cancel As Integer) DoCmd.RunSQL "UPDATE テーブル1 SET テーブル1.年齢 = " _ & "Int(Format(Date(),""yyyy.mmdd"")-Format([誕生日],""yyyy.mmdd""))" End Sub または、(むしろ、こっちの方がわかりやすいでしょうか?) DoCmd.RunSQL "UPDATE テーブル1 SET テーブル1.年齢 = " _ & "IIf(Format([誕生日],""mm/dd"")<=Format(Date(),""mm/dd"")," _ & "DateDiff(""yyyy"",[誕生日],Date()),DateDiff(""yyyy"",[誕生日],Date())-1)"

  • ryuu001
  • ベストアンサー率61% (46/75)
回答No.1

フォーム オープン時のイベントに登録します。 フォーム のプロパティの イベントに ”開く時”があります。 そこを [イベント プロシージャ]にして vbaにコードを書けばOKです。

KODAMAR
質問者

お礼

回答ありがとうございます。 フォームの「開く時」に質問文で書いたコード、もしくは 「Age_Keisan」といれてフォームを開くと 実行時エラー'2448': このオブジェクトに値を代入することはできません。 と出てしまうのです。 仕方ないので、フォームの読み込み時とレコード移動時に 「Age_Keisan」としてみたのですが、これですと、 1番最初に出てくるレコードと、レコード移動して見てみたものしか 変らないんですよね? それだともしかしたら洩れがあるかもしれないのでなんとか 「開く時」のイベントで何とかできないかと思っているのですが。 よろしくお願いします。

関連するQ&A

  • access 自作関数をフォームで使うとき

    お世話になります。 ACCESS2000でシステムを作っています。 商品コードを年・月をコード化したものに、日付2ケタを足したものを作成する scdという関数を作り、フォームのフィールドに、表示したのですが、 #Name!?と表示されていうまくいきません。 どうすればいいですか? 関数は以下のようになっています。 Public Function scd() As String Dim hiduke As Date Dim yc As String Dim mc As String Dim dc As String Dim strtmp As String hiduke = Date '年コードを設定 Select Case Year(hiduke) Case Is = 2012 yc = "a" Case Is = 2013 yc = "b" Case Is = 2014 yc = "c" Case Is = 2015 yc = "d" Case Is = 2016 yc = "e" Case Is = 2017 yc = "f" Case Else MsgBox "年コードを追加してください" End Select '年コードを設定 Select Case Month(hiduke) Case Is = 1 mc = "a" Case Is = 2 mc = "b" Case Is = 3 mc = "c" Case Is = 4 mc = "d" Case Is = 5 mc = "e" Case Is = 6 mc = "f" Case Is = 7 mc = "g" Case Is = 8 mc = "h" Case Is = 9 mc = "i" Case Is = 10 mc = "j" Case Is = 11 mc = "k" Case Is = 12 mc = "l" End Select '日付を設定 dc = Format(hiduke, "dd") strtmp = yc & mc & dc scd = strtmp End Function

  • 日付からの曜日取得

    VB6を使っています。 取得した年月の一日の曜日を取得したいのですが うまくできません。formatもなぜかエラー出るんです・・・ どなたか教えてください Dim dtCurrent As Date Dim y As Integer Dim m As Integer Dim j as string Dim nWeek As Integer j=DateTime.Date() y = Mid(j, 1, 4)'年 m = Mid(j, 6, 2)'月 dtCurrent = Format(y&m&01, yyyy / mm / dd) Week = Weekday(dtCurrent) - 1 '曜日取得

  • VB2005 図形

    VisualBasic2005で Dim n As Integer, m As Integer Dim i As Integer, j As Integer Const lenn = 1500, PAI = 3.14159 Dim th As Single, th1 As Single, th2 As Single Dim x1 As Integer, x2 As Integer Dim y1 As Integer, y2 As Integer n = Val(TextBox1.Text) m = Val(TextBox2.Text) If n < 2 Or m < 2 Then   Exit Sub End If For i = 0 To n - 1   For j = 1 To n - 1     th = j * (PAI / n)     th1 = i * (PAI / m) + th     th2 = i * (PAI / n) - th     x1 = Math.Cos(th1) * lenn + 2000     y1 = Math.Sin(th1) * lenn + 2000      x2 = Math.Cos(th2) * lenn + 2000      y2 = Math.Sin(th2) * lenn + 2000   Next Next の様なコードを使って 球をPictureBoxに書きたいのですが どこにどんなコードが足りないのでしょうか? 教えて下さい

  • エクセル2010のコマンドボタンついて

    MouseDownイベントでループ(Doなど)をさせた後 MouseUpイベントでStopさせるコードを作りましたが MouseUpイベントまで行かずずっとループしてしまいます (押されている間はボタンが凹んでいますが このコードにすると凹まず中断しないと 動かせないようになってしまいます) 何が原因がわからないので回答お願いします 下はコードです Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) Select Case Button Case 1 Range("A1") = 1 Case 2 Range("A1") = 3 End Select Do Range("A1") = Range("A1") + Range("A1") Loop End Sub Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single) Stop End Sub (Select Case Button Case 1...にしても変わりませんでした)

  • 変数にフォームからの入力値は入るのですが。

    変数にフォームからの入力値は入るのですが。 VBA初心者です。下記コードを書きました。 フォームからの入力値をレポート印刷しようとしています。 MSGBOXで内容を参照したところ、変数の内容は入っています。 入っているのですが、レポート上、項目が#Errorになってしまいます。 どこが悪いのでしょうか?。 お分かりになる方でおみえならご教授下さい。 Option Explicit '共通変数の宣言 Dim stdocname As String Dim repo As Report Dim delt As String Dim kmsg As String        :        :        : Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim tuki As String Dim mais As Integer Dim denp As Integer Dim busu As Integer Dim joge As String Dim kmsg As String '*** 変数に入力値をセット mais = 0 delt = Forms!メイン画面![リストDELTUKI] joge = Forms!メイン画面![リストJYOGEDAN] tuki = Forms!メイン画面![リストTUKI] denp = Forms!メイン画面![テキストSBAN] busu = Forms!メイン画面![テキストEBAN] '*** 消し月と印刷月重複不可チェック If delt = tuki Then GoTo Err_印刷月_Click End If '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" Case "上段" & "2" stdocname = "レポート02上" Case "上段" & "3" stdocname = "レポート03上"        :        :        : Case "下段" & "10" stdocname = "レポート10下" Case "下段" & "11" stdocname = "レポート11下" Case "下段" & "12" stdocname = "レポート12下" Case Else stdocname = "レポート原稿" End Select kmsg = MsgBox(joge & tuki & stdocname)

  • 変数にフォームからの入力値が入らない。

    変数にフォームからの入力値が入らない。 VBA初心者です。下記コードを書きました。 フォームからの入力値をレポート印刷しようとしています。 MSGBOXで内容を参照したところ、JOGEしか入っていませんでした。 どこが悪いのでしょうか?。 お分かりになる方でおみえならご教授下さい。 Option Explicit '共通変数の宣言 Dim stdocname As String Dim repo As Report Dim delt As String Dim kmsg As String        :        :        : Private Sub 印刷_Click() On Error GoTo Err_印刷_Click '*** 変数の宣言 Dim tuki As String Dim mais As Integer Dim denp As Integer Dim busu As Integer Dim joge As String Dim kmsg As String '*** 変数に入力値をセット mais = 0 delt = Forms!メイン画面![リストDELTUKI] joge = Forms!メイン画面![リストJYOGEDAN] tuki = Forms!メイン画面![リストTUKI] denp = Forms!メイン画面![テキストSBAN] busu = Forms!メイン画面![テキストEBAN] '*** 消し月と印刷月重複不可チェック If delt = tuki Then GoTo Err_印刷月_Click End If '*** 上段・下段使用と対象月から使用レポートを判定 Select Case joge & tuki Case "上段" & "1" stdocname = "レポート01上" Case "上段" & "2" stdocname = "レポート02上" Case "上段" & "3" stdocname = "レポート03上"        :        :        : Case "下段" & "10" stdocname = "レポート10下" Case "下段" & "11" stdocname = "レポート11下" Case "下段" & "12" stdocname = "レポート12下" Case Else stdocname = "レポート原稿" End Select kmsg = MsgBox(joge, tuki, stdocname)

  • EXCELの列複数削除

    VB6.0で開発しています。 下のようにEXCELの列を複数削除していますが 思うように削除されません。 削除はされるのですが B列を削除してから次C列を削除となってしまっているので C列を削除する時は元々のC列ではなく B列を削除してからのC列を削除してしまいます。 どう直せばいいのでしょうか? お願いします。 Private Sub Command2_Click() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim B As Integer Dim C As Integer Dim D1 As Integer Dim E As Integer Dim G As Integer Dim H As Integer Dim K As Integer Dim L As Integer Dim M As Integer Dim N As Integer Dim P As Integer Dim R As Integer Dim T As Integer Dim U As Integer Dim V As Integer Dim Y As Integer Dim Z As Integer Dim AA As Integer Dim AB As Integer Dim AC As Integer Dim AD As Integer Dim AE As Integer Dim AF As Integer Dim AG As Integer Dim AH As Integer Dim AI As Integer Dim AJ As Integer Dim AL As Integer Dim AM As Integer Dim AP As Integer Dim AQ As Integer Dim AR As Integer Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("C:\Users\maki\Documents\Book1") Set xlSheet = xlBook.Worksheets("Sheet1") xlApp.Visible = True B = 2 C = 3 D1 = 4 E = 5 G = 7 H = 8 K = 11 L = 12 M = 13 N = 14 P = 16 R = 18 T = 20 U = 21 V = 22 Y = 25 Z = 26 AA = 27 AB = 28 AC = 29 AD = 30 AE = 31 AF = 32 AG = 33 AH = 34 AI = 35 AJ = 36 AL = 38 AM = 39 AP = 42 xlSheet.Cells(1, C).EntireColumn.Delete xlSheet.Cells(1, D1).EntireColumn.Delete xlSheet.Cells(1, E).EntireColumn.Delete xlSheet.Cells(1, G).EntireColumn.Delete xlSheet.Cells(1, H).EntireColumn.Delete xlSheet.Cells(1, K).EntireColumn.Delete xlSheet.Cells(1, M).EntireColumn.Delete xlSheet.Cells(1, N).EntireColumn.Delete xlSheet.Cells(1, P).EntireColumn.Delete xlSheet.Cells(1, R).EntireColumn.Delete xlSheet.Cells(1, T).EntireColumn.Delete xlSheet.Cells(1, U).EntireColumn.Delete xlSheet.Cells(1, V).EntireColumn.Delete xlSheet.Cells(1, Y).EntireColumn.Delete xlSheet.Cells(1, Z).EntireColumn.Delete xlSheet.Cells(1, AA).EntireColumn.Delete xlSheet.Cells(1, AB).EntireColumn.Delete xlSheet.Cells(1, AC).EntireColumn.Delete xlSheet.Cells(1, AD).EntireColumn.Delete xlSheet.Cells(1, AE).EntireColumn.Delete xlSheet.Cells(1, AF).EntireColumn.Delete xlSheet.Cells(1, AG).EntireColumn.Delete xlSheet.Cells(1, AH).EntireColumn.Delete xlSheet.Cells(1, AI).EntireColumn.Delete xlSheet.Cells(1, AJ).EntireColumn.Delete xlSheet.Cells(1, AL).EntireColumn.Delete xlSheet.Cells(1, AM).EntireColumn.Delete xlSheet.Cells(1, AP).EntireColumn.Delete Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing End Sub

  • VB.NETのメモリ領域について

    VB.NETのメモリ領域について 以下の(1)~(12)の変数のために、 スタック領域、静的領域、ヒープ領域のどこのメモリが使われるか教えてください。 Class Sample   Dim a As Integer '(1)   Dim b As String = "BBB" '(2)   Shared c As Integer '(3)   Shared d As String = "DDD" '(4)   Sub X()     Dim f As Integer '(5)     Dim g As String = "GGG" '(6)     Static h As Integer '(7)     Static i As String = "III" '(8)   End Sub   Shared Sub Y()     Dim k As Integer '(9)     Dim l As String = "LLL" '(10)     Static m As Integer '(11)     Static n As String = "NNN" '(12)   End Sub End Class それぞれこんな認識で合ってますか? スタック領域 (1)(5)(9) スタック領域にポインタ+ヒープ領域に実体 (2)(6)(10) 静的領域 (3)(7)(11) 静的領域にポインタ+ヒープ領域に実体 (4)(8)(12)

  • フォームを開いてからの時間を取得

    ウィンドウズを起動してからの経過時間取得のプログラムは下記ようになったのですが・・・VBでつくったフォームを開いたと同時にカウントされるようにコーディングしたいのですがどうしたらよいのでしょうか? 例) Aという名前のフォームを開くと「OO時間OO分OO秒経過」という風にそのフォームのステーラスバーに出そうとしています。 Private Declare Function GetTickCount Lib "kernel32.dll" () As Long Private Sub Timer1_Timer() Dim RetCount As Long Dim h As Integer, m As Integer, s As Integer, ms As Integer RetCount = GetTickCount 'ミリ秒単位で返ってきます ' h = RetCount \ 1000 \ 60 \ 60 m = RetCount \ 1000 \ 60 - h * 60 s = RetCount \ 1000 - (h * 60 * 60 + m * 60) ms = RetCount Mod 1000 Label1.Caption = "経過時間 " & Right(("0" & h), 2) & ":" _ & Right(("0" & m), 2) & ":" & Right(("0" & s), 2) & "." _ & Right(("00" & ms), 3) End Sub

  • 4パタンの置き換え

    dim m as integerという変数があります。 (mの取りうる範囲は1~9です。) このmについて、 7だったら5 6だったら4 3だったら3 2だったら1 (以外はそのまま) と置き換えたいのですが、 ifで4回まわすか、caseを使うかしか考えつきません。 何かいい方法はありますでしょうか。 宜しくお願いします。

専門家に質問してみよう