Microsoft Access 掲示板

views
4 フォロー
6,283 件中 641 から 680 までを表示しています。
3

KeyCode = 0 でキー入力をキャンセルしようとしているのだと思いますが、残念ながらそれでは動きません。

キークリック時の自動生成されるイベントプロシージャをみると、下記のようになっています。

Private Sub テキスト0_KeyDown(KeyCode As Integer, Shift As Integer)

End Sub

引数に KeyCode というのがありますが、この引数に 0 を代入することでキー入力がなかったことになります。
別のプロシージャ内の変数 KeyCode とは何の関連もないので、別のプロシージャで KeyCode=0 としても意味はないです。

このような場合は、別プロシージャで、イベントプロシージャの KeyCode を参照渡しで渡せば、別のプロシージャ内でも、KeyCode にアクセスできるようになります。

フォームモジュール

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

引数には値渡し(ByVal)と参照渡し(ByRef)がありますが、その違いについてはWEB検索して研究してみてください。

13
驚天動地!前任者失踪丸 2024/03/06 (水) 13:36:35 23e8e@44ebd

回答でも何でもないただの感想なのですが、都道府県と市町村がずらっと並んでて、その数だけチェックボックスがある入力フォーム・・・目が疲れそうです^^;

2
hiroton 2024/03/06 (水) 12:35:39 20532@f966d

回答の前に、その「モジュール」はどのように作られたものですか?

(VBAとしてという意味ではなく)一般的には、そのプロシージャは動きません。構文エラーが発生します

https://www.google.com/search?q=option explicit
VBEのオプション設定のお勧めを徹底解説(hatena chipsさん)

1
XS 2024/03/06 (水) 12:32:52 ddfe5@52efc

先ほど投稿したのですが1点間違いに気がつきました。プロシージャの Exit Subは他の箇所には無効となりますね。
そこを修正して試してみます。それで上手く行かないときはまた投稿します。
宜しくお願いします。

12
rinrin 2024/03/05 (火) 20:30:06 b4dc9@c7f00

メインフォームには
コンボボックスが四つ
☆ID
☆担当者
☆都道府県
☆最寄駅
テキストボックスが三つ
☆開始日
☆終了日
☆備考
それと市区町村が50個くらい並んでます。。。。。。。。;;

それとサブフォームがあります。。。。。。。^^

4
XS 2024/03/05 (火) 15:45:23 ddfe5@52efc

hatenaさん重ね重ねありがとうございます。「VBA スコープ」少し調べました。記述位置以外にも Private、Publicで範囲が変わってきますね。使いこなすことが出来れば大分コードが集約されそうです。参考になりました。
OpenArgsも初めて知りました。これも重宝しそうです。
大変お世話になりました。

3

ものすごく初歩的な質問なのですが Private rptName As String  はVBA画面の一番上に記述するから参照出来るのですね?(フォーム内の色々な所に)

モジュールレベル変数となり、モジュール内のコードならどこからでも参照できる変数になります。他のモジュールからは参照できません。

どの範囲で参照できるかをスコープといいます。「VBA スコープ」のキーワードにWEB検索してみてください。解説ページがいろいろ見つかると思いますので研究してみてください。


レポート上に小さい埋め込み画像があります。この画像を条件により表示/非表示にしたいのです。このレポートは入力フォーム上のボタンでプレビューさせ、フォーム上の画像あり/なしのオプションボタンで条件設定をしようと考えてます。

フォーム上のプレビューボタンでレポートをプレビューするときに、Docmd.OpenReportメソッドの OpenArgs引数でオプショングループの値を渡せばいいでしょう。

下記のような設定と仮定します。

オプショングループ

名前関連付けされたラベルの標題
フレーム1小さい埋め込み画像

このオプショングループ内に下記のオプションボタンが2つ配置してある

名前オプション値関連付けされたラベルの標題
opt表示1表示
opt非表示2非表示

プレビューボタンクリック時

Private Sub プレビューボタン_Click()
    DoCmd.OpenReport "レポート1", acViewPreview, "", "", acWindowNormal, Me.フレーム1.Value
End Sub

レポートの読み込み時

Private Sub Report_Load()
    If OpenArgs = 1 Then
        Me.イメージ1.Visible = True
    Else
        Me.イメージ1.Visible = False
    End If
End Sub
2
XS 2024/03/05 (火) 12:28:35 ddfe5@52efc

hatenaさん ありがとうございます。このコードで上手くいきました。Screen.ActiveReportの事は初めて知りました。
ものすごく初歩的な質問なのですが Private rptName As String  はVBA画面の一番上に記述するから参照出来るのですね?(フォーム内の色々な所に)
あともう一つの質問の方の レポート上に小さい埋め込み画像(イメージ1)の表示有無はどうやって実現可能でしょうか?

1

入力用フォームに配置したコマンドボタンでレポートプレビューさせた時にオリジナルの簡単な印刷設定フォーム(名前:F印刷設定)も一緒に開く様にしてます。

レポートをプレビューした直後に印刷設定フォームも開くということですね。
ならば、Screen.ActiveReport で直前に開いたレポートを取得できますので、それを利用すればどうでしょう。

F印刷設定のフォームモジュール

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
5
驚天動地!前任者失踪丸 2024/03/05 (火) 10:42:57 23e8e@44ebd >> 4

素晴らしいです、上手く抽出することが出来ました。
ありがとうございます。

疑問なのですが、何故

Like "[社名1]*"

ではなく

Like [社名1] & "*"

なのでしょうか??

4

デザインビューで下記でどうでしょう。

フィールド社名2
テーブルT_会社マスター
レコードの更新Replace([社名2],[社名1],"")
抽出条件Like [社名1] & "*"
11

直前の投稿に対する返信だと思いますが、その投稿者は私(hatena)ではありません。
skさんの投稿です。

3
驚天動地!前任者失踪丸 2024/03/05 (火) 08:37:25 23e8e@44ebd >> 2

Hatenaさん、こちらわかりますでしょうか?

10
rinrin 2024/03/04 (月) 20:35:11 b4dc9@c7f00

hatenaさん。。。。。。。いつもいつもほんとにありがとうございます。。。。。
ご指導何卒宜しくお願い致します。。。^^

メインフォーム サブフォームどっちも非連結です。。。※そこは何も変換してません。。。
前述したように、、、48の都道府県を選び、、、そこに更に該当する市区町村を選択し、、、最後に住所の詳細を記入するユーザーフォームを作りたいと思っています。。。^^
結構件数があり、、、人でも限られているので、、、少しでも効率的なプログラムを作りたいと思っております。。。^^

テーブルは4つあり、、、リレーションシップで最初につなげてあります。。。^^(※クエリじゃないです。。;;)
メインとなる軸のテーブル名は”MST実査実績一覧”で、、、
ID :オートナンバー型
年月日 :日付/時刻型
担当者 :短いテキスト
都道府県 :数値型
北海道 :Yes/No型

沖縄 :Yes/No型
実査住所 :短いテキスト
(※最後にここに正式な住所を作成し、、、サブフォーム(テーブル)に格納したいと思っております。。。^^)
最寄駅 :短いテキスト
駅から目的地までの公共手段
:数値型
役職名 :数値型
実査flg :Yes/No型

二つ目のテーブル名が”MST都道府県”です。。。。。
id :オートナンバー型
都道府県名 :短いテキスト

三つ目のテーブル名が"MST役職名"
ID :オートナンバー型
役職名 :短いテキスト

最後が "MST駅から目的地までの手段"です。。。。。。
ID :オートナンバー型
駅から目的地までの手段
:短いテキスト
4っつのテーブルをリレーションシップした状態で、、、サブフォームに、、、一覧表として設定してます。。。

hatenaさんのおかげで、、、ドンガメ状態でも なんとかメインフォームから市区町村まで、、、チェックを入れることはできたんですけど、、、、
最後にそれを選択し、、、詳細を記入する段階で、、、エラーが出ちゃいます。。。
☆確か二度目のチェックボックスの値が サブフォームに収まった状態で、、、テキストボックスに詳細を記入して登録しようとすると、、、
オブジェクトが必要ですとか、、、実行時エラーが表示されちゃいます。。。。。。。;;ソースコード持ち出せない。。。;;わかんないです。。::

開示できる情報の全てです。。。^^
何卒宜しくお願い致します

6
ssassakki 2024/03/04 (月) 11:38:56 27741@c61b7 >> 3

hirotonさん、castするかdatetime型に変更するのは最後の手段にしたいです。
接続方法で回避は出来そうです。

5
ssassakki 2024/03/04 (月) 11:28:43 27741@c61b7

toneさん、貴重な情報ありがとうございます。
せめてMS社が提供している各接続方法の結果は統一して欲しいですね。

いろいろ試した結果
NativeClient 〇/oledb ×/microsoft odbc driver17 〇
理由は不明

9

メインフォームに"txt住所"という名前のテキストボックスと”cmd新規登録”という名前のコマンドボタンと、チェックボックス48個都道府県があります。これと”Chk実査flg”という名前のチェックボックスがあります。

1回目のcmd新規登録をクリックし、サブフォームへの入力が許可されます。

2回目のchk新規入力ボタンをクリックすると
選んだ都道府県が テキストボックスに表示

3回目のcmd新規入力コマンドボタンをクリックして確定して、
サブフォームにレコードが収まる

これらの機能を1つのコマンドボタンに集約しているのであれば、ソースコード云々以前にフォームの設計自体に問題があると申し上げざるを得ません。

実行時エラーが表示され、、、オブジェクトが必要ですと、実行時エラーが表示されちゃいます

どのステートメントを実行しようとした時にその実行時エラーが発生したのかを具体的に明記して下さい。

'ADO接続開始
Dim Cn ADODB.Connection
Dim Rs ADODB.Recordset

もし上記のステートメントを本当にこの通りに記述されているのであれば、変数名と型の間に As キーワードが記述されていないため、実行時エラーどころかコンパイルエラーが発生するはず。

Rs.Open"MST実査実績一覧",Cn, adOpenKeyset, adLockOptimistic

また、Cn にも Rs にも何のオブジェクトも渡されていない状態なのであれば、このステートメントでも実行時エラーが発生します。

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

そこは Exit Sub ステートメントを呼び出すべきタイミングではないでしょう。

Update

Rs.Update

現状(あからさまに判る範囲で)修正すべき箇所として挙げられるのは以上のみ。
他のステートメントについては、現時点では評価のしようがありません。

  • メインフォームは連結フォームであるか、それとも非連結フォームであるか。

  • メインフォームが連結フォームである場合、メインフォームのレコードソースはどのテーブルであるか。

  • (サブフォームのレコードソースであると思われる)テーブル[MST実査実績一覧]の定義内容(各フィールドの名前/データ型およびキー定義)

とりあえず、以上の点について明示されることをお奨めします。

参照先のテーブルについての情報も判らない状況では、rinrin さんが求められている「正しいソースコード」を提示することなど誰にもできないでしょう。

6
あん 2024/03/04 (月) 09:55:57 b41ab@001b1

hatena様

いろいろご回答ありがとうございます。

サブデータシートかレポートの重複データ非表示よりポップアップフォームでの更新かのどちらかでやってみます。

両方作ってみて見栄えや操作のしやすさなどでどちらか決めたいと思います。

8
名前なし 2024/03/03 (日) 16:48:58 eec97@9f7fc

削除テキスト市区町村まではテキストボックスに入るんです。。。
それ以下入力するとエラーが出ちゃうんです。。。
何がいけないんですか?どこを修正 どうすればいいんですか?

7
rinrin 2024/03/03 (日) 08:43:00 b4dc9@c7f00

ソースコードのアドバイスが何も来ないの。。。。。;;

6
rinrin 2024/03/02 (土) 21:29:24 b4dc9@c7f00

でも。。。。。。あたしの質問は
コンボボックスで選択した都道府県に。。。市を選択して
そこから手入力で 住所の細部を記入して、、、再度 テキストボックス(※DB)に戻したいってことなんですけど。。。
ちょっと回答が   ずれちゃってるような気がするんですけど。。。。。。。。^^ごめんなさい。。。;;

5
rinrin 2024/03/02 (土) 21:24:11 b4dc9@c7f00

わかりました。。。。。。ありがとうございます
これはこれで取り組みますね

4
りんご 2024/03/02 (土) 21:05:06 07313@0e907

 都道府県を入力するだけなのに、かっこつけてもしょうがないです。
 例えば、人参を切って、インスタ!大根を切って、インスタ!インスタしないと料理が出来ない、残念みたいな感じになると悲しみ。
 Accessは伝統芸能なので、先人の作品をの忠実に守るとお得。貴方の頑張りは一旦保留して、Accessを卒業してから役立てると丸。
 これって私の意見に過ぎないので、コードのアドバイスは気長に待てば3名ぐらいから回答が来るはず。

3
rinrin 2024/03/02 (土) 20:22:12 b4dc9@c7f00

回答ありがとうございます

でも あたしが頑張ってもうそれなりに作りこんであります。。。。他の人に作らせているみたいで。。。;;
だから上記のプログラムをどう修正したらいいのか???
正しいソースコードの書き方 
教えていただけませんでしょうか
よろしくお願い致します

1
rinrin 2024/03/02 (土) 14:41:55 b4dc9@c7f00

なんで誰も教えてくれないの。。。。。。。。。。。;;

5

あるいは、データをエクセルに出力してそこで入力してもらって、エクセル上のボタンクリックでAccessのテーブルを更新するとか。

4

もう一つの案としては、レポートだと重複データ非表示の機能があるのでそれを使うというのもありますね。
レポートビュー表示にすればテキストボックスをクリックできますので、クリックしたときにポップアップフォームを表示させてそこで一側のデータを入力させて、そのデータでテーブルを更新する、その後レポートを再クエリという処理をVBAで構築することになりますね。

3

一対多のテーブルを連結したクエリでは、一側のデータは複数表示されるのはデーターベース的には仕方ないことです。

イメージとしてはエクセルでのセル連結みたいなことがしたいのだと思いますが、それを帳票フォームで実現するのは難しいですね。

メイン/サブフォーム形式のフォームをデータシートビューにすると、多側のデータをサブデータシートとして展開できる表示になります。これを使うのはどうでしょうか。

サブデータシートというのは下記のリンク先の画像のように左端の+ボタンをクリックすると子データシートが展開するものです。

サブデータシート - もう一度学ぶMS-Access

フォーム上にデータシートとサブデータシートを表示する - もう一度学ぶMS-Access

3

コピーすることで、破損部分が修復されたのかな、と思います。

内部的な動作は1ユーザーからは分かりませんが、
イメージとしては、フォームの設定データ(プロパティとかコントロールのレイアウト)を元に作成しなおしているのかなと思ってます。

2
驚天動地!前任者失踪丸 2024/03/01 (金) 17:11:25 23e8e@44ebd

回答ありがとうございます。

閉じる時の最適化は毎回しています。

当該のフォームのコピーを取って削除、コピーしたフォームの名前をもとに戻してみたところ、エラーが出なくなりました。
破損が原因ならコピーと名前変更で直るのはおかしな話だなぁと思うのですが、、、

2
驚天動地!前任者失踪丸 2024/03/01 (金) 16:48:53 23e8e@44ebd >> 1

回答ありがとうございます。
最初の質問で例示したパターンについては上手く置換できました!

社名1社名2
株式会社A株式会社A東京営業所

社名1社名2
株式会社A株式会社A

等もまとめて抽出・置換することはできますでしょうか?

2
あん 2024/03/01 (金) 16:37:02 b41ab@001b1

hatena様

ご回答ありがとうございます。

言葉足らずで、すみません。

すでに残業のデータを、メイン/サブフォーム形式で個人個人が入力してあり、
そのデータの一覧を表示(今回のフォーム)し、承認者が承認するということになります。

1

一対多の関係のテーブルですので、Accessでは通常、メイン/サブフォーム形式のフォームで入力作業をすることになります。

Accessのフォームのメイン/サブフォームとは | できるネット

ACCESS サブフォームの作成方法 - たすけてACCESS

1

デザインビューで更新クエリにして、下記のように設定してください。

フィールド社名2
テーブルT_会社マスター
レコードの更新Replace([社名2],[社名1] & " ","")
抽出条件Like [社名1] & " *"

SQLでは

UPDATE T_会社マスター
SET T_会社マスター.社名2 = Replace([社名2],[社名1] & " ","")
WHERE T_会社マスター.社名2 Like [社名1] & " *";
1

データベースファイルの破損かもしれません。

まずは、「最適化/修復」を実行してください。

それで、だめなら、新規データベースを作成して、そこに現在のデータベースのオブジェクトをすべてインポートして、そのデータベースで操作してみてください。

それでだめなら、バックアップファイルを使用するようにしてください。

バックアップファイルがないのなら、
エラーになるフォーム以外を新規データベースにインポートして、エラーになるフォームは一から作成しなおしてください。

1

終了のテキストボックスのコントロールソースに下記の式を設定すればいいでしょう。

=Format([終了],"hh:nn") & IIf(Day([開始])<>Day([終了]),Format([終了], "(dd)"),"")
4

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 テーブル;

3
hiroton 2024/02/29 (木) 11:51:07 修正 3c737@f966d

その日付のようなテキストをACCESSで日付として認識させたいのなら、データ型変換関数で変換してあげればいいんじゃないですかね

CDate([日付])

どこまでのことを望んでるのか分かりませんが、SQL Server側で、ということであればテキストで保存されているデータを数値データ(日付のシリアル値)に変換して受け取るとかになるんですかね

CAST および CONVERT (Transact-SQL)

1
りんご 2024/02/28 (水) 21:42:37 935bc@0e907

具体的な情報を開示しない限り回答不可能じゃないかしら?
例えば、肉じゃがの作り方を教えて下さい。自分でやったら、味が変と苦情が出ちゃいます。どう対処したらいいのか、回答できますか?