'前略
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 ’件数を表示
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 に関する質問をする掲示板です。次回からは適切な掲示板で質問してください。
Private Sub 参加カテゴリ_Exit(Cancel As Integer)
If Nz(Me.参加カテゴリ.Value) = "" Then
Cancel = True 'フォーカス移動をキャンセル
MsgBox "参加種目が選択されていません", vbOKOnly
End If
End Sub
共通化する前に、そのコードで問題ないのか疑問があります。
部品IDと部品型番の組み合わせで重複をチェックしてますが、部品IDが異なれば部品型番に重複があってもいいのでしょうか。現状のコードだと部品型番に重複があっても登録可能になっています。
あと、更新前処理で Me.Undo してしまうとすべての入力が取り消されてしまいますがそれで問題ないですか。
あと、データベース設計で重複チェックは、テーブル設計の方でインデックスなどを使用して設定するのが確実ですが、その設定はしていますか。
プリンタの設定で出力されるデータが変わることはありえません。
マクロの「where条件式」に設定した式が間違っているのでしょう。
設定した式を提示してください。
そういうことなら、両者の関係は一対多の関係になりますので、口座情報は別テーブルにすればいいでしょう。
一例をあげると下記のようなテーブル構成になります。
会社マスター
※会社ID
会社名
代表者名
・・・
本社・支社マスター
※本社・支社ID
会社ID
支払口座ID
本社・支社区分
本社・支社名
住所
・・・
支払口座情報
※支払口座ID
金融機関名
支店名
預金種類(普通 or 当座)
口座番号
口座名義
・・・・
リレーションシップ設定
会社マスターホ.会社ID → 本社・支社マスター.会社ID
支払口座情報.支払口座ID → 本社・支社マスター.支払口座ID
hatena様
メインテーブルに会社のデータと支払情報のデータを格納し、
サブテーブルに本社・支社区分と住所のデータを格納するような感じの設計になるということでしょうか。
支払に関しては、本社が支払う場合と工場が支払う場合とでは口座が違うので、メインには格納できないかと。
かといってサブに支払情報を持たせると、
ある会社によっては複数ある工場が同じ支払情報を持っているので、同じ支払情報のデータが重複してテーブル内に格納されます。
話が食い違っていたらすみません。
上記の投稿は私のものです。
外出先からログインせずに投稿したので名前なしになりました。
これに対するひとつの解決法としては、下記のような設計にします。
メインテーブルには会社名、代表者名、支払先情報などの共通データを格納(会社マスター)
本社と各工場・事業所データはサブテーブルに格納する(本社・支社マスター)
このテーブルには種別フィールドを追加して、そこで本社か支社か区別できるようにする
これは、ルックアップ機能で参照するようにすればいいでしょう。
もうひとつ面倒なことがありまして、
支払いを、本社がする場合と各工場・事業所がする場合があります。
なので、支払情報が会社マスターにだけでなく、工場・事業所マスタにも必要となります。
hatena様
ありがとうございます。
その場合の設計は
メインフォームの元テーブルのフィールドは
会社ID
会社名
住所
など
サブフォームの元テーブルのフィールドは
事業所ID
会社ID
事業所名
住所
など
会社IDで紐づけ、事業所IDを主キーにする感じですか?
売上が工場・事業所なので、
売上入力の際は、売上先顧客のフィールドとしては、事業所IDとするのでしょうか?
ただ、工場・事業所がなく本社のみの会社もあります。
会社単位でまとめる場合もあるのなら、
会社と工場・事業所は一対多の関係になるので、データベース設計の基本としては、
一側から先に入力してから多側を入力するというのが基本になります。
会社マスターの方に会社情報、支払情報データを持たせます。
私がマスター登録フォームを作成するなら、メインサブフォーム形式にして、
メインフォームに会社マスター、サブフォームに工場・事業所テーブルを配置するという設計にしますね。
hatena様
請求先情報テーブルと支払情報テーブルは分ける必要はありませんでした。1つにします。
作成中の画面をアップします。
画面上下スクロールで合計2枚です。
オートルックアップ機能をやってみます。

上記の点は了解しました。
もうひとつ確認したいのですが、請求先情報テーブルと支払情報テーブルというように2つに分けるのはどういう理由でしょうか。請求先(会社)と支払情報は一対一の関係ならば分けずに一つにまとめたほうがいいでしょう。
一つの会社に対して支払先が複数ある(一対多の関係)ならば分ける必要はありますが。
一対一の関係ならば請求先情報と支払情報をまとめたテーブルを作成してこのテーブルの主キーを顧客テーブルに外部キーとして持たせて、クエリでリンクさせればオートルックアップ機能が働くので検索せずとも自動で表示させることは可能です。
すみません。
「請求先情報テーブルや支払情報テーブルを作成して、顧客テーブルとIDで紐づければと思いましたが」
というのは、請求先情報テーブル、支払情報テーブルのフィールドにそれぞれ請求先情報ID、支払情報IDを主キーとして設け、
顧客テーブルにも請求先情報ID、支払情報IDを設け、リレーションで紐づけるという意味です。
ユーザーは請求先情報、支払情報を入力する際、請求先情報IDが分からないので、検索しないといけなくなるかと思います。という意味でした。
hatena様
オートルックアップクエリを調べてみました。
顧客IDは連番数字なので、どの顧客が何番かは検索(検索フォーム等で)しないとわかりません。
ざっとオートルックアップクエリをネットで見てみた感じの感想ですが、よく研究してみます。
hatena様
請求書の発行は会社単位でまとめる会社もあれば、
工場・事業所で発行する会社もあります。
これに関しては、「オートルックアップクエリ」という機能を使えば、顧客IDと紐づいた請求先情報、支払情報を参照して出力することが可能です。
「Access オートルックアップクエリ」でWEB検索すると解説ページが見つかるのでそれで研究してみてください。
回答の前に確認ですが、
請求書の発行は、会社単位でまとめてするのですか。
それとも工場や事業所単位で発行するのですか。
専門学校などで基礎を勉強するのはどうでしょう?
最適化と修復をしてみたのですが、解決しませんでした。カレントレコードがありませんのエラーとなりました。
それでフォームBには検索用IDコンボボックスがあり、それをフォームAから実行させる形に変更しましたらこの現象は出なくなりました。何か原因はあると思いますが様子見てみます。ありがとうございました。
Hatenaさんありがとうございます。回答頂きました事は試してみますが、投稿内容に情報不足がありました。フォームBを他のフォームから開いた後にフォームBに作成している閉じるボタン(Docmd.close フォーム名)をクリックでその現象になります。
この情報だけからは原因を特定するのは難しいですね。
とりあえず下記を改善するまで順に実行してみてください。
「最適化と修復」の実行
新規データベースファイルを作成して元のファイルからすべてのオブジェクトをインポートする
フォームCを一から作り直す
上記の投稿は私の投稿です。出先でログインせずに投稿してしまいました。
「重複のないデータを取得する」とのことですが、件数を取得するということでいいのでしょうか。
提示のコードは常に全データ件数になり、重複も含む件数になると思いますが。
件数を取得するなら下記のようなコードになると思います。
重複をチェックするフィールドに インデックス(重複あり) を設定してありますか。
もし設定してないなら、設定すると飛躍的に速度は改善すると思います。
原因が分かりました
.Existsでした
sが抜けてました
ありがとうございました。
非常に分かりやすいコードです。
ざっとみたところ下記の箇所があきらかな間違いですので、修正してみてください。
これでとりあえずはエラーなく動くと思います。
もし自分が書くなら下記のような感じになります。
ちなみに、
ここは Microsoft Access に関する質問をする掲示板です。次回からは適切な掲示板で質問してください。
例えば、
エクセル質問掲示板 質問 疑問 使い方 掲示板 エクセル Excel [エクセルの学校]
Excel VBA を学ぶなら moug モーグ|Excel (VBA)
ありがとうございます
こちらの記述で思う通りにできました
Private Sub 参加カテゴリ_Exit(Cancel As Integer)
If Nz(Me.参加カテゴリ.Value) = "" Then
Cancel = True 'フォーカス移動をキャンセル
MsgBox "参加種目が選択されていません", vbOKOnly
End If
End Sub
もし、テキストボックスにフォーカスある状態で未入力の場合はほかのコントロールにフォーカス移動を禁止したいという仕様がご希望なら、一般的には下記のような設計にします。
テキストボックスのフォーカス移動時のイベントプロシージャに下記のコードを設定します。
テキストボックス名が「参加カテゴリ」として、
これで未入力状態では他コントロールへ移動できません。
ただし、このフィールドを入力必須にしたいということなら、これでは不十分です。
このテキストボックスをとばして、他のテキストボックスへ移動したりして、レコード保存操作をすれば未入力のまま保存されます。
この場合は、テーブルデザインで入力必須の設定をするのが確実です。
この行で実行時エラーになるのでしょうか。
また、このコードはどこのどのイベントプロシージャに設定しているのでしょうか。
Sub から End Sub までのコード全体を提示してもらえると状況を把握しやすいです。
どのような状況のときにどのような処理をしたいのかもう少し具体的に説明してください。
[参加カテゴリ]テキストボックスにフォーカスあり未入力(Null値)のとき、他のテキストボックスに移動させたくないということでしょうか。
mayu さん
ありがとうございました。
クエリの方で動作確認させていただきました!
同着の順位付けは以下のように記述します
ただし、DCount関数を使った順位付けは 重たい処理になりますから
クエリの表示速度に難があるようでしたら
hatenaさんが公開されている汎用関数 SetSequenceNumber
を、ご自身のデータベースにインポートしておき、
以下のように呼び出し用のコードを記述して、適当なタイミングで実行するほうがいいでしょう
ありがとうございました。
コマンドボタンに下記記述でできました
本当にありがとうございました。
Private Sub コマンド71_Click()
Me![1投目得点].Locked = True
Me![2投目得点].Locked = True
Me![3投目得点].Locked = True
End Sub
詳細が不明瞭なのでとりあえずヒントだけ。
編集できないようにするにはテキストボックスのLocked プロパティを True に設定します。
mayuさん ありがとうございます。(返信遅れて失礼しました)
サブクエリを使う手がありましたね。確かにこれは時間かければ辿り付いたかもしれません。
でもInStrは全く思いつきませんでした。またJOIN結合でLikeが使うのは絶対に浮かばないアイデアでしたので、勉強になりました。大変お世話になり、本当にありがとうございました。
確かなことはわかりませんが、そのまんま検索すると謎のバグが起きることがあるらしいという情報はありますね
https://www.google.com/search?q=2147467259:引数が無効です
データペースファイルの修復/最適化では修復できませんでした。
手入力した時に出てくるエラーメッセージは、「引数が無効です」でした。
表示された後に、データは入力されています。
何が無効なのか謎ですが、キャッシュがクリアされないでゴミがたまって壊れて壊れた的な状態のような気がします。
カラムが100くらいだと、この症状が出ることはないのですが、
150近くになると、データ型やカラム名を変更していると、たびたび発生するようになります。
officeでは、ここまでだよと言われれば仕方ないのですが、
カラム数にはまだだいぶ余裕があるはずですし。
データ処理に、もっと金使えよ~という事なんでしょうか、、、、、
どうしようもないので、新しくテーブルを作って、ALTER TABLEでカラムを作り直したので、普通に処理できています。
[整理番号]フィールドのデータ型はテキスト型(短いテキスト)ですよね。
このエラーが追加クエリでのエラーと同じ原因の可能性はありそうですか。
念のために下記の手順を試してみてください。
データペースファイルの修復/最適化の実行
それでだめなら、
新規にデータベースファイルを作成して、そこに元ファイルからすべてのオブジェクトをインポートして、この新規ファイルで試してみる。
設定に、違いはありません。
accessは、倉庫として利用しているので、テーブル同士のリレーションシップの機能は利用しておりません。
複製テーブルに、手入力でデータを追加できますが、必ずではない状態です。
整理番号を手入力で追加してみた時も、エラーが出たこともありました。
確か、無効なデータですのようなメッセージが表示された気がします。
-2147467259:引数が無効ですという事なのでしょう。
フィールド数は150程度なので、まだ余裕があります。
ただ、フィールド名やデータ型の変更があったため、これ以上変更できなくなったので構造を複製しました。
今までは、複製すると変更したカウントがチャラになって続行できたのですが、
今回は、この当たりが怪しい気がしておりますが、こんなことが起こるものなのでしょうか?
これだけの情報からは原因を特定するのは難しいです。
このような場合はまずは問題の切り分けをしましょう。
私なら下記のような手順をやってみます。
Accessから元テーブルと複製テーブルをデザインビューで開いて設定に違いがないか確認(データ型、インデックス設定など)
リレーションシップを開いて両者のテーブルのリレーションシップ設定に違いがないか確認
複製テーブルに手入力でデータを追加できるか確認
クエリで同様のSQLを設定して実行してみてデータ追加できるか確認
達成目標に対し、行動目標や手段がそこまで明確なのですから
時間をかけてでも試行錯誤すれば、自ずからご希望の結果が得られたのではないか、と推測します
以下、結果セットが同じになるSQLの記述方法をいくつか載せておきます
■DDL
■データ例
t_摘要t_条件■DML
■結果
質問に書き忘れたのですがLikeは部分一致の Like "*ABC*" ・・・です。
宜しくお願いします。