Accessで家計簿を作成する方法

このQ&Aのポイント
  • Accessを使用して家計簿を作成していますが、変数を抽出条件に用いるクエリの部分がうまくいかず困っています。
  • クリックしてもコンボボックスに何も表示されず、うまくいっていないようです。
  • 解決策を教えていただけると助かります。よろしくお願いします。
回答を見る
  • ベストアンサー

Accessで家計簿

いま下記URLをもとに家計簿を作成しております。 http://cropcrusher.web.infoseek.co.jp/shufuden/windowsfolder/accessx/acs.html#acs00 しかし「変数を抽出条件に用いるクエリ」の部分がうまくいかずこまっています。 以下作成ソース 【Form】 Option Compare Database Private Sub Calendar_GotFocus() Me.Calendar.Visible = True Me.Calendar.Value = Date End Sub Private Sub Calendar_Click() Me.年 = Year(Me.Calendar.Value) Me.月 = Month(Me.Calendar.Value) Me.日 = Day(Me.Calendar.Value) End Sub Private Sub 小分類名_Click() Forms!支出入力フォーム!小分類名.RowSource = "大分類毎小分類" End Sub Private Sub 大分類名_Change() Dim Cls1 As String Cls1 = "" Cls1 = Forms!支出入力フォーム!大分類名.Value Call 大分類で小分類(Cls1) End Sub 【モジュール】 Option Compare Database Function 大分類で小分類(Cls1) Dim dbs As Database, qdf As QueryDef, strSQL As String Set qdf = Nothing DoCmd.Close acQuery, "大分類毎小分類" DoCmd.DeleteObject acQuery, "大分類毎小分類" Set dbs = CurrentDb strSQL = "SELECT 小分類名 FROM 分類関連マスタ WHERE 大分類名" & "=" & Chr$(34) & Cls1 & Chr$(34) & ";" Set qdf = dbs.CreateQueryDef("大分類毎小分類", strSQL) End Function クエリは毎回作成されているのですが、 Private Sub 小分類名_Click() Forms!支出入力フォーム!小分類名.RowSource = "大分類毎小分類" End Sub の部分がうまくいっていないのか、クリックしてもコンボボックスになにも表示されません。長々と申し訳ありません。 もしよろしければどなたか教えてください、宜しくお願いします。

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

>教えていただいたとおりにプログラムを修正してみたのですが、やはり小分類名欄のコンボボックスに表示がでてきません。。 あらら、失礼しました。m(_ _)m プログラム上は問題ないと思うので、他に原因が有るかも・・・ (ちなみに、プログラムはAccess2000で動作確認しました。) >Me!小分類名.RowSource = strSQL この行の前に下記のように一行追加して、SQL文の内容を確認して見て下さい。 MsgBox strSQL Me!小分類名.RowSource = strSQL 出来れば、そのSQL文で新規のクエリを作ってみて、正常か確認してください。  クエリ → 新規作成 → デザインビュー  「テーブルを表示」のウインドウは [閉じる]  表示 → SQLビュー でSQL文を直接記述できます。 >なにか小分類名のプロパティで変更しなければないらない箇所があるのでしょうか 小分類名のコンボボックスで確認するのは 書式 列数 1 書式 列幅 空白 データ 値集合タイプ テーブル/クエリ データ 値集合ソース SELECT [小分類名] FROM 分類関連マスタ; これくらいでしょうか。 値集合ソースの初期値は無くても構わないですが、 取り合えず上記のように入れてみて、全ての小分類名が出るか確認してみて下さい。 >それともなにかデータ側の問題なんでしょうか・・ データの方で確認していただきたいのは、 SELECT [小分類名] FROM 分類関連マスタ; 上記のSQL文でレコードが選択されるかどうかです。

s2ash2007
質問者

お礼

正常に動いてくれました!!何から何まで、ありがとうございました。 原因はプロパティの、 データ 値集合タイプ テーブル/クエリ でした。 元URLでプロパティ側の データ 値集合タイプ データ 値集合ソース は空にしたというような記述があったのでその通りにしていました^^; いままでオラクル、xml、js、asp等のコードベースものしかやってなかったので、こういった画面ベースのものは逆にとっつきにくいですが、勉強と思って完成まで頑張りたいと思います。 本当にありがとうございました!  

その他の回答 (2)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

#1です。1つ説明を忘れていました。これも細かいことですが・・・ >"=" & Chr$(34) & Cls1 & Chr$(34) & ";" この部分のChr$(34)は " ダブルクオーテーションですが、 "= """ & Cls1 & """;" この様に文字列中に入れるときは2つ重ねて "" と書きます。 また、SQL文中の文字列は ' で括ってもいいので、 "= '" & Cls1 & "';" と書いても良いです。 こちらの書き方が一般的だと思います。 "=" & Chr$(34) & Cls1 & Chr$(34) & ";" これも間違いではないですので、お好みで。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

リンク先も拝見しましたが、書いた方も苦労されてた様ですね。 うまく行かないのはやり方を間違えているからです。(^^; RowSourceで参照しているクエリを削除して作り直すのは良くないです。 修正案: ------------------- >Private Sub 小分類名_Click() 使いません。削除 >Private Sub 大分類名_Change() 使いません。削除 「変更時」、ではなく、「更新後処理」のイベントの方が良いので。 >Function 大分類で小分類(Cls1) 使いません。削除。 大分類名の更新後処理のイベントプロシージャを追加 Private Sub 大分類名_AfterUpdate()  Dim Cls1 As String  Dim strSQL As String  Cls1 = "" & Me!大分類名.Value  If Cls1 <> "" Then   strSQL = "SELECT 小分類名 FROM 分類関連マスタ WHERE 大分類名 = """ & Cls1 & """;"  Else   strSQL = "SELECT 小分類名 FROM 分類関連マスタ;"  End If  Me!小分類名.RowSource = strSQL End Sub ------------------- この様に、小分類名.RowSource に直接SQL文を入れることが出来ます。この方が正常に動くと思います。 ついでに、フォーム内では、Me で自分自身のフォームを参照できます。 Forms!支出入力フォーム → Me >Cls1 = Forms!支出入力フォーム!大分類名.Value 細かいことですが、大分類名.Value が Null の場合にエラーになります。 Cls1 = Nz(Me!大分類名.Value,"") とするか、 Cls1 = "" & Me!大分類名.Value こんな感じで Null 対策が必要です。

s2ash2007
質問者

お礼

こんなに長い質問に対し、ご回答頂き、 さらにソースまで書いていただき 本当にありがとうございます。 教えていただいたとおりにプログラムを修正してみたのですが、やはり小分類名欄のコンボボックスに表示がでてきません。。 なにか小分類名のプロパティで変更しなければないらない箇所があるのでしょうか・・・それともなにかデータ側の問題なんでしょうか・・

関連するQ&A

  • Access2007 データ型エラーについて

    お世話になっております。 下記のVBAでコードを数値型からテキスト型に変更したところ、「抽出条件でデータ型が一致しません。」というエラーが出ました。 デバッグをクリックすると、dbs.Execute strSQLの部分が黄色に反転しています。 VBAはあまり詳しくありませんので、エラーが出なくなる方法を教えていただければ助かります。 よろしくお願いいたします。 Private Sub 在庫差引_Click() Dim dbs As Database Dim rst As Recordset Dim strSQL As String Set dbs = CurrentDb Set rst = Me!サブフォーム.Form.RecordsetClone With rst .MoveFirst Do Until .EOF strSQL = "UPDATE マスター " & _ "SET 在庫数 = NZ(在庫数) - " & Nz(!数量, 0) & " " & _ "WHERE コード = " & !コード dbs.Execute strSQL .MoveNext Loop .Close End With End Sub

  • アクセス2000VBA DAOをADOに書き換えてください

    アクセス2000VBA DAOをADOに書き換えてください 下記プログラムをADOに書き換えてください。(DAT1、DAT2はモジュールにて定義してあります) Option Compare Database Dim DBS As Database Dim QDF As QueryDef Dim RST As DAO.Recordset Dim COUNT1 Private Sub Form_Load() On Error Resume Next DAT2 = [Forms]![伝票]![HAKKOU1] Set DBS = CurrentDb Set QDF = DBS.QueryDefs("発行") With QDF .Parameters("DAT1") = DAT2 ’もしかしたら DAT2 ではエラーがでるかもしれません。 Set RST = .OpenRecordset() ’正しい記述を教えてください .Close End With With RST COUNT1 = !指示書 .Close End With

  • アクセス2003でカレンダーコントロールを挿入し、フォームの開くときイ

    アクセス2003でカレンダーコントロールを挿入し、フォームの開くときイベントに、 Private Sub Form_Open(Cancel As Integer) Me.Calendar7.Visible = True Me.Calendar7.Value = Date End Sub と記述しても、当日の日付が表示されません。 原因がわからないのでどなたか教えてください。

  • Access2000のVBAについて

    下記のプログラムだと挿入が可能になります。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,作成日) " _ & " VALUES ('" & Me.社員コード & "', now());" DoCmd.RunSQL strSQL End If End Sub しかし、下記のプログラムだとinsert文の『Me.社員コード』で エラーが発生します。 エラーメッセージは 『メソッドまたはデータメンバが見つかりません』 と表示されます。 上と下とどう違うのでしょうか。 Private Sub 削除_コマンド_Click() If IsNull(Me.社員コード) Then MsgBox ("社員コードが入力されていません") Else Dim strSQL As String strSQL = "INSERT INTO 社員情報テーブル(社員コード,氏名(氏),作成日) " _ & " VALUES ('" & Me.社員コード & "','" & Me.氏名(氏) & "', now());" DoCmd.RunSQL strSQL End If End Sub

  • Access2003とAccess2007の違い

    Access独習者です。 入門書で「物品貸出状況フォーム」を作成しました。 フォーム画面「物品貸出状況一覧表」の下に作ったコンボボックス289「大分類」とコンボボックス291「小分類」で 貸出状況を調べる物品を絞り込み一覧表に取り込みます。 コンボボックス「大分類」「小分類」の値集合ソースはそれぞれ「T_大分類」と「T_小分類」です。 Access2003では下記のコードとコンボボックス291「小分類」の値集合ソースのクエリビルダに組み込んだ 抽出条件「大分類番号[コンボ289]」で絞り込んだ物品が一覧表に表示されたのですが、Access2007では コンボボックス289「大分類」を変更後コンボボックス291「小分類」が更新されません。 Access2003とAccess2007でなにか違いがあるのでしょうか。 お聞きするのに提示すべきコードなどそろっていないかもしれないのですが、ご助言いただければ助かります。 よろしくお願いいたします。 Private Sub コンボ289_AfterUpdate() Me!コンボ291.Requery End Sub Private Sub コンボ291_AfterUpdate() Me.Filter = "小分類番号=" & コンボ291 Me.FilterOn = True End Sub

  • アクセスレポートのグループごとのページ付番について

     Accessレポートのグループごとにおける、ページ付番についてお聞きします。  私なりにインターネットで調べて、下記モジュールを記述しました。レポートの状況は、次のとおりです。 ①グループ化している項目は「全体管理番号」で、ページはページフッターに「GPページ数」名のテキストボックスに表示しています。 ②「Pages」を参照するテキストボックス(コントロールソース =[Pages])を「総ページ取得」名で、ページフッターに非表示配置しています。 ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ Option Compare Database Dim d As Object Dim brk As Variant ------------------------------------------------------------------------------- Private Sub Report_Open(Cancel As Integer) Set d = CreateObject("scripting.dictionary") End Sub ------------------------------------------------------------------------------- Private Sub ページフッターセクション_Format(Cancel As Integer, FormatCount As Integer) If Me.全体管理番号.Value <> brk Then Me.Page = 1 brk = Me.全体管理番号.Value End If If Me.Pages > 0 Then Me.GPページ数 = Me.Page & "/" & d(Me.全体管理番号.Value) & "ページ"  End If End Sub ------------------------------------------------------------------------------- Private Sub 全体管理番号_フッター_Format(Cancel As Integer, FormatCount As Integer) If Me.Pages = 0 Then    d(Me.全体管理番号.Value) = Me.Page End If End Sub -------------------------------------------------------------------------------  この内容で印刷プレビューをした結果、複数ページになる場合は正しく表示になるのですが、複数ページにならない1ページのみの場合はなぜか「1/5ページ」や「「1/3ページ」となり、「1/1ページ」となりません。  「1/1ページ」表示となるようにするには、どこを修正すれば良いかお教え願いたいと思います。 どうぞよろしくお願いいたします。

  • アクセス テーブルリンクのカレンダーコントロール

    受注管理システムを作っています。 カレンダーコントロールについてです。 社内運用上、データを独立?(表現は正しいのでしょうか?)させています。 なので、受注データからプログラムの方へテーブルリンクをしています。 そのせいでしょうか? カレンダーコントロールの日付を受注日に表示させる、という作業が、データをリンクしていない原システムで練習するとできるのに、本番用のテーブルリンクの方のオウログラムでやると、値が表示されません。 解決の方法はございますか? まだまだアクセス初心者です。GOOで教えていただいたり、参考書開き開き独学中です。 ちなみに、こちらです。 Private Sub 受注日_Click() Me.カレンダー.Visible = True '表示 Me.カレンダー.Value = Date '日付規定値 本日 End Sub Private Sub ActiveX_カレンダー_Click() Me.受注日 = Me.カレンダー.Value Me.受注日.SetFocus End Sub Private Sub 営業担当コード_LostFocus() Me.カレンダー.Visible = False '非表示 End Sub

  • 【Access2003】クエリで動作するSQLがVBAで動作せず困っています。

    下記のソースを実行したところ、「パラメータが少なすぎます。2を指定してください。」というエラーが表示されました。 エラーが発生する箇所は「db.Execute strsql」です。 しかし、このstrsqlに書かれているSQL文をクエリで実行した所、問題なく動作しました。 なんとなく、クエリでは書けるものの、VBAでは書きない所があるのかなと思ったのですが、どのように修正すればよいか分かりませんでした。 その為、上記の現象について、ご教示いただける方がいらっしゃいましたら、よろしくお願いします。 【VBA】 Private Sub btn_Click() Dim db As DAO.Database Dim ws As DAO.Workspace Dim str As String Set ws = DBEngine.Workspaces(0) Set db = CurrentDb ' トランザクション開始 ws.BeginTrans strsql = "INSERT INTO T_W ( W_DAY )" strsql = strsql & "SELECT T_M.M_DAY" strsql = strsql & " FROM T_M" strsql = strsql & " WHERE (((Left([T_M].[M_DAY],4) & Mid([T_M].[M_DAY],6,2) & Right([T_M].[M_DAY],2))" strsql = strsql & " Between IIf(Nz([Forms]![F_1]![text_str])='',0,[Forms]![F_1]![text_end])" strsql = strsql & " And IIf(Nz([Forms]![F_1]![text_str])='',99999999,[Forms]![F_1]![text_end])))" strsql = strsql & " ORDER BY T_M.M_DAY" db.Execute strsql ws.CommitTrans End Sub 【フォーム:F_1】 テキストボックス:text_str テキストボックス:text_end コマンドボタン:btn 【データベース:T_M】 フィールド名:M_DAY    値  :2001/01/01    値  :2001/01/02    値  :2001/01/03 (以下略) 【データベース:T_W】 フィールド名:W_DAY    値  :なし よろしくお願いします。

  • Access2007でフォームのリストボックスから

    Access2007でフォームのリストボックスから選択したフィールドをクエリしたいのですが どうもうまくいきません。 テーブル数は10個くらいあり、全テーブルのフィールド数は100超あります。 テーブル1に一意のIDがあり、それに対して他のテーブルとリレーションシップで繋いでいます。 1.全テーブルのフィールドリストを作るのに「全テーブルクエリ」を作成 (テーブル1.IDのLEFT JOINでくっつけています。) 2.全テーブルクエリのコピーを作成し、リストから選択したフィールドのみを表示 3.選択した全フィールドのデータにNull以外のデータのみを表示するようフィルターをかける 以下、作成したVBAですが、実行すると、3.がうまく動いてくれず、Null値も表示してしまいます。 しかし、エラーは出ません。 フィルター適用になっていますが、最後のフィールドにフィルターマークが出ているだけで 実際はかかっていません。。 ========== Option Compare Database Option Explicit Dim dbs As Database Dim qdf As QueryDef Dim IDX As Long 'リストのインデックス用 Dim i As Integer Dim F_name() As String Dim strDate As String '現時刻取得 Dim Path As String Public Sub 抽出_Click() Set dbs = Application.CurrentDb strDate = Format(Now, "_mmdd_hh:mm") If Me.リスト.ItemsSelected.Count = 0 Then MsgBox "抽出する項目を選択してください。" Exit Sub Else Application.DoCmd.CopyObject , "抽出結果" & strDate, acQuery, "全テーブルクエリ" Set qdf = dbs.QueryDefs("抽出結果" & strDate) For IDX = 1 To Me.リスト.ListCount Let qdf.Fields(Me.リスト.ItemData(IDX - 1)) _ .Properties("ColumnHidden").Value = Not (Me.リスト.Selected(IDX - 1)) Next End If DoCmd.OpenQuery "抽出結果" & strDate ReDim F_name(qdf.Fields.Count) For i = 1 To qdf.Fields.Count F_name(i - 1) = qdf.Fields(i - 1).Name If qdf.Fields(F_name(i - 1)).Properties("ColumnHidden").Value = True Then '項目が非表示の場合何もしない Else       'Null以外のデータを抽出 DoCmd.ApplyFilter "抽出結果" & strDate, "('" & F_name(i - 1) & "') Is Not Null" End If Next i dbs.Close Set qdf = Nothing Set dbs = Nothing End Sub ============== ですが、違うやり方があるのではないか・・と1週間くらい悩んでおります。 やりたいことは、 (1)まず100個以上あるフィールドをフォームのフィールドリストから選定。 (2)選定したフィールドのデータにNullまたは長さ0の値があればその行ごと非表示にする。 この2つです。 とりかかってから1カ月以上経ちます。。 お知恵をお貸しください!!!

  • PickFolder アウトルックとアクセス連携

    アクセスのフォームに テキストボックスとコマンドボタンを置きました。 VBAでoutlookに参照設定をして、 Private Sub コマンド2_Click() Dim myNaSp As NameSpace Set myNaSp = GetNamespace("MAPI") Me.テキスト0.Value = myNaSp.PickFolder Set myNaSp = Nothing End Sub としました。 テキストボックスには、 Private Sub テキスト0_AfterUpdate() MsgBox Me.テキスト0.Value End Sub としました。 しかしoutlookのフォルダ名をPickFolderでテキストボックスに入れても テキストボックスの更新後処理のイベントは発動しません。 しかしテキストボックスにはちゃんとフォルダ名が入っています。 Private Sub テキスト0_Change() MsgBox Me.テキスト0.Value End Sub にしても同じです。 Private Sub コマンド2_Click() Me.テキスト0.Value = "aaa" End Sub にしてコマンドボタンをクリックすると、 Private Sub テキスト0_Change() MsgBox Me.テキスト0.Value End Sub は、発動します。 PickFolderでフォルダ名を選択して値をテキストボックスに入れても イベントを発動させる方法を教えてください。