Private Sub btn_印刷_Click()
Dim rpt As Report
Dim PageCount As Integer
DoCmd.OpenReport "R_印刷", acViewPreview
Set rpt = Reports("R_印刷")
PageCount = rpt.Pages
Me.txb_総ページ数.Value = PageCount
End Sub
'標準モジュール
Option Compare Database
Option Explicit
Public Function MyFunction(MyVariable1 As Variant) As Variant
MsgBox MyVariable1 & "を受け取りました。"
MyFunction = 2
End Function
'フォームモジュール
Private Sub Cmd新規登録_Click()
Dim 結果 As Variant
結果 = MyFunction(1)
MsgBox "結果は" & 結果 & "です"
End Sub
Public Sub SequenceCheck()
Dim MinId As Long, MaxID As Long
MinId = DMin("ID", "T1"): MaxID = DMax("ID", "T1")
Dim StepNum As Long, SeqNum As Long
If DLookup("数値", "T1", "ID=" & MinId) < DLookup("数値", "T1", "ID=" & MaxID) Then
StepNum = 1 '昇順
SeqNum = MinId
Else
StepNum = -1 '降順
SeqNum = MaxID
End If
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM T1 ORDER BY 数値;")
Do Until rs.EOF
If rs!ID <> SeqNum Then
Debug.Print rs!ID
End If
SeqNum = SeqNum + StepNum
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Private Sub コンボ7_NotInList(NewData As String, Response As Integer)
MsgBox NewData & "は既に存在するために入力できません。"
Response = acDataErrContinue '既定のメッセージをユーザーに表示しない
End Sub
R_印刷のヘッダーにテキストボックスを配置し、コントロールソースを=[pages]としたところ、無事に入るようになりました!ありがとうございました。
レポートを開いているなら、取得できます。
レポート上のテキストボックスのコントロールソースの式に
[Pages]
がありますか。コントロールソースで
[Pages]
を参照していないと、0 になります。数値を昇順にした場合、ID全体が昇順または降順で連番になっているかどうかをチェック。←まさに、やりたいことです!
途中から昇順、降順が変わることはない。←IDは必ず、昇順か降順で飛び番号はありません
連番になっていないIDは、イミディエイトウィンドウに出力。
↑ではなく、テーブルに昇順×とや、降順で×とか表示したいです。できるのならば、フィールドは作成します
お願いいたします
こんな漢字で書いてみましたが、レポートは25ページあるにも関わらずtxb_総ページ数には0が表示されます。
「F_読み取り」内に配置した「btn_印刷」というコマンドボタンのクリック時イベントで「R_印刷」を開き、そのタイミングで「txb_総ページ数」というテキストボックスにページ数が表示されるようにしたいです。
このような場合でもレポートを閉じる処理をしなければならないのでしょうか?
レポートをプレビューで表示してない状態で取得したいということでしょうか。
だとしたらそれはできないので、プレビューを非表示で開いて総ページ数を取得して、プレビューを閉じるという処理が必要になります。
下記のページでちょうどその関数を紹介していますので、ご参考に。
レポートで印刷する前にページ数を取得する関数 - hatena chips
これについては、前回の投稿でも回答してますが、
標準モジュールの変数と同名のフォームのモジュールの変数を削除すれば変数に値が入るようになります。
それで、ステップ実行で動作を確認するといいでしょう。
それがうまくできたら、Functionでデータを引き渡したり、結果を戻す方法にトライするといいでしょう。
hatenaさん、
お騒がせしました。
アレコレ考えず、素直に試したところ
ご提示して頂いた方法で、希望のカタチに
なりました。ありがとうございました!
値集合ソースからSQLを入力するのが
初めてだったので、?となってしまいました。
また一つ勉強になりました。
ごめんなさい
ソースコードが長すぎて掲載することができません
Functionコードのご指導ありがとうございます^^
行き違いになり申し訳ございません。未熟な私が端折ったソースコードを提示し、ご指導を受けることは 先生方に失礼に当たると思い、きちんと現状でのすべてのソースコードを書いたうえで、ご指導を仰ぐつもりでおりました。
hatenaさんのご指導感謝いたします。勉強に励みます。
改めて ソースコードを掲載させていただきます。
あらためてきちんと全てのソースコードを書き直して再投稿させていただきます。今現在の状況です。ステップ実行で流れを確認しているのですが、MyVariable1に進めないです。変数に値が入らないです。新規登録に進めません。ご指導いただければ幸いです。最終的にはメインフォームに各地域を並べ、サブフォームにも一覧表にチェックボックスを並べ、一覧で閲覧および回数が把握できるようなものを作りたいと思っております。
ご指導 何卒宜しくお願い致します。
マイクロソフト アクセス365でメインフォームに都道府県をチェックぼっくで並べ、サブフォームにも都道府県チェックボックスを47都道府県ごとに一覧表を並べ、メインフォームから入力できるフォームを作りたいと思っています。未熟者で思うようにいかず苦しんでおります。
コンパイルエラーの部分は無視して、
これについて共通変数についての理解をもう一度確認してください。
メインフォーム
標準モジュールとメインフォームで同じ名前の変数を宣言していますが、
これによって格納されている値を共有できると勘違いしてませんか。
名前が同じでもこの変数は全く別物ですので値を共有しているわけではありません。
メインフォームで MyVriable1 に1を代入しても、メインフォーム内の変数 MyVriable1 に代入されるだけで、標準モジュールの MyVariable1 には何の変化もありません。
メインフォームの方の変数を削除してください。
そうすれば、標準モジュールの変数は Public で宣言しているので、メインフォームの方から参照可能になり、MyVariable1 に代入できるようになります。
Public宣言してない変数は、そのモジュール内でしか参照できません。
「VBA 変数 スコープ」をキーワードにWEB検索して解説ページで学習してください。
共通変数はいつでも、どこでも、だれでも使用できるので便利ではありますが、その分、コードが読みづらくなりますし、バグの原因になりやすいので、できれば避けたいです。
共通変数以外で、別モジュール間でデータをやりとりする方法は、
引数でデータを渡す、戻り値で結果を受け取る、という方法があります。
こちらの方法も学習して理解されることをお勧めします。
この方法の簡単なサンプルを提示しておきます。
これで共通変数なしでデータのやり取りができます。
データがどのように移動しているか読みやすいし、知らない間に変数の中身が変更されというような不安もなくなります。
「VBA 引数 戻り値」などをキーワードにWEB検索して学習されることをお勧めします。
会社の決まりでUSBでソースコードの持ち出しは禁止です。会社ではステップ実行まで他とりつき、コンパイルエラー 実行時エラーの類は出ませんが、変数に値が入りません。
私としてもソースコードを外部に持ち出したいのですが、厳禁なもので。。。;;
なにはともあれ早急なご対応ありがとうございます
お礼もせずに失礼な子だとは思われたくないので 一言感謝言葉を伝えたくメール書かせていただきました
ありがとうございました
提示のコードは実際のコードをコピーして貼り付けたものですか。
そのコードではステップ実行以前に、構文エラーで実行すらできないですが。
実際のコードを貼り付けてもらわないと回答のしようがありません。
なお、コードはMarkDown記法のコードブロック内にいれてください。
質問は、管理者権限で修正しておきました。
この掲示板の使い方の詳細は下記を参照してください。
Microsoft Access 掲示板 の使い方 Microsoft Access 掲示板 - zawazawa
下記のような仕様だと仮定して。
新しいフィールドを追加して、並び順を登録すればいいんじゃない?
繰返構文、変数値、インクリメント。
全体が昇順または降順ということですか。
それとも途中から昇順、降順が入れ替わることはありますか。
例えば、最初は昇順だったが、途中から降順に変わるとか。
また、昇順か降順かの判断基準はありますか。
もう少しデータ数の多いサンプルデータを提示してもらえますか。また、降順の場合のサンプルデータと昇順の場合のサンプルデータも提示してもらえますか。
下記が参考になるかと。
B.WH |AC : 帳票フォームで表示順に連番を付ける
帳票フォームに簡易な行番号(1,2,3…)を表示する - もう一度学ぶMS-Access
「数値を昇順」で「ID」は降順 ではなくて、「数値を昇順」で並べたときに、IDが連番になっていれば降順でも昇順でも構わないんです。
並び替え前のテーブルと、並び替えたクエリを数値フィールドで繋ぐってことでしょうか?
「数値を昇順」で「ID」は降順になっていてほしいということですか?
VBA内でDCount関数を使用するときは、参照するコントロールは文字列の外にだす必要があります。""内にいれたら単なる文字列ですのでコントロールを参照できません。下記のようにしてください。
ご希望のことは、
「F_機械設定入力」の「cmb_口座番号」には、「T_機械設定」にすでに存在している口座番号は入力できないようにしたい。
ということですよね。
ならば、メッセージを出すより、最初から「cmb_口座番号」のドロップダウンリストからすでに存在している口座番号を除いておいて選択できないようにするのがいいでしょう。
「cmb_口座番号」の値集合ソースに下記のSQLを設定。
「cmb_口座番号」のフォーカス取得時のイベントプロシージャを下記のように記述。
これで「T_機械設定」に既に存在する口座番号はリストに表示されないので選択できません。
リストから選択せずにテキストボックス部に直接入力した場合に備えて、
「cmb_口座番号」の「入力チェック」プロパティを「はい」に設定して、
リスト外入力時のイベントプロシージャを下記のように記述します。
レコードセット取得して前のレコードと今のレコードの値を比較したらいいんじゃないですかね?
数値フィールドで昇順に並べ替えたらIDの昇順連番は担保されません。
遅まきながら参加させてください(汗)。
hiroton さんがレスされていたように、時代は「クラウド」で「ノーコード」で「RPA」だ・・・とは思います。
自分は前任担当者が作りこんだRPAを使っている立場(エラーが出たら、そこだけ人力で解決する)ですが、
周りでVBA信者?みたいな人がいるので、困っています。
先日もインターネット上にアップロードするファイルのファイルサイズをチェック(1ファイルあたりの
上限が決まっている)するのに、「VBAで組んだらチェックできるし」と言われて目がテンになりました。
いやいや、そもそも「ファイル準備するときに担当者がファイルサイズ目視して確認すれば良くね?」って
思うんですよね。
RPAの処理のなかにアレコレ組み込みすぎると、その人がいなくなった時にメンテできなくなりますし、
困るじゃないですか。
(もともとRPAで参照しているDBがAccess DBなので、個人的にはRPAでも複雑な分岐処理を入れるのは
良くないと考えています。)
RPAだって万能ではないのに、VBA無敵?みたいな感じで「24時間、ノーチェック(要は無人でOK)で
処理できるから」と言い出して、他の担当者と「いや、それ無理ですよ」って伝えたのですが、
聞く耳持たず。。。
そもそもネットワーク遅延などの外的要因も関係するのに、「VBAサイコー!」とか「RPAは何でもOK!」
みたいな考えは(ご本人は自分のプログラミングスキルなどに自信があるのかもしれませんが)
キケンだと言いたいです。
こっちは運用のこととか、業務のことなどを広い視野で見て&考えて意見を伝えているのですが、
「自分が正しい」とか逆ギレしそうなので(昨年、外に出すモノの品質に問題があったので
問題点を伝えたところ、「自分が確認しているんだから問題ない!」と強い口調で言い返されたので、
それ以降は「知らぬ存ぜぬ」で当人に伝えることを諦めました)、
マジで困っています(泣)。
あ、愚痴みたいになってしまってスミマセン。。。
hatenaさん
先程ご提示していただいた文で、問題解決出来ました!!
ありがとうございます!
ハイパーリンクの構造を理解していない上に、非連結を使って入力をした事で混乱を招いてしまったのですね...。
申し訳ございませんでした。
VBA関連の書籍のキャッチフレーズに「現場で即使える」と謳われるものが沢山ありますが
現場から要求されるリクエストは、書籍に載っていないものが圧倒的多いように感じますので
hatenaさんの仰る通り、全ての要求に応えられるにはハイレベルのスキルが求められますね。
今回はハイパーリンクについて、hatenaさん・skさんに沢山学ばせていただきました。
長々とお付き合いいただき、改めてお礼申し上げます!ありがとうございます!
まだまだ聞きたいことは沢山あるのですが、それはまた改めて聞きたいと思います。
ありがとうございました!!これからもよろしくお願いいたします!
非連結フォームの設計は、連結フォームならAccessが自動でいろいろしてくれていることをすべて自前で処理する必要がでてきます。
非連結で設計するということは、このAccessが裏でやっていてくれてることを理解、把握しておく必要があります。
ハイパーリンクは格納されているデータと表示されているテキストが一致していないというのが、難しくなる原因です。
他にも日付/時刻型もそうです。
他にも型チェック、参照整合性チェックなど、考慮しなければならないことか多数あります。
複数ユーザーで共有する場合、排他処理なども必要になってきます。
これらのことをすべて実装するとなるとなまはんかのスキルでは無理です。
これらを実装できたとして、連結にくらべてどれほどのメリットがあるのかはなはだ疑問なので、
私自身は非連結はほとんど使いません。
複数ユーザーで共有する場合は、安定性を高めるために非連結にすべきという意見も散見しますが、
上記の点についての言及はほとんど見ません。
複数ユーザーで共有することで不安定になるような規模のシステムなら、すでにAccessではなく他のRDBを検討すべきだと思います。
あくまで私見ですので参考程度に。
以下に関しては私の推測です。試してみたわけではありまん。
まず、skさんの回答にもありましたがハイパーリンクの内部的な書式は下記になります。
ハイパーリンクを設定した非連結テキストボックスで、入力すると表示テキストのみになるのだと思われます。
つまりハイパーリンクアドレスは無し""という状態
対応策としては、ハイパーリンクアドレスがあればその前後に"#"を付ける。
なければ、表示テキストの前後に"#"を付ける。
このように状況、原因を調べて、対策を考えるという手順を踏みます。
あくまで、推測なのでこれでうまくいくとは限りません。
hatenaさん、長々とお付き合い頂いてありがとうございます。
skさんもありがとうございます!とても感謝しております!!
デバック方法については書籍を参考に試してみます。
特に急ぐようなことでは無いので、時間をかけて学習してみます。
ありがとうございました。
テーブル名 には実際にはどのような名前がはいってますか。
テーブル名に使用すべきでない文字が含まれているとそのようエラーになります。
そのような場合、名前の前後に"[" "]"を付けると回避できます。
下記のように変更したらどうでしょう。
可能ならばこのような特殊文字は使わないテーブル名に変更することをお勧めします。
Access データベースで特殊文字を使用したエラー - Microsoft 365 Apps | Microsoft Learn
skさんの#12の回答のSQLでどのような状態で格納されているか確認して、表示されない原因と対策を考えましょう。
私が思うに非連結でいくなら、テキストボックスの「ハイパーリンクあり」は「いいえ」に設定しておいた方がいいように思います。
実際にサンプルを作成して動作確認しているわけではないので、推測で提案しています。
非連結フォームの設計はかなりのスキルが要求されます。
連結でできていたものを、勉強のために非連結に変更しているということなので、
このような不具合を自分で解決できるようなスキルアップが必要ということです。
そのためにはまずはデバッグ方法を学習しましょう。
これを使って原因の追究、解決を繰り返すことによってスキルがアップします。
「VBA デバッグ」をキーワードにググれはいろいろ解説ページが見つかるので、
そこでデバッグの方法の理解を深めることをお勧めします。
hatenaさん
コンパイルエラーは解消されましたが、今度は直前にテキストボックスに入力したPC内のファイルパスが
更新ボタンをクリックしたと同時に消えてしまいます。私の書き方に問題ありますか?
何度もスミマセン。
今度は下記で「コンパイルエラー 変数が定義されていません」となりました。
If sAddress <> "" Then s = "#" & sAddress & "#"
あっ、すみません。タイプミスです。下記に修正してください。
If sAddress <> "" Then s = "#" & sAddress & "#"
私の 6 の回答でリンクを置いてます。
hatenaさん
提示していただいた文に差し替えてみたところ
「コンパイルエラー 変数が定義されていません」となり
If sAddress <> "" Then s = "#" & Address & "#"
となりました。
HyperlinkPartという関数、初め見たかもしれません。
勉強になります!
今回の場合はどちらでもいいでしょう。
例えば、特定の条件の場合はフォーカスさせずに別のコントロールにフォーカスさせたいというような場合は、取得時でないとだめですね。ただ、このような設計はたいてい悪手ですね。
特定の条件を満たすまで使用不可にしておくとか、、、ほかの方法を検討した方かいいです。
こんな感じでどうでしょうか。
下記の文ですと、パスの前後に"が付いた状態で書き込まれていました。
そして、修正文ありがとうございます。
早速試してみました。
遅くなりました。
まずは「T_特記事項」「T_クレーム履歴」に関するSELECT文です。