Microsoft Access 掲示板

6,744 件中 81 から 120 までを表示しています。
1

共通化する前に、そのコードで問題ないのか疑問があります。

部品IDと部品型番の組み合わせで重複をチェックしてますが、部品IDが異なれば部品型番に重複があってもいいのでしょうか。現状のコードだと部品型番に重複があっても登録可能になっています。

あと、更新前処理で Me.Undo してしまうとすべての入力が取り消されてしまいますがそれで問題ないですか。

あと、データベース設計で重複チェックは、テーブル設計の方でインデックスなどを使用して設定するのが確実ですが、その設定はしていますか。

1

プリンタの設定で出力されるデータが変わることはありえません。

マクロの「where条件式」に設定した式が間違っているのでしょう。
設定した式を提示してください。

15
hatena 2026/01/15 (木) 10:19:47 修正

支払に関しては、本社が支払う場合と工場が支払う場合とでは口座が違うので、メインには格納できないかと。

そういうことなら、両者の関係は一対多の関係になりますので、口座情報は別テーブルにすればいいでしょう。

一例をあげると下記のようなテーブル構成になります。

会社マスター
※会社ID
 会社名
 代表者名
 ・・・

本社・支社マスター
※本社・支社ID
 会社ID
 支払口座ID
 本社・支社区分
 本社・支社名
 住所
 ・・・

支払口座情報
※支払口座ID
 金融機関名
 支店名
 預金種類(普通 or 当座)
 口座番号
 口座名義
 ・・・・
 
リレーションシップ設定
会社マスターホ.会社ID → 本社・支社マスター.会社ID
支払口座情報.支払口座ID → 本社・支社マスター.支払口座ID

14
あん 2026/01/13 (火) 15:45:21 3a8f2@888cb

hatena様
メインテーブルに会社のデータと支払情報のデータを格納し、
サブテーブルに本社・支社区分と住所のデータを格納するような感じの設計になるということでしょうか。

支払に関しては、本社が支払う場合と工場が支払う場合とでは口座が違うので、メインには格納できないかと。

かといってサブに支払情報を持たせると、
ある会社によっては複数ある工場が同じ支払情報を持っているので、同じ支払情報のデータが重複してテーブル内に格納されます。

話が食い違っていたらすみません。

13

上記の投稿は私のものです。
外出先からログインせずに投稿したので名前なしになりました。

12
名前なし 2026/01/09 (金) 10:35:34 4d648@f22ab

支払いを、本社がする場合と各工場・事業所がする場合があります。

これに対するひとつの解決法としては、下記のような設計にします。

メインテーブルには会社名、代表者名、支払先情報などの共通データを格納(会社マスター)
本社と各工場・事業所データはサブテーブルに格納する(本社・支社マスター)
このテーブルには種別フィールドを追加して、そこで本社か支社か区別できるようにする

なので、支払情報が会社マスターにだけでなく、工場・事業所マスタにも必要となります。

これは、ルックアップ機能で参照するようにすればいいでしょう。

11
あん 2026/01/08 (木) 13:31:49 3a8f2@888cb

もうひとつ面倒なことがありまして、
支払いを、本社がする場合と各工場・事業所がする場合があります。
なので、支払情報が会社マスターにだけでなく、工場・事業所マスタにも必要となります。

10
あん 2026/01/08 (木) 13:15:25 3a8f2@888cb

hatena様
ありがとうございます。

その場合の設計は

メインフォームの元テーブルのフィールドは
会社ID
会社名
住所
など

サブフォームの元テーブルのフィールドは
事業所ID
会社ID
事業所名
住所
など

会社IDで紐づけ、事業所IDを主キーにする感じですか?

売上が工場・事業所なので、
売上入力の際は、売上先顧客のフィールドとしては、事業所IDとするのでしょうか?

ただ、工場・事業所がなく本社のみの会社もあります。

9

請求書の発行は会社単位でまとめる会社もあれば、
工場・事業所で発行する会社もあります。

会社単位でまとめる場合もあるのなら、
会社と工場・事業所は一対多の関係になるので、データベース設計の基本としては、
一側から先に入力してから多側を入力するというのが基本になります。
会社マスターの方に会社情報、支払情報データを持たせます。

私がマスター登録フォームを作成するなら、メインサブフォーム形式にして、
メインフォームに会社マスター、サブフォームに工場・事業所テーブルを配置するという設計にしますね。

8
あん 2026/01/06 (火) 13:53:00 3a8f2@888cb

hatena様
請求先情報テーブルと支払情報テーブルは分ける必要はありませんでした。1つにします。

作成中の画面をアップします。
画面上下スクロールで合計2枚です。

オートルックアップ機能をやってみます。画像1
画像2

7

請求書の発行は会社単位でまとめる会社もあれば、
工場・事業所で発行する会社もあります。

「請求先情報テーブルや支払情報テーブルを作成して、顧客テーブルとIDで紐づければと思いましたが」
というのは、請求先情報テーブル、支払情報テーブルのフィールドにそれぞれ請求先情報ID、支払情報IDを主キーとして設け、
顧客テーブルにも請求先情報ID、支払情報IDを設け、リレーションで紐づけるという意味です。

上記の点は了解しました。

もうひとつ確認したいのですが、請求先情報テーブルと支払情報テーブルというように2つに分けるのはどういう理由でしょうか。請求先(会社)と支払情報は一対一の関係ならば分けずに一つにまとめたほうがいいでしょう。
一つの会社に対して支払先が複数ある(一対多の関係)ならば分ける必要はありますが。

一対一の関係ならば請求先情報と支払情報をまとめたテーブルを作成してこのテーブルの主キーを顧客テーブルに外部キーとして持たせて、クエリでリンクさせればオートルックアップ機能が働くので検索せずとも自動で表示させることは可能です。

6

すみません。
「請求先情報テーブルや支払情報テーブルを作成して、顧客テーブルとIDで紐づければと思いましたが」
というのは、請求先情報テーブル、支払情報テーブルのフィールドにそれぞれ請求先情報ID、支払情報IDを主キーとして設け、
顧客テーブルにも請求先情報ID、支払情報IDを設け、リレーションで紐づけるという意味です。

ユーザーは請求先情報、支払情報を入力する際、請求先情報IDが分からないので、検索しないといけなくなるかと思います。という意味でした。

5

hatena様
オートルックアップクエリを調べてみました。
顧客IDは連番数字なので、どの顧客が何番かは検索(検索フォーム等で)しないとわかりません。

ざっとオートルックアップクエリをネットで見てみた感じの感想ですが、よく研究してみます。

4

hatena様
請求書の発行は会社単位でまとめる会社もあれば、
工場・事業所で発行する会社もあります。

3

請求先情報テーブルや支払情報テーブルを作成して、顧客テーブルとIDで紐づければと思いましたが、
顧客テーブルに登録の際、請求先情報のIDを検索して入力というのも、どうかと思いました。
ユーザー側としてはすんなり請求先情報を入力したいかなと思い。

これに関しては、「オートルックアップクエリ」という機能を使えば、顧客IDと紐づいた請求先情報、支払情報を参照して出力することが可能です。

「Access オートルックアップクエリ」でWEB検索すると解説ページが見つかるのでそれで研究してみてください。

2
hatena 2025/12/30 (火) 17:16:08 修正

回答の前に確認ですが、
請求書の発行は、会社単位でまとめてするのですか。
それとも工場や事業所単位で発行するのですか。

1
名前なし 2025/12/29 (月) 21:37:09 b6989@0e907

専門学校などで基礎を勉強するのはどうでしょう?

3
beginner 2025/12/10 (水) 08:57:25 9eaf4@2128d

最適化と修復をしてみたのですが、解決しませんでした。カレントレコードがありませんのエラーとなりました。
それでフォームBには検索用IDコンボボックスがあり、それをフォームAから実行させる形に変更しましたらこの現象は出なくなりました。何か原因はあると思いますが様子見てみます。ありがとうございました。

2
beginner 2025/12/08 (月) 15:40:42 5b03c@570b7

Hatenaさんありがとうございます。回答頂きました事は試してみますが、投稿内容に情報不足がありました。フォームBを他のフォームから開いた後にフォームBに作成している閉じるボタン(Docmd.close フォーム名)をクリックでその現象になります。

1

この情報だけからは原因を特定するのは難しいですね。

とりあえず下記を改善するまで順に実行してみてください。

「最適化と修復」の実行
新規データベースファイルを作成して元のファイルからすべてのオブジェクトをインポートする
フォームCを一から作り直す

3

上記の投稿は私の投稿です。出先でログインせずに投稿してしまいました。

2
名前なし 2025/11/27 (木) 14:26:53 40184@3d35d

「重複のないデータを取得する」とのことですが、件数を取得するということでいいのでしょうか。
提示のコードは常に全データ件数になり、重複も含む件数になると思いますが。

'前略

    ReDim myArray(FlCnt, RcCnt) '二次元配列を再定義
    myArray = adoRs.GetRows    '全レコードを配列として取得

    x = 0
    Dim nbDic As Object
    Set nbDic = CreateObject("Scripting.Dictionary") 'Dictionaryを生成、Dictionaryの中身は空
    For i = 0 To RcCnt - 1
      If nbDic.exists(myArray(0, i)) = False Then '空のDictionary内にデータがあるか確認
                                                  '空なので存在するはずがない、常にFalse
         x = x + 1
      End If
     Next

    MsgBox x

件数を取得するなら下記のようなコードになると思います。

'前略

    ReDim myArray(FlCnt, RcCnt) '二次元配列を再定義
    myArray = adoRs.GetRows    '全レコードを配列として取得

    Dim nbDic As Object
    Set nbDic = CreateObject("Scripting.Dictionary") 'Dictionaryを生成、Dictionaryの中身は空
    For i = 0 To RcCnt - 1
      nbDic(myArray(0, i)) = myArray(0, i) 'データ配列の1列目をDictionaryに格納
                                           ’重複データは上書きされる
    Next

    MsgBox nbDic.Count  ’件数を表示

SELECT DISTINCTを使うと、少し負荷が大きいようで時間がかかります

重複をチェックするフィールドに インデックス(重複あり) を設定してありますか。
もし設定してないなら、設定すると飛躍的に速度は改善すると思います。

1

原因が分かりました
.Existsでした
sが抜けてました

2

ありがとうございました。
非常に分かりやすいコードです。

1

ざっとみたところ下記の箇所があきらかな間違いですので、修正してみてください。

-            With Sh1.Shapes.AddShape(msoOval, lef + wd / 2, h - 0.5, hg + 1, hg + 1)
+            With Sh1.Shapes.AddShape(msoshapeOval, lef + wd / 2, h - 0.5, hg + 1, hg + 1)
-             .Line.ForeColor.RGB = vbBlock
+             .Line.ForeColor.RGB = vbBlack

これでとりあえずはエラーなく動くと思います。

もし自分が書くなら下記のような感じになります。

Sub test1()
    With ThisWorkbook.Worksheets("申請書")
        Dim l As Single, t As Single, w As Single, h As Single
        With .Range("aK23:aL23")
            l = .Left
            t = .Top
            w = .Width
            h = .Height
        End With
        With .Shapes.AddShape(msoShapeOval, l + w / 2 - h / 2, t, h, h)
            .Fill.Visible = msoFalse
            .Line.Weight = 1
            .Line.ForeColor.RGB = vbBlack
        End With
    End With
End Sub

ちなみに、
ここは Microsoft Access に関する質問をする掲示板です。次回からは適切な掲示板で質問してください。

例えば、
エクセル質問掲示板 質問 疑問 使い方 掲示板 エクセル Excel [エクセルの学校]
Excel VBA を学ぶなら moug モーグ|Excel (VBA)

3
ヒロ 2025/11/12 (水) 20:16:30 c1459@a6874

ありがとうございます

こちらの記述で思う通りにできました

Private Sub 参加カテゴリ_Exit(Cancel As Integer)

    If Nz(Me.参加カテゴリ.Value) = "" Then
        Cancel = True 'フォーカス移動をキャンセル
        MsgBox "参加種目が選択されていません", vbOKOnly
    End If

End Sub

2

もし、テキストボックスにフォーカスある状態で未入力の場合はほかのコントロールにフォーカス移動を禁止したいという仕様がご希望なら、一般的には下記のような設計にします。

テキストボックスのフォーカス移動時のイベントプロシージャに下記のコードを設定します。

テキストボックス名が「参加カテゴリ」として、

Private Sub 参加カテゴリ_Exit(Cancel As Integer)

    If Nz(Me.参加カテゴリ.Value) = "" Then
        Cancel = True 'フォーカス移動をキャンセル
        MsgBox "参加種目が選択されていません", vbOKOnly
    End If

End Sub

これで未入力状態では他コントロールへ移動できません。

ただし、このフィールドを入力必須にしたいということなら、これでは不十分です。
このテキストボックスをとばして、他のテキストボックスへ移動したりして、レコード保存操作をすれば未入力のまま保存されます。

この場合は、テーブルデザインで入力必須の設定をするのが確実です。

1

Forms!F点数入力![1-1].SetFocus

この行で実行時エラーになるのでしょうか。

また、このコードはどこのどのイベントプロシージャに設定しているのでしょうか。

Sub から End Sub までのコード全体を提示してもらえると状況を把握しやすいです。

テキストBOX形式のフィールドが空欄の場合は処理を
停止したく下記のように記述しましたがメッセージも表示されず

どのような状況のときにどのような処理をしたいのかもう少し具体的に説明してください。

[参加カテゴリ]テキストボックスにフォーカスあり未入力(Null値)のとき、他のテキストボックスに移動させたくないということでしょうか。

2
ヒロ 2025/11/09 (日) 18:28:13 c1459@a6874

mayu  さん

ありがとうございました。
クエリの方で動作確認させていただきました!

1

順位: DCount("総得点","氏名クエリ","総得点>" & [総得点])+1

 
同着の順位付けは以下のように記述します

順位: DCount("*", "氏名クエリ"
            , "総得点 > " & 総得点 
                          & " OR ( 総得点 = " & 総得点 
                          & "        AND " 
                          & "      Nz(順位決定戦, 0) > " & Nz(順位決定戦, 0) 
                          & " )"
      ) + 1

 
ただし、DCount関数を使った順位付けは 重たい処理になりますから
クエリの表示速度に難があるようでしたら

hatenaさんが公開されている汎用関数 SetSequenceNumber

グループ毎連番を自動入力する関数
クエリで連番を表示する場合、DCount関数やサブクエリを利用する方法はあちこちで紹介されています。 しかし、この方法は自分より前のレコード件数をカウントするというロジックなのでレコード件数が多くなると幾何級数的に重くなります。また、グループ毎に連番を振るという仕様になると、条件式も複雑になってきます。 クエリは使わずにテーブルに連番フィールドを持たせて、そこに VBA で連番を書きこむようにすると高速...
fc2

を、ご自身のデータベースにインポートしておき、
以下のように呼び出し用のコードを記述して、適当なタイミングで実行するほうがいいでしょう
 

Sub sample()
    Rem // 関数の第一引数と第二引数は環境に合わせて変更して下さい
    Call SetSequenceNumber( _
             "順位を書き込むフィールド名", _
             "実際のテーブル名", , _
             "総得点 DESC, 順位決定戦 DESC" _
    )
End Sub
2
ヒロ 2025/11/04 (火) 13:57:49 c1459@a6874

ありがとうございました。

コマンドボタンに下記記述でできました
本当にありがとうございました。


Private Sub コマンド71_Click()
Me![1投目得点].Locked = True
Me![2投目得点].Locked = True
Me![3投目得点].Locked = True

End Sub

1

詳細が不明瞭なのでとりあえずヒントだけ。

編集できないようにするにはテキストボックスのLocked プロパティを True に設定します。

    Me!テキストボックス名.Locked = True
3
beginner 2025/10/27 (月) 08:47:54 9eaf4@2128d

mayuさん ありがとうございます。(返信遅れて失礼しました)
サブクエリを使う手がありましたね。確かにこれは時間かければ辿り付いたかもしれません。
でもInStrは全く思いつきませんでした。またJOIN結合でLikeが使うのは絶対に浮かばないアイデアでしたので、勉強になりました。大変お世話になり、本当にありがとうございました。

5
hiroton 2025/10/27 (月) 01:16:50 bc5cb@2ee8f

確かなことはわかりませんが、そのまんま検索すると謎のバグが起きることがあるらしいという情報はありますね
https://www.google.com/search?q=2147467259:引数が無効です

4

データペースファイルの修復/最適化では修復できませんでした。
手入力した時に出てくるエラーメッセージは、「引数が無効です」でした。
表示された後に、データは入力されています。
何が無効なのか謎ですが、キャッシュがクリアされないでゴミがたまって壊れて壊れた的な状態のような気がします。

カラムが100くらいだと、この症状が出ることはないのですが、
150近くになると、データ型やカラム名を変更していると、たびたび発生するようになります。
officeでは、ここまでだよと言われれば仕方ないのですが、
カラム数にはまだだいぶ余裕があるはずですし。
データ処理に、もっと金使えよ~という事なんでしょうか、、、、、

どうしようもないので、新しくテーブルを作って、ALTER TABLEでカラムを作り直したので、普通に処理できています。

3

[整理番号]フィールドのデータ型はテキスト型(短いテキスト)ですよね。

複製テーブルに、手入力でデータを追加できますが、必ずではない状態です。
整理番号を手入力で追加してみた時も、エラーが出たこともありました。

このエラーが追加クエリでのエラーと同じ原因の可能性はありそうですか。

念のために下記の手順を試してみてください。

データペースファイルの修復/最適化の実行
それでだめなら、
新規にデータベースファイルを作成して、そこに元ファイルからすべてのオブジェクトをインポートして、この新規ファイルで試してみる。

2

設定に、違いはありません。
accessは、倉庫として利用しているので、テーブル同士のリレーションシップの機能は利用しておりません。
複製テーブルに、手入力でデータを追加できますが、必ずではない状態です。
整理番号を手入力で追加してみた時も、エラーが出たこともありました。
確か、無効なデータですのようなメッセージが表示された気がします。
-2147467259:引数が無効ですという事なのでしょう。

フィールド数は150程度なので、まだ余裕があります。
ただ、フィールド名やデータ型の変更があったため、これ以上変更できなくなったので構造を複製しました。
今までは、複製すると変更したカウントがチャラになって続行できたのですが、
今回は、この当たりが怪しい気がしておりますが、こんなことが起こるものなのでしょうか?

1

これだけの情報からは原因を特定するのは難しいです。

このような場合はまずは問題の切り分けをしましょう。
私なら下記のような手順をやってみます。

Accessから元テーブルと複製テーブルをデザインビューで開いて設定に違いがないか確認(データ型、インデックス設定など)
リレーションシップを開いて両者のテーブルのリレーションシップ設定に違いがないか確認
複製テーブルに手入力でデータを追加できるか確認
クエリで同様のSQLを設定して実行してみてデータ追加できるか確認

2

テーブルにある摘要欄(文字列フィールド)を
Like複数の文字列条件での抽出はクエリに Like "ABC" Or Like "DEF" Or ・・・・

条件部を他のテーブルに設定した値で可能でしょうか?
そうしておけば条件の変更追加も分かり易く簡単に出来る

 
達成目標に対し、行動目標や手段がそこまで明確なのですから
時間をかけてでも試行錯誤すれば、自ずからご希望の結果が得られたのではないか、と推測します

以下、結果セットが同じになるSQLの記述方法をいくつか載せておきます

 
■DDL

CREATE TABLE t_摘要 (
      x_id AUTOINCREMENT PRIMARY KEY
    , 摘要欄 VARCHAR(100)
);
CREATE TABLE t_条件 (
      y_id AUTOINCREMENT PRIMARY KEY
    , 条件部 VARCHAR(50)
);

 
■データ例

t_摘要

x_id摘要欄
1ABCDEF
2ACE
3DEFFE
4BAACD
5MBABC
6ONJBD
7B_DEF_ABCF
8DEABFC

 
t_条件

y_id条件部
1ABC
2DEF

 
■DML

SELECT * FROM t_摘要 x
WHERE EXISTS 
(
    SELECT 1 FROM t_条件 y
    WHERE x.摘要欄 Like '*' & y.条件部 & '*'
);
SELECT * FROM t_摘要 x
WHERE EXISTS 
(
    SELECT 1 FROM t_条件 y
    WHERE InStr( 1, x.摘要欄, y.条件部, 1 ) > 0
);
SELECT DISTINCT x.*
FROM t_摘要 x
   , t_条件 y
WHERE InStr( 1, x.摘要欄, y.条件部, 1 ) > 0
;
SELECT DISTINCT x.*
FROM t_摘要 x
INNER JOIN t_条件 y
        ON ( x.摘要欄 Like '*' & y.条件部 & '*' )
;

 
■結果

x_id摘要欄
1ABCDEF
3DEFFE
5MBABC
7B_DEF_ABCF
1
beginner 2025/10/24 (金) 08:57:48 9eaf4@2128d

質問に書き忘れたのですがLikeは部分一致の Like "*ABC*" ・・・です。
宜しくお願いします。