Private Sub cb1_AfterUpdate()
setFilter
End Sub
Private Sub cb2_AfterUpdate()
setFilter
End Sub
Private Sub cb3_AfterUpdate()
setFilter
End Sub
Private Sub setFilter()
'フィルタをかける処理
End Sub
Public Sub SequenceCheck3()
Dim MinId As Long, MaxID As Long
MinId = DMin("ID", "T1"): MaxID = DMax("ID", "T1")
Dim StepNum As Long, SeqNum As Long, stOrder As String
If DLookup("数値", "T1", "ID=" & MinId) < DLookup("数値", "T1", "ID=" & MaxID) Then
StepNum = 1 '昇順
SeqNum = MinId
stOrder = "昇順"
Else
StepNum = -1 '降順
SeqNum = MaxID
stOrder = "降順"
End If
CurrentDb.Execute "UPDATE T1 SET 連番チェック = Null WHERE Not 連番チェック Is Null;"
Dim sSQL As String
sSQL = "SELECT * FROM T1 ORDER BY 数値, ID"
If stOrder = "降順" Then sSQL = sSQL & " DESC"
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(sSQL)
Do Until rs.EOF
If rs!ID <> SeqNum Then
rs.Edit
rs!連番チェック = stOrder & "×"
rs.Update
End If
SeqNum = SeqNum + StepNum
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
Public Sub SequenceCheck2()
Dim MinId As Long, MaxID As Long
MinId = DMin("ID", "T1"): MaxID = DMax("ID", "T1")
Dim StepNum As Long, SeqNum As Long, stOrder As String
If DLookup("数値", "T1", "ID=" & MinId) < DLookup("数値", "T1", "ID=" & MaxID) Then
StepNum = 1 '昇順
SeqNum = MinId
stOrder = "昇順"
Else
StepNum = -1 '降順
SeqNum = MaxID
stOrder = "降順"
End If
CurrentDb.Execute "UPDATE T1 SET 連番チェック = Null WHERE Not 連番チェック Is Null;"
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM T1 ORDER BY 数値;")
Do Until rs.EOF
If rs!ID <> SeqNum Then
rs.Edit
rs!連番チェック = stOrder & "×"
rs.Update
End If
SeqNum = SeqNum + StepNum
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
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
プログラミングの基本ですが、共通の処理は関数にまとめるものです
なので、「共通になるような処理を考えてそれを呼び出すようにする」とスマートです
ACCESSのフィルター処理は結構テンプレート的な感じで、ここでも同じような回答を何度かしてますが、自作のプロシージャを作ってそれを呼び出すようにすると良いです
例えば、以下のように
setFilter
プロシージャを作成し、各コンボボックスの更新後処理でそれを呼び出すようにします各イベントが、プロシージャの呼び出ししかしないのであれば、そのプロシージャを関数にして、ユーザー定義関数の呼び出しの形にするとコードはもっとすっきりしますね
モジュール
各コントロールの更新後処理プロパティ
その後、どうしたいの?最終的に、やっている事がレッドカードになる場合、質問不成立です。
数値が重複する場合があるんですね。
だとすると、前回の私の回答では、うまくいかない場合があるので、ちょっと修正します。
数値が同じ場合、IDの並び順が不定になるので、IDの並び順も指定しておく必要がありました。
ご指摘ありがとうございました。21がアウトですよ の説明です
最大値の22、最小値の19は合っているけれど、数値で並べ替えると22の次が21番が連番じゃなくて
20番になっているからアウトですよ ってことを調べたかったんです。
前回ご指摘をいただいたように4件しか表示していなかったのですみません。
件数を増やしました。再度ご教授お願い致します。
ID 数値
19 1.91
20 1.90
21 1.89
22 1.86
23 1.88
24 1.81
25 1.81
とデータがあったとき数値を昇順に並び替える
25 1.81
24 1.81
22 1.86
23 1.88
21 1.89
20 1.90
19 1.91
ID 25から24までは連番 21から19番も連番だけど 24から22は連番にならないから「ここからアウト」だよ
ってことを調べたいのです。お願いいたします
Googleマイマップにインポートできるファイル形式がAccessに対応していないのでそうなります。
可能ですけど、簡単ではないです。
まずは、手作業でご希望のマップを作成できるようになってください。
できたら、その作業を自動化することを考えます。
csvへのエクスポートはVBAで簡単にできます。
その先は、ブラウザの自動操作になりますので、難易度は一気に高くなります。
今なら、VBAでやる場合、seleniumを使うことになると思います。「VBA selenium」でWEB検索して研究してみてください。
あるいは、RPA(PC操作自動化ツール)を使うとかになります。
この回答に関する質問なのですが、、、
住所データを一回csvなりExcelなりのアウトプットしなきゃいけないのですか???
私としては 抽出した住所データをACCESSのユーザーフォームから
ワンクリックでグーグルマップに反映されるものを作りたいと思っているのですけど、、、
可能でしょうか?
早急な回答ありがとうございます。。。^^
いつもいつもすごいですね^^神です^^
今 会社でACCESSを使って 当該内容の抽出プログラムを構築してます^^
あたしのスキルではまだまだ時間もかかると思います。。。;;
でも
hatenaさんが応援してくれるから、、、明日からもがんばりますね^^
P.S.当該ACCESSなのですが、、、次から次へと壁にぶつかってしまう現状です。。。;;
決して脱線したり、、、あきらめたりするわけではないので、、、
今後も当該プログラムに付随した質問をさせていただくことご了承ください。。。^^
完成を待ってたら お礼がずーっと先になってしまうので
ありがとうございました
結構な頻度で使うことがありますが、今まで使っていて使えなくなったことはないですね
下手に外部機能を組み込むよりはACCESSで完結してる機能のほうが信頼できると思っています
どういう理由で「使えなく」なるのを想定してるんでしょうか?
「案件」のものであれば動作環境がきちんと提示されるものなので「使えなくなった時にサポートできない」のは当然のものだと思いますが
そういえばこれ、数値を昇順にすると
全部アウトじゃない?
少なくとも、「21がアウトですよ」はどういう基準でそれがアウトなのか意味が分かりませんね
>> 11のhirotonの回答はその辺適当です
テーブルデータを入力または更新したタイミングですね。つまり連番が崩れる可能性のあるタイミングでチェックするということです。
お二人ともありがとうございました。
初心者の私には、即答できないので実際に この構文を加工させていただいて実行してみたいと思います。
ちなみに hatenaさんの場合も、フォームの読み込み時イベントでよろしいですか?
フォームに読み込んで表示するとして、フォームの読み込み時イベントに
[イベント プロシージャ]
を設定して、リンクテーブルを削除して、再度リンクしなおすことになるのでは。
そもそも、フィールド名が変更されるというのはデータベース的にはNGなので、その都度リンクして、そのデータを正規形に変換して、テーブルに追記するという処理になると思います。
Google マイマップ を使えば可能です。
作成の仕方は下記リンクを参考に。
地図を作成する、開く - パソコン - マイマップ ヘルプ
住所データのインポートは下記のリンクを参考に。
インポートできるファイルはCSVやXLSXなどがありますので、Acccessの住所データをテキスト(CSV)かエクセルへエクスポートすれば簡単に作成できます。
地図上の対象物をファイルからインポートする - パソコン - マイマップ ヘルプ
住所の一覧表はExcelじゃないと無理なんですか???::
できました^^ あっさりできました^^
ほんとうにありがとうございました
これからもご指導何卒宜しくお願いします^^
テーブルに表示させたいなら、テーブルに表示用のフィールドを追加することになります。
例えば、
連番チェック
という名前のテキスト型のフィールドを追加したとして、下記のような感じです。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の昇順連番は担保されません。