• ベストアンサー

アクセス フィールドに文字有をカウントしたい

お世話になります。 1レコードの中のフィールド4個に チェック印 として V(小文字)が入ります。 フォームでこの Vが 何個あるか表示させたいです。 よろしくお願いします。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

遅くなりました。 フィールド数が多いということと、検査と データの登録、収集を効率的にというので あれば以下のような方法がいいのでは と思いますが。 テーブルは以下のように分けて作成します。 フィールド名は適当にしていますが。 (1) メインテーブル 患者ID(主キー) 年令 住所 ・ ・ など (2) 上下左右の歯の傷み具合のテーブル 患者ID(主キーとしない) 日付 評価1 評価2 ・ ・ ・ 評価128 (3) 歯周病の有無のテーブル 患者ID(主キーとしない) 日付 評価1 評価2 ・ ・ ・ 評価128 集計 (4) 歯1個への評価のテーブル 患者ID(主キーとしない) 日付 評価1 評価2 評価3 ・ ・ ・ 評価64 次に、これらのテーブルを元に検査に合ったフォームを それぞれ作成します。 これらのフォームはメインフォーム患者IDあるいは、患者ID と日付でこれらのフォームにフィルタをかけて取り出したり、 あるいは新規登録で新しいレコードに移動して新規レコードを 表示します。 これらのフォームの呼び出しはメインフォームの ボタンで表示します。つまり、一つのフォームで 表示していたものを(2)、(3)、(4)のテーブルを 基にしたフォームに分割してデータを取得するという 方法です。これならばテーブルのフィールド数には 左右されません。たぶんこの方法しかないと思いますが。 そこで、質問は(3)のテーブルについてとします。 なお、(3)のテーブルは患者IDと日付と集計の 三つのフィールドを設定しましたからフィールド数は、    128+3=131 となります。 たとえば、(3)のテーブルを基に帳票テーブルを 作成します。作成は「新規作成」からテーブルを 指定して、たとえば「オートフォーム表形式」を 選択するとします。出来たフォームにボタンを 設定し、そのイベントに以下のようにします。 なお、設定が終わったらコード表のツールから参照設定を 選択して、Microsoft DAO xx Object Library に チェックを入れてOKとしてください。xxは3.6のような 数字です。 Private Sub コマンド1_Click()   Dim rs As DAO.Recordset   Dim i As Integer   Dim j As Integer   Set rs = Me.RecordsetClone   If rs.RecordCount > 0 Then     rs.MoveFirst     Do Until rs.EOF       j = 0       For i = 2 To rs.Fields.Count - 1         If rs.Fields(i).Value = "v" Then           j = j + 1         End If       Next i       rs.Edit       rs!集計 = j       rs.Update       rs.MoveNext     Loop   End If   rs.Close: Set rs = Nothing   Me.Refresh End Sub 上記コードの中で、 For i = 2 To rs.Fields.Count - 1 としていますが、これはテーブルの 先頭から、 患者ID(主キーとしない) 日付 評価1 評価2 ・ ・ ・ 評価128 集計 のようになっていて、先頭から二つ目までは 計算対象からはずれ、また最後の集計も 計算対象からはずれるからです。 このような方法で計算をします。なお、この場合は テーブルそのものを一度に計算をするのと同じですから、 Dim rs As DAO.Recordset Dim i As Integer Dim j As Integer Set rs = Me.RecordsetClone の部分を、   Dim db As DAO.Database Dim rs As DAO.Recordset Dim i As Integer Dim j As Integer Set db = Currentdb Set rs = db.Openrecordset("テーブル名",dbOpenDynaset) そして、最後のところを   rs.Close: Set rs = Nothing db.Close: Set db = Nothing Me.Refresh End Sub としてもかまいません。 何かあれば補足してください。

k7qa170622
質問者

お礼

大変遅くなりまして申し訳ありません。いろいろと試行錯誤していたものですから・・・ 今の所 親のメインフォーム・子のサブフォーム(上の歯)・孫のサブフォーム(下の歯)と作りました。 親フォーム   キー   key  オートナンバー        氏名        性別        年齢        ・・・ 子のフォーム(親のフォームの中に サブフォームとして作りました)   (上の歯用)   キー  s1key     オートナンバー        連結key    数値型        検査連番   数値型        検査年月日 日付型        以下のフィールド(検査結果)が180項目ほど 孫のフォーム(子のフォームの中に サブフォームとして作りました)  (下の歯用)   キー  s2key     数値型        以下のフィールド(検査結果)が180項目ほど リレーションシップは   親の key   と 子の連結key (1対多)   子の s1key と 孫の s2key  (1対1) 子と孫は連動してレコード移動できます。(子の移動ボタンで孫も動きます) まだまだ途中ですが、何とかなりそうです。 印刷が難しそうですが・・・ コードありがとうございます。参考にさせて頂きます。 いろいろ詳細にありがとうございました。

その他の回答 (3)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

>質問としましてフィールド4個ですが、実際は128個あります。 >他の種類のフィールド数を含めるとフォーム内の入力数は全部で >300個以上です。検査表です。 vの数によって良い悪いの判定をします。 これだと、考え方がまるで違うことしなければならないので、 これ以上、いや実は・・・・、といったことが出てこないように 確認をさせてください。 (1) >vの数によって良い悪いの判定をします。 という検査項目が128個あるフィールドは 一つのテーブルにそれらの項目だけがある のでしょうか。 あるいは他の項目も同じテーブルに入って いるのでしょうか また、 >他の種類のフィールド数を含めるとフォーム内の入力数は全部で >300個以上です。 ということですが、一つのテーブルに設定できる フィールドの数は255までなので、一応 >実際は128個あります。 というフィールドは一つのテーブルにこれらの 項目だけがあると考えていいのでしょうか。 (2) フォームは単票形式ですか、あるいは帳票や データシート、あるいはサブフォームを持った形式ですか。 また、128個のフィールドと他のフィールドは たとえば単票形式だと、すべて同時にコントロールとして 登録されているのですか。 (3) 128個のフィールドの判定の集計は一括して 全てのレコードについて求めるようにするのか、 あるいはレコードの先頭のフィールドフォーカス を移動したときに個数を表示するようにするのか などによってやり方がまた違ってきます。 (4) 個数の表示は各レコードの末尾に表示するように するのか、あるいは(3)の後半の部分のような やりかただと非連結のテキストボックスに 集計を表示するということもありますが。 以上のようなことですが、一応考えている 方法をのせてもいいのですが、違えば 無駄になるので、まずは以上のことを 確認してからでも、と思います。

k7qa170622
質問者

補足

こんにちは、いろいろありがとうございます。 歯の検査表です。歯は上下左右で32個あります。 歯一個につき、歯の平面図で上下左右の歯の傷み具合を数値で表します。128ヶ所です。 なおかつ上下左右の歯周病の有無を V で現します。ここも128ヶ所です。 合計256個 さらに歯1個への評価が 2種類 32個x2=64個です 総計 320個です。 構想は氏名 性別 年齢 を メインフォーム 検査結果の入力を サブフォーム にしょうと思ってます。 サブにする意味は、検査を複数回しますので、検査日順に入ります。 歯の数だけのマス目が並んだ手書き用の既定用紙をスキャナーで写真とし、この写真をフォームの背景にしてます。 マス目の大きさは1個が1センチ四方です。このなかに歯の傷み具合4か所、歯周病の有無4か所 計8か所入力します。デザインでは、あまり小さいのでアクセサリーの拡大鏡で見たりしてます。 こんなにフィールドが多いのは初めてで 255個の制限があるとは思ってもみなかったです。今 解決法を探しております。 vの合計により、歯周病の治療をするしないを判定します。 全部テキストボックスです。フィールド名は表示してないです。ボックスは透明化して入力した文字だけが表示されます。 写真にテキストボックスで文字を書き込むイメージです。 まだ印刷は考えてませんが、氏名一つに年月日別検査表2個づつが目的です。 よろしくお願いします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

No1です。 質問の見落としがありました。 >フォームでこの Vが 何個あるか表示させたいです。 とのことですので、たとえば、メインフォームとサブフォームの 組み合わせで言いますと、 (1) No1のクエリを元にフォームを作ります。名前を「フォームサブ」 とします。 フォームのプロパティで「既定のビュー」をデータシートにし、 ツールバーの表示で、「フォームヘッダー/フッター」に チェックをいれます。 フッターのところにテキストボックスを一つ設定し、名前を 「tx個数」とします。そのコントロールソースに      =Sum([個数] を設定します。 (2) 新しいフォームをつくり、ツールボックスから 「サブフォーム/サブレポート」のコントロールを 設定します。サブフォーム表示コントロールが 設定できたら、そのプロパティでソースオブジェクト を「フォームサブ」に設定します。なお「フォームサブ」 を表示しているコントロールはその名前を変えなければ 「埋め込み0」のような名前のままです。ここでは そのままにしておきます。 (3) (2)のフォームにテキストボックスを一つ設定します。 名前は適当でいいのですが、一応「tx総個数」としておきます。 この「tx総個数」のプロパティでコントロールソースを     =[埋め込み0]![tx個数] とします。ここで(2)で述べたように「埋め込み0」はサブフォームの 表示コントロールを示しています。サブフォームの名前ではありません。 一応、設定はこれで終わりなのですが、わからないところが あれば補足してください。 もしかしたら、、メインフォーム、サブフォームの設定までは 必要ないのかもしれませんが。

k7qa170622
質問者

補足

 こんばんは^^たいへんご丁寧な回答ありがとうございます。  NO1の方法は大変参考になり、できました。ただ、フォームに表示したいのは 全レコードの vの総合計ではなく、1レコード内の vの数です。  質問としましてフィールド4個ですが、実際は128個あります。他の種類のフィールド数を含めるとフォーム内の入力数は全部で300個以上です。検査表です。 vの数によって良い悪いの判定をします。  クエリ経由ではなく、フォーム内で vの個数を求める方法があれば幸いです。  よろしくお願いします。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

ユーザ定義関数を使う方法で。 標準モジュールに以下を貼り付けます。 Function funcCount(a As String, b As String, c As String, d As String) As Integer Dim i As Integer i = 0 If a = "v" Then i = i + 1 End If If b = "v" Then i = i + 1 End If If c = "v" Then i = i + 1 End If If d = "v" Then i = i + 1 End If funcCount = i End Function 新しいクエリのSQLビューに以下を設定します。 テーブル名は「テーブル1」、フィールド名は、F1、F2、F3、F4としています。 実際に合わせて変更してください。 SELECT テーブル1.F1, テーブル1.F2, テーブル1.F3, テーブル1.F4, funcCount(Nz([F1]),Nz([F2]),Nz([F3]),Nz([F4])) AS 個数 FROM テーブル1; 上記のSQL文で表しているクエリは、テーブルのフィールドのほかに、 新しいフィールドに、 個数: funcCount(Nz([F1]),Nz([F2]),Nz([F3]),Nz([F4])) を設定して、表示しています。

関連するQ&A

  • Access 連結フィールド値を自動で表示

    Accessでフォーム上にサブフォーム(データシート)を作成すると、 新規レコード欄にも自動的に連結フィールドの値が表示されます。 このサブフォームをメインフォーム上に作らずに、 コマンドボタンクリック時にあるフィールドが一致する(上記で言う連結フィールド)データを表示したサブフォーム(データシート)を開くかたちにしたいのですが、そうすると当然ながら新規レコード欄には連結フィールドの値は表示されません。 これをメインフォーム上にサブフォームを作った時と同じように、新規レコード欄に連結フィールド値を表示させるにはどうしたら良いでしょうか? サブフォームを開く段階で新規レコードに結合フィールドの値を(VBAで)入力する事も考えましたが、そうするともしそこにデータを入れるつもりじゃなくても1つのレコードとしてデータが残ってしまいます。 メインフォーム上に作ったサブフォームなら、新規レコードに結合フィールドの値は表示されているものの、その他のフィールドにデータを入力しなければ1つのレコードとしてデータが残ることはありません。 こういう事が可能かどうかわかりませんが、ご存知でしたら教えてくださいませ。 よろしくお願いします!

  • ACCESS サブフォームのフィールドにカーソルをあてる

    ACCESS2003で、VBAで簡単なプログラムを作っています。 <やっていること> ・フォームAからフォームBを開きます。 ・そのときにフォームAの番号と一致するデータをフォームBに表示します。 ・フォームBにはサブフォームCが埋め込んでいます。 このサブフォームCの中のフィールドDにカーソルが入っているようにしたいのですが、 Forms!サブフォームC!フィールドD.setfocus としたら、「カレントレコードには、フィールドDという名前のフィールドはありません」というエラーがでます。 フィールドDというフィールドは存在しています。 このような場合、どのように記述するのがよろしいのでしょうか。 よろしくお願いします。

  • アクセス レポート&フォームでメモ型の文字が途中で切れて表示される

    お世話になります。ACCESS2003を利用しております。 レポート&フォームでメモ型フィールドを印刷&画面表示させたいのですが、文字が途中で切れてしまいます。 切れてしまう文字数は、レコードによって異なります。 レコードは全体で約100行で、平均文字数は100~200文字程度です。 切れてしまうレコードは2レコードあり、 (1)410文字ありますが399文字目で切れるものと (2)436文字ありますが415文字目できれるものがあります。 また、レポート&フォーム両方とも、同じ文字数で切れてしまいます。 (レポート、フォームはクエリから作成) なお、レポートは印刷時拡張を設定しております。 フォームは特に設定はしてません。 宜しくお願い致します。

  • access フィールドへの固定文字

    accessのフィールドで固定文字をつけたいのですがやり方がわかりません 例としては名前のフィールドに対して "様"のように敬称をつけたいです エクセルのユーザ定義みたいな使い方はできないのでしょうか。 できればフィールドをいじるだけで解決したいですが、難しければクエリやフォームのコントロールソースでもかまいません。 よろしくお願いします。

  • アクセス 空フィールドのみ 別データー挿入

    アクセスの同テーブル内に下記レコード(1)(2)が有ります。 (1)レコードのフィールドにはほぼデータが入っていますがNULLのフィールドもあります。 (2)レコードのフィールドはほとんどNULLです。 (1)のレコードのフィールド、データーを取得して (2)のレコードのフィールドがNULLの場合は(1)のフィールドのデーターを貼付ける 例えば下記の(3)様にしたいです。 |数値型 |テキスト型 |日付型  |通貨型  |メモ型 |Yes/No型 | |ID    |名前     |入力日  |金額   |     |チェック   | (1)|01   | さる    |07/28 |1,000 |     |-1     | (2)|02   |とら     |       |      |     |       | (3)|02   |とら     |07/28 |1,000 |     |-1     | 自分なりに考えた所 DLookUp で一つ一つ(1)フィールドを取得して(2)フィールドNULLの場合は挿入し(3)にする方法を 考えましたが、フィールド数が実際には100ほど有り方法が良くないと思いました。 Cloneメソッドを使用して同じフォームに(1)と(2)データーを表示させて上手く出来ないか 考えたりもして見ましたが上手く行きません 良い方法が思いつきません こんな方法があるとか このサイトを参考にしなさいとか どなたかご教授頂けませんでしょうか よろしくお願い致します。

  • [access]フィールドの中の特定の文字の数を出したい。

    アクセス(Ver.2000)のテーブルの、一つのフィールド内に 色々な文字が並んでおります。 その中の特定の文字の数を数えたいのですが、クエリで数を出す方法は? 例えば 一行目のフィールドに『abc』 二行目のフィールドに『bcc』 という二つのレコードがあったとします。 上記をクエリで、 『a』→ 1 『b』→ 2 『c』→ 3 というように各文字の数を出したいのですが、 どのような方法で出せるでしょうか? 分かる方ご教授よろしくお願いします。

  • アクセス メモ型 255文字以上入れられない

    アクセスでテーブルデザインでメモ型にしています。 そのフィールドには何文字でも入力できるようですが、 そのフィールドをフォームのテキストボックスのコントロールソースにすると なぜか255文字以上入力できません。 テーブルは一度クエリにして、フォームのレコードソースとしています。 ダイレクトにテーブルを開いて、そのメモ型のフィールドに情報を入れることは出来ますが フォームからは255文字以上は入力できません。 これを回避する方法をご教授ください。

  • アクセスのフォームに乗っけられるフィールドは216

    アクセスのフォームに乗っけられるフィールドは216個? アクセス2010で、テーブルのフィールドは250個近くあります。 そのテーブルを元に、単表フォームを作ろうとウィザードを立ち上げたのですが どうしても216個目で「フォームを作成できません」になります。 フィールド名がおかしいのかな?と、216個目のフィールド名を適当な文字に変えてみましたが やはりエラーになります。 ヘルプ等にこのような記載はあるのでしょうか? 探せませんでした。

  • アクセス2007 コマンドボタン ウイザード

    2007を使い始めたところですが、教えてください。単票フォーム(A)のデザインで、コマンドボタンを貼り付けて、別単票フォーム(B)を「フォームを開く」のをウィザードを利用して行おうとしています。その中で、「特定のレコードを表示する」を選択した場合、フォーム(B)のフィールドだけ表示されて、フォーム(A)のフィールドが表示されません。2002では、両方表示されて、「<ー>」ボタンを押せば、うまく目的のレコードの単票フォームが表示されていたのですが、どうなっているのでしょうか?・・・・・・フォーム(A)のフィールドが表示されません。・・・・・・よろしくおねがいします。

  • ACCESSのフィールドに記述する式について

    次のソフトを使っています。 ACCESS 2003 Windows7 次のことをやりたいです。 1つのレコードに業者が20フィールドほど並んでいるテーブルを作成しました。 クエリのフィールドに式を1つ追加しまして、1レコードの中で 業者フィールドにNullが1つ以上あるかないかを調べる式を 作りたいです。 1つも無ければ、値を表示し、1つ以上ある場合は値を表示しないという ことをやりたいのです。 そもそも、このようなことができるのかもわかりませんが、 どなたかお助けくださいませ。 よろしくお願いいたします。

専門家に質問してみよう