Public Function 入力漏れ() As Boolean
Dim myCtrl As Control
For Each myCtrl In Screen.ActiveForm.Controls
If myCtrl.Name Like "txt*" Then
If IsNull(myCtrl.Value) Then
MsgBox "入力必須項目に入力漏れがあります"
' Cancel = True
入力漏れ = True
Exit Function
End If
End If
Next
入力漏れ = False
End Function
不具合解決にエラーメッセージは大事です。追記されているようなのでそれっぽい内容で検索してみました
ACCDEファイルが32Bit版と64Bit版で共有できない : Access(FeedSoftさん)
検索の仕方を変えればmicrosoftのドキュメントにも同様の内容を見つけられますね
そういうことでしょう
回答ありがとうございました。
hatena様の見解を参考にさせていただきます。
経験上、8人ぐらいなら、連結でもそんなに重くならないと思います。
新規データの入力フォームなら、「データ入力用」プロパティを「はい」にしておけば全レコードを読みに行くこともないので。
たまに、そのような話も見かけますが、実際、非連結でのコードはそんなに簡単ではないし、そんなにメリットはないと思います。
共有時の非連結フォームに関する私の見解は下記の質問にも回答してますので、参考にしてください。
デフォルトの楽観的排他制御 Microsoft Access 掲示板 - zawazawa
回答ありがとうございます。
非連結で入力フォームを作成したのは、作動が重くならないとNETで見つけたからです。
連結でも、非連結でも、作動は、関係ないのでしょうか?
環境としては、ネットワークドライブで、ACCESSを8人で共有して利用しています。
この入力フォームが連結フォームで連結したテーブルを更新するのが目的なら、そもそもADOもDAOも必要ありません。
というかVBAコード自体必要ありません。
VBAでテーブル更新しているということは、非連結フォームで設計しているのでしょうか。
だとしたら、非連結にしている目的はなんでしょう。
検索しても見つからないのは、Accessにおいてそのようなことする必然性がほぼないからです。
ありがとうございます。
該当ファイルはカレンダーコントロールは使っていないようですが、類似した何かを使っているのでしょうかね。
それが一番ですか。上と相談してみます。ありがとうございました。
フォームかレポートにカレンダーコントロールとかのActiveXコントロールを使っていませんか。
最終的には相手先と同じバージョンにして開発するのが確実な方法だと思います。
hatena様
ご回答ありがとうございます。参照のページ、拝読いたしました。内容は理解できたと思います。
今回問題になっているファイルに、Declareを使っていないと思うのです。
Accessクラスオブジェクトと、標準モジュールのところで、検索しましたがヒットしません。
また、APIのような機能を使ってプログラムをした覚えもありません。(そもそも理解していません)
accessの理解が低くて大変申し訳ありませんが、Declare文とはもっと違うところに書かれているのでしょうか。
ご回答ありがとうございます。
抽出条件に1と入力というのは、主キーで抽出するということでしょうか。
主キーで「1」や「2」と抽出すると、ちゃんとそれに該当するレコードが表示されます。
品目で抽出するとうまく抽出されません…
通常は32bitOfficeで作成したデータベースファイルを64bitOfficeで使用可能です。
ただし、ActiveXコントロールを使っていたりすると使用できません。
ActiveXは使わないようにする必要があります。
また、VBAでWindowsAPIを使っている場合は、API宣言を質問のリンク先の方法で修正する必要があります。
API宣言の修正方法は下記の方がより詳しいです。
WindowsAPI をOffice64bit版または32bit版のVBAで使うには | hatena chips
わざわざメインーサブにフォームを分けなければいいんじゃない?
フォームの挿入前処理イベントで
Me.日付ID = 1
とでもすれば登録だけならできるよ返信の機能がよく分からず、
見えづらい投稿となってすみません。
以後もっとわかりやすく投稿したいと思います。
ご返答をありがとうございます。
>メインフォームとサブフォームのレコードソースのそれぞれのテーブルの関係は、一対多の関係でしょうか。
無理でしたか。残念です。
>現状のメインフォームとサブフォームのレコードソースのそれぞれのテーブルのフィールド構成はどうなってますか。
詳しく記載していただき、誠にありがとうございます。
例えば、サブフォームにしていたものを、
ボタンでフォームを開くといった形にしようかな?と思います。
またご質問することがあるかと存じますが、
その時もよろしくお願い致します。
フォーム(メインフォーム)上にサブフォームコントロールを配置して、
それの「リンク親フィールド」「リンク子フィールド」プロパティを 日付ID に設定しているという状況でしょうか。
フォーム(メインフォーム)の日付ID はオートナンバー型のフィールドでしょうか。
フォーム(メインフォーム)は未入力、つまり新規レコードの状態で、
サブフォームの方でデータを入力したいということでしょうか。
メインフォームとサブフォームのレコードソースのそれぞれのテーブルの関係は、一対多の関係でしょうか。
だとしたら、原理的に無理です。一側のレコードがないと多側のレコードは入力できません。リレーショナルデータベースの制限です。
現状のメインフォームとサブフォームのレコードソースのそれぞれのテーブルのフィールド構成はどうなってますか。
テーブル設計、あるいはメイン/サブフォーム形式が適切でない可能性があります。
ググッただけですが、連結値と表示値を理解するとあります。抽出条件に1と入力するとどうなりますか?
解決いたしました。
ありがとうございました。
引数で対象コントロールを渡せはいいでしょう。
標準モジュール
フォームモジュール
「宛名ラベルを押した瞬間」の宛名ラベルとは具体的になんのことでしょうか。
どうもありがとうございます。
アドバイスをいただきまして、私の説明が足りなかったと感じた部分もあり、また、今後の対応の方向性が少し見えたこともありましたので、コメントさせていただきます。
1点目ですが、少し補足させていただくと、デザインビューでレコレードソースにはクエリを物理的に設定はしています。
データ取得後、なんでレコレードソースを
再設定してるかというと、メインフォームのヘッダにザブフォームのレコードを抽出するためのテキストボックス、コンボボックス等が十数個あり、それぞれの更新後処理から、レコードソースのwhere条件を生成してレコレードソースを設定するfunctionプロシージャを呼び出しています。
このヘッダの抽出条件を設定するコントロールのいくつかにはデフォルト値が設定しているため、データ読み込み後、この条件でデータを更新したいため、前述のfunctionプロシージャを呼び出してもいて、この時のエラーになっています。
データ取得後なら更新と、ユーザーが抽出条件を与えての更新で処理を分けてみるとかも検討してみたいです。
そして、このクエリ自体も少し重いものなので、2点目でアドバイスいただきましたように、待機処理をいれてみようと思います。
奇しくも、この投稿をしてから十数回この処理を繰り返し行っていますが、エラーは1回も出ていません。
この処理の影響もありそうですが、
まずは、VBAでレコードソースを変更するのは避けて、フォームのデザインビューでレコードソースプロパティにクエリ名を設定しておいて、VBAでは再クエリするだけにした方が安定しそうです。
あと、外部データをテーブルに取得した後に少し、待機してから再クエリするといいかもしれません。
VBAで指定した秒数だけ処理を止める方法【Sleep関数(API)】|CATIAマクロの作成方法 | LiCLOG
ありがとうございます。()などがエラーの原因の可能性があると言う事ですね。
全部修正できるか見直してみます。
フィールド名やコントロール名、その他名前に記号や特殊文字を使わない
コンピューターが文字をどのように扱うか、さらにACCESSならどうか、VBAならどうか、という深い問題があります。それでもどうしても記号や特殊文字を使わなければいけないのならこれらの仕組みを勉強してください
例外的に安全であろう記号はVBA自身も使っている「
_
」1文字くらいですありがとうございました。
Fcuntionを勉強していますが、イマイチ理解できていません。
このように条件判定するんですね。
参考になりました。
ありがとうございました。
ご助力感謝いたします。
本日、いただきましたコードを入れる前に下記のことを確認し一応の問題解決になりました。。
メインフォームには二つのサブフォームがあり、レコードソースにはクエリの内容は違うものの、
同じテーブルを元にしているクエリがセットされています。
そして、片方だけrequeryしておりましたが、両方することで、
更新が行われるようになりました。
また、クリック等では更新されるとありましたが、そのマクロの実行は両方のサブフォームをrequeryしておりました。
上記の通り、二つのサブフォームについて伝えていなかったこと、
そして、クリック等での更新については結果的に勘違いであったことお詫び申し上げます。
ただ、腑に落ちないのは、サブフォームが複数ある場合は両方しなければならない仕様なのでしょうか。
当然その場合は、処理に時間がかかるのでいかがなものかなと思います。
ご尽力いただきました、りんご様、本当にありがとうございました。
Function プロシージャは戻り値が取れるのでその結果で条件分岐すればいいでしょう
プロシージャはExitステートメントで中断することができます
>> 2
色々試してみましたが、力不足でした、
当面、タイマー時イベントから期待通りに動くイベントを呼び出すのは、どうでしょうか?
どなたかフォローをお願いします。
早速のご返信ありがとうございます。
ご指摘の内容を行いました。
メッセージボックス表示されました。
申し訳ありません。久々のアクセスでウッカリしておりましたが、少しずつ思い出してきました。
NOとNOsの方が違ったようです。自己解決しました。失礼いたしました。
おぉ、おめでとうございます。皆様お疲れ様でした。ビール飲もうっ、とっとっと、自宅でだょノ
出来ました!
Q従業員抽出 のクエリに[従業員コード]を追加してみたところ、
「あ」のボタンを押した後、コンボボックスにあ行の従業員が表示され、
その中の従業員を選択すると、フォームに出てくるようになりました。
hirotonさん りんごさん
何度もじっくりとお付き合いいただき、またご指導下さり、本当にありがとうございましたm(__)m
数値型 ≠ 文字型
とりあえず、コンボボックスの表示問題は解決出来たという事でよろしいですか?この質問スレを解決済みにして新しい質問を立てましょう。下記の準備をやっておいて下さい。
やりたい事の為には、従業員コードが出てくる「従業員テーブル、従業員抽出クエリ、ほにゃららフォームのコンボボックス(値集合ソース:従業員抽出クエリ)」が必要だと思います。
Q従業員抽出が従業員抽出クエリに相当するならば、従業員コードのフィールドを追加、本番前のお試しクエリに相当するならば、新しいコンボボックス(値集合ソース:従業員抽出クエリ)を作って下さい。コンボボックスの連結列が従業員コードの列になるようにしておきましょう。
「あ」のボタンを押した後、従業員コンボボックスには、従業員の苗字が1回ずつ(同一名が繰り返されることなく)表示されました。
そして、名字を選択すると「型が一致しません」となります。
マクロ名
基本情報1 : 従業員コンボボックス : AfterUpdate : 埋め込みマクロ
アクション名
オブジェクトからレコードの検索
引数
-1, , 先頭のレコード, ="[従業員コード] = "& Str(Nz([Screen].[ActiveControl], 0))
エラー番号
2950
となっています。
内容テーブルのフィールド次第だと思います。情報不足です。
日付IDが出てくるのでしょうか?各テーブルの主キーはどうしているのでしょうか?
サブレポートを使ったことがないので勉強してやってみます
またわからなかったら新規で質問させてもらうかもしれません
よろしくおねがいします
コンボボックスの列数を2、列幅を例えば、1cm;1cm、連結列を1にしてどうなったか報告して下さい。
コンボボックスが空白だということなので改めて設定を確認していきます
コンボボックスには値集合ソースに「Q従業員抽出」が指定してあります。なのでコンボボックスにはクエリに内容が表示されているはずです
Q従業員抽出の抽出条件を削除して保存した後フォームを開きなおすとコンボボックスにはクエリと同じ内容が表示されますか?
これが確認出来たらQ従業員抽出の抽出条件を
Like "[ア-オ]*"
にして保存しなおした後、フォームを開きなおします。コンボボックスにはクエリと同じ内容が表示されますか?このような方法でクエリの内容をコンボボックスに表示することができることが確認できますが正しく動いていますか?
反応が遅く申し訳ありません。
クエリを削除して再度作り直すとこうなりました。
SELECT 基本情報.苗字
FROM 基本情報
WHERE (((基本情報.苗字カナ) Like [Forms]![基本情報1]![抽出用カナ]));
最初と違うのはわかりますが、それがどのように違うのかはわかりません。
クエリを実行してみて、パラメータ試しに[アーオ]*と入れてみたところ、結果はあ行の方の名字がきちんと1回ずつ表示されました!
ただ、現時点では「あ」のボタンを押した後のコンボボックスは空白です。
>> 11
試行錯誤するのであれば、主キーを消さずに出来る範囲で頑張る方がいいと思いますよ。絵に描いた餅になりそうで心配です。
テーブル同士に線を引く時は、データベースツールタブのリレーションシップがオススメです。参照整合性を設定できるので、リンク切れ、怪しいリンクを未然に防いでくれるでしょう。
もしかしたら、変動支払条件みたいなものがあるのかなぁ。
やった事がないので、ワークテーブル、フラグテーブルがセオリーなのかわかりません。何かあればどなたか回答をお願いします。