Private Sub proKey1(ByRef KeyCode As Integer)
If KeyCode = 9 Or KeyCode = 17 Or KeyCode = 67 Then 'Tab・Ctrl・C キーのみ使える
Exit Sub
Else
KeyCode = 0 'Tab・Ctrl・C キー以外は禁止
End If
End Sub
Private Sub コンボ_KeyDown(KeyCode As Integer, Shift As Integer)
Call proKey1(KeyCode)
End Sub
Option Compare Database
Option Explicit
Private rptName As String
Private Sub Form_Open(Cancel As Integer)
On Error Resume next
rptName = Screen.ActiveReport.Name
If Err <> 0 Then
Cancel = True
MsgBox "レポートが開いていません。"
End If
End Sub
Private Sub ボタン1_Click()
If vbOK = MsgBox("直ちに印刷を開始します。", vbOKCancel) Then
DoCmd.OpenReport rptName, acViewNormal, "", "", acNormal
Else
MsgBox "印刷処理を中止します。", vbCritical
End
End If
End Sub
Private Sub ボタン2_Click()
DoCmd.SelectObject acReport, rptName, False
DoCmd.RunCommand acCmdPrint
End Sub
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Set Cn = CurrentProject.Connection
Set Rs = New ADODB.Recordset
Rs.Open "MST実査実績一覧", Cn, adOpenKeyset, adLockOptimistic
If Me.Chk北海道.Value=True Then
Me.Txt住所.Value = "北海道札幌市"
Rs!実査住所 = Me.Chk北海道札幌市.Value
Rs!実査住所 = Me.Txt実査住所.Value Exit Sub
End If
KeyCode = 0 でキー入力をキャンセルしようとしているのだと思いますが、残念ながらそれでは動きません。
キークリック時の自動生成されるイベントプロシージャをみると、下記のようになっています。
引数に KeyCode というのがありますが、この引数に 0 を代入することでキー入力がなかったことになります。
別のプロシージャ内の変数 KeyCode とは何の関連もないので、別のプロシージャで KeyCode=0 としても意味はないです。
このような場合は、別プロシージャで、イベントプロシージャの KeyCode を参照渡しで渡せば、別のプロシージャ内でも、KeyCode にアクセスできるようになります。
フォームモジュール
引数には値渡し(ByVal)と参照渡し(ByRef)がありますが、その違いについてはWEB検索して研究してみてください。
回答でも何でもないただの感想なのですが、都道府県と市町村がずらっと並んでて、その数だけチェックボックスがある入力フォーム・・・目が疲れそうです^^;
回答の前に、その「モジュール」はどのように作られたものですか?
(VBAとしてという意味ではなく)一般的には、そのプロシージャは動きません。構文エラーが発生します
https://www.google.com/search?q=option explicit
VBEのオプション設定のお勧めを徹底解説(hatena chipsさん)
先ほど投稿したのですが1点間違いに気がつきました。プロシージャの Exit Subは他の箇所には無効となりますね。
そこを修正して試してみます。それで上手く行かないときはまた投稿します。
宜しくお願いします。
メインフォームには
コンボボックスが四つ
☆ID
☆担当者
☆都道府県
☆最寄駅
テキストボックスが三つ
☆開始日
☆終了日
☆備考
それと市区町村が50個くらい並んでます。。。。。。。。;;
それとサブフォームがあります。。。。。。。^^
hatenaさん重ね重ねありがとうございます。「VBA スコープ」少し調べました。記述位置以外にも Private、Publicで範囲が変わってきますね。使いこなすことが出来れば大分コードが集約されそうです。参考になりました。
OpenArgsも初めて知りました。これも重宝しそうです。
大変お世話になりました。
モジュールレベル変数となり、モジュール内のコードならどこからでも参照できる変数になります。他のモジュールからは参照できません。
どの範囲で参照できるかをスコープといいます。「VBA スコープ」のキーワードにWEB検索してみてください。解説ページがいろいろ見つかると思いますので研究してみてください。
フォーム上のプレビューボタンでレポートをプレビューするときに、Docmd.OpenReportメソッドの OpenArgs引数でオプショングループの値を渡せばいいでしょう。
下記のような設定と仮定します。
オプショングループ
このオプショングループ内に下記のオプションボタンが2つ配置してある
プレビューボタンクリック時
レポートの読み込み時
hatenaさん ありがとうございます。このコードで上手くいきました。Screen.ActiveReportの事は初めて知りました。
ものすごく初歩的な質問なのですが Private rptName As String はVBA画面の一番上に記述するから参照出来るのですね?(フォーム内の色々な所に)
あともう一つの質問の方の レポート上に小さい埋め込み画像(イメージ1)の表示有無はどうやって実現可能でしょうか?
レポートをプレビューした直後に印刷設定フォームも開くということですね。
ならば、Screen.ActiveReport で直前に開いたレポートを取得できますので、それを利用すればどうでしょう。
F印刷設定のフォームモジュール
素晴らしいです、上手く抽出することが出来ました。
ありがとうございます。
疑問なのですが、何故
ではなく
なのでしょうか??
デザインビューで下記でどうでしょう。
直前の投稿に対する返信だと思いますが、その投稿者は私(hatena)ではありません。
skさんの投稿です。
Hatenaさん、こちらわかりますでしょうか?
hatenaさん。。。。。。。いつもいつもほんとにありがとうございます。。。。。
ご指導何卒宜しくお願い致します。。。^^
メインフォーム サブフォームどっちも非連結です。。。※そこは何も変換してません。。。
前述したように、、、48の都道府県を選び、、、そこに更に該当する市区町村を選択し、、、最後に住所の詳細を記入するユーザーフォームを作りたいと思っています。。。^^
結構件数があり、、、人でも限られているので、、、少しでも効率的なプログラムを作りたいと思っております。。。^^
テーブルは4つあり、、、リレーションシップで最初につなげてあります。。。^^(※クエリじゃないです。。;;)
メインとなる軸のテーブル名は”MST実査実績一覧”で、、、
ID :オートナンバー型
年月日 :日付/時刻型
担当者 :短いテキスト
都道府県 :数値型
北海道 :Yes/No型
⇃
沖縄 :Yes/No型
実査住所 :短いテキスト
(※最後にここに正式な住所を作成し、、、サブフォーム(テーブル)に格納したいと思っております。。。^^)
最寄駅 :短いテキスト
駅から目的地までの公共手段
:数値型
役職名 :数値型
実査flg :Yes/No型
二つ目のテーブル名が”MST都道府県”です。。。。。
id :オートナンバー型
都道府県名 :短いテキスト
三つ目のテーブル名が"MST役職名"
ID :オートナンバー型
役職名 :短いテキスト
最後が "MST駅から目的地までの手段"です。。。。。。
ID :オートナンバー型
駅から目的地までの手段
:短いテキスト
4っつのテーブルをリレーションシップした状態で、、、サブフォームに、、、一覧表として設定してます。。。
hatenaさんのおかげで、、、ドンガメ状態でも なんとかメインフォームから市区町村まで、、、チェックを入れることはできたんですけど、、、、
最後にそれを選択し、、、詳細を記入する段階で、、、エラーが出ちゃいます。。。
☆確か二度目のチェックボックスの値が サブフォームに収まった状態で、、、テキストボックスに詳細を記入して登録しようとすると、、、
オブジェクトが必要ですとか、、、実行時エラーが表示されちゃいます。。。。。。。;;ソースコード持ち出せない。。。;;わかんないです。。::
開示できる情報の全てです。。。^^
何卒宜しくお願い致します
hirotonさん、castするかdatetime型に変更するのは最後の手段にしたいです。
接続方法で回避は出来そうです。
toneさん、貴重な情報ありがとうございます。
せめてMS社が提供している各接続方法の結果は統一して欲しいですね。
いろいろ試した結果
NativeClient 〇/oledb ×/microsoft odbc driver17 〇
理由は不明
これらの機能を1つのコマンドボタンに集約しているのであれば、ソースコード云々以前にフォームの設計自体に問題があると申し上げざるを得ません。
どのステートメントを実行しようとした時にその実行時エラーが発生したのかを具体的に明記して下さい。
もし上記のステートメントを本当にこの通りに記述されているのであれば、変数名と型の間に As キーワードが記述されていないため、実行時エラーどころかコンパイルエラーが発生するはず。
また、Cn にも Rs にも何のオブジェクトも渡されていない状態なのであれば、このステートメントでも実行時エラーが発生します。
そこは Exit Sub ステートメントを呼び出すべきタイミングではないでしょう。
現状(あからさまに判る範囲で)修正すべき箇所として挙げられるのは以上のみ。
他のステートメントについては、現時点では評価のしようがありません。
メインフォームは連結フォームであるか、それとも非連結フォームであるか。
メインフォームが連結フォームである場合、メインフォームのレコードソースはどのテーブルであるか。
(サブフォームのレコードソースであると思われる)テーブル[MST実査実績一覧]の定義内容(各フィールドの名前/データ型およびキー定義)
とりあえず、以上の点について明示されることをお奨めします。
参照先のテーブルについての情報も判らない状況では、rinrin さんが求められている「正しいソースコード」を提示することなど誰にもできないでしょう。
hatena様
いろいろご回答ありがとうございます。
サブデータシートかレポートの重複データ非表示よりポップアップフォームでの更新かのどちらかでやってみます。
両方作ってみて見栄えや操作のしやすさなどでどちらか決めたいと思います。
削除テキスト市区町村まではテキストボックスに入るんです。。。それ以下入力するとエラーが出ちゃうんです。。。
何がいけないんですか?どこを修正 どうすればいいんですか?
ソースコードのアドバイスが何も来ないの。。。。。;;
でも。。。。。。あたしの質問は
コンボボックスで選択した都道府県に。。。市を選択して
そこから手入力で 住所の細部を記入して、、、再度 テキストボックス(※DB)に戻したいってことなんですけど。。。
ちょっと回答が ずれちゃってるような気がするんですけど。。。。。。。。^^ごめんなさい。。。;;
わかりました。。。。。。ありがとうございます
これはこれで取り組みますね
都道府県を入力するだけなのに、かっこつけてもしょうがないです。
例えば、人参を切って、インスタ!大根を切って、インスタ!インスタしないと料理が出来ない、残念みたいな感じになると悲しみ。
Accessは伝統芸能なので、先人の作品をの忠実に守るとお得。貴方の頑張りは一旦保留して、Accessを卒業してから役立てると丸。
これって私の意見に過ぎないので、コードのアドバイスは気長に待てば3名ぐらいから回答が来るはず。
回答ありがとうございます
でも あたしが頑張ってもうそれなりに作りこんであります。。。。他の人に作らせているみたいで。。。;;
だから上記のプログラムをどう修正したらいいのか???
正しいソースコードの書き方
教えていただけませんでしょうか
よろしくお願い致します
これじゃダメ?
2つのコンボボックスを連動し表示させる-Access
なんで誰も教えてくれないの。。。。。。。。。。。;;
あるいは、データをエクセルに出力してそこで入力してもらって、エクセル上のボタンクリックでAccessのテーブルを更新するとか。
もう一つの案としては、レポートだと重複データ非表示の機能があるのでそれを使うというのもありますね。
レポートビュー表示にすればテキストボックスをクリックできますので、クリックしたときにポップアップフォームを表示させてそこで一側のデータを入力させて、そのデータでテーブルを更新する、その後レポートを再クエリという処理をVBAで構築することになりますね。
一対多のテーブルを連結したクエリでは、一側のデータは複数表示されるのはデーターベース的には仕方ないことです。
イメージとしてはエクセルでのセル連結みたいなことがしたいのだと思いますが、それを帳票フォームで実現するのは難しいですね。
メイン/サブフォーム形式のフォームをデータシートビューにすると、多側のデータをサブデータシートとして展開できる表示になります。これを使うのはどうでしょうか。
サブデータシートというのは下記のリンク先の画像のように左端の+ボタンをクリックすると子データシートが展開するものです。
サブデータシート - もう一度学ぶMS-Access
フォーム上にデータシートとサブデータシートを表示する - もう一度学ぶMS-Access
コピーすることで、破損部分が修復されたのかな、と思います。
内部的な動作は1ユーザーからは分かりませんが、
イメージとしては、フォームの設定データ(プロパティとかコントロールのレイアウト)を元に作成しなおしているのかなと思ってます。
回答ありがとうございます。
閉じる時の最適化は毎回しています。
当該のフォームのコピーを取って削除、コピーしたフォームの名前をもとに戻してみたところ、エラーが出なくなりました。
破損が原因ならコピーと名前変更で直るのはおかしな話だなぁと思うのですが、、、
回答ありがとうございます。
最初の質問で例示したパターンについては上手く置換できました!
や
等もまとめて抽出・置換することはできますでしょうか?
hatena様
ご回答ありがとうございます。
言葉足らずで、すみません。
すでに残業のデータを、メイン/サブフォーム形式で個人個人が入力してあり、
そのデータの一覧を表示(今回のフォーム)し、承認者が承認するということになります。
一対多の関係のテーブルですので、Accessでは通常、メイン/サブフォーム形式のフォームで入力作業をすることになります。
Accessのフォームのメイン/サブフォームとは | できるネット
ACCESS サブフォームの作成方法 - たすけてACCESS
デザインビューで更新クエリにして、下記のように設定してください。
SQLでは
データベースファイルの破損かもしれません。
まずは、「最適化/修復」を実行してください。
それで、だめなら、新規データベースを作成して、そこに現在のデータベースのオブジェクトをすべてインポートして、そのデータベースで操作してみてください。
それでだめなら、バックアップファイルを使用するようにしてください。
バックアップファイルがないのなら、
エラーになるフォーム以外を新規データベースにインポートして、エラーになるフォームは一から作成しなおしてください。
終了のテキストボックスのコントロールソースに下記の式を設定すればいいでしょう。
SQL Server + Accessで開発する場合、SQL Serverでdate型は使っていません。
ご指摘のようなトラブルが発生するためです。
date (Transact-SQL)
下位クライアントの下位互換性
https://learn.microsoft.com/ja-jp/sql/t-sql/data-types/date-transact-sql?view=sql-server-ver16#backward-compatibility-for-down-level-clients
どうしても使う場合は、Accessへ渡す前にdatetime型に型変換しています。
SELECT Cast([日付] as datetime) AS 日付 FROM テーブル;
その日付のようなテキストをACCESSで日付として認識させたいのなら、データ型変換関数で変換してあげればいいんじゃないですかね
どこまでのことを望んでるのか分かりませんが、SQL Server側で、ということであればテキストで保存されているデータを数値データ(日付のシリアル値)に変換して受け取るとかになるんですかね
CAST および CONVERT (Transact-SQL)
具体的な情報を開示しない限り回答不可能じゃないかしら?
例えば、肉じゃがの作り方を教えて下さい。自分でやったら、味が変と苦情が出ちゃいます。どう対処したらいいのか、回答できますか?