=IIf([cboTD01] Like "※*" And [cboTD02] Like "※*" And [cboTD03] Like "※*" And [cboTD04] Like "※*" And(IsDate([txtTD05]) Or [chkTD05]) And (IsDate([txtTD06]) Or [chkTD06]) And (IsDate([txtTD07]) Or [chkTD07]) And (IsDate([txtTD08]) Or [chkTD08]) And ([cboTD09] Like "※*" Or [chkTD09]) And ([cboTD10] Like "※*" Or [chkTD10]) And ([cboTD11] Like "※*" Or [chkTD11]) And ([cboTD12] Like "※*" Or [chkTD12]) And ([cboTD13] Like "※*" Or [chkTD13]) And ([cboTD14] Like "※*" Or [chkTD14]) And (IsDate([txtTD15]) Or [chkTD15],"済","")
=IIf([cboTD01] Like "※" And [cboTD02] Like "※" And [cboTD03] Like "※" And [cboTD04] Like "※" And(IsDate([txtTD05]) Or [chkTD05]) And (IsDate([txtTD06]) Or [chkTD06]) And (IsDate([txtTD07]) Or [chkTD07]) And (IsDate([txtTD08]) Or [chkTD08]) And ([cboTD09] Like "※" Or [chkTD09]) And ([cboTD10] Like "※" Or [chkTD10]) And ([cboTD11] Like "※" Or [chkTD11]) And ([cboTD12] Like "※" Or [chkTD12]) And ([cboTD13] Like "※" Or [chkTD13]) And ([cboTD14] Like "※" Or [chkTD14]) And (IsDate([txtTD15]) Or [chkTD15],"済","")
Dim strSQL As String
strSQL = "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1"
WHERE (ID = 1 And 収入 >= 100)
Or (ID = 2 And 収入 >= 60) _
Or (ID = 3 And 収入 >= 20)
GROUP BY 地域
HAVING Count(1) = 3
);"
Function VERCHECK()
Dim DB1 As DAO.Database
Dim DB2 As DAO.Database
Dim RS1 As DAO.Recordset
Dim RS2 As DAO.Recordset
Dim strAPPT As String
Dim strDBPT As String
DoCmd.OpenForm "F_起動"
Set DB1 = DBEngine.Workspaces(0).OpenDatabase("共有サーバの◯◯.mdb")
Set RS1 = DB1.OpenRecordset("T_VERINFO")
Set DB2 = DBEngine.Workspaces(0).OpenDatabase("C:各pc用の◯◯.mdb")
Set RS2 = DB2.OpenRecordset("T_VERINFO")
If RS1("Ver") > RS2("Ver") Then
If MsgBox("新しいバージョンがあります。アップデートしますか。", vbYesNo) = vbYes Then
RS1.Close
RS2.Close
DB1.Close
DB2.Close
Set RS1 = Nothing
Set RS2 = Nothing
Set DB1 = Nothing
Set DB2 = Nothing
FileCopy "共有サーバの◯◯.mdb", "C:\各pc用の◯◯.mdb"
End If
End If
strAPPT = SysCmd(acSysCmdAccessDir) & "\MSACCESS.EXE"
strDBPT = "C:\各pc用の◯◯.mdb"
Shell strAPPT & " " & strDBPT, vbNormalFocus
Application.Quit
End Function
Shell strAPPT & " " & strDBPT, vbNormalFocus
Application.Quit
End Function
If Me.カウント.Value = 10 Then Me.改ページ.Visible = True
'ページヘッダーでFalseにしているので毎レコードごとにプロパティを設定する必要はない'
③[カウント]テキストボックスの値を0にする理由
初期化処理については、VBAでDim i As Longとした場合は変数宣言のルールによりiには0が入っていますが、今回はフォーム上に[カウント]テキストボックスを設置していますので、フォーム上のコントロールの設定(規定値プロパティ)に従ってMe![カウント]の値はNullになっているのだと思います。VBAの初期化を使いたいのならモジュール先頭で
マークダウンのコードブロックに入れると * は消えません。
詳細は下記を参照してください。
Microsoft Access 掲示板 の使い方 Microsoft Access 掲示板 - zawazawa
下記のようになります。
「※」のあとには「*」があります。なぜかきえているようです。すみません。
ごちゃついた式ですみません。少しずつトライ&エラーで試しているところで、この式の半分程度で行き詰っていますが、全文作って載せました。
以下になります。連結フォーム、帳票フォームになります。
=IIf([cboTD01] Like "※" And [cboTD02] Like "※" And [cboTD03] Like "※" And [cboTD04] Like "※" And(IsDate([txtTD05]) Or [chkTD05]) And (IsDate([txtTD06]) Or [chkTD06]) And (IsDate([txtTD07]) Or [chkTD07]) And (IsDate([txtTD08]) Or [chkTD08]) And ([cboTD09] Like "※" Or [chkTD09]) And ([cboTD10] Like "※" Or [chkTD10]) And ([cboTD11] Like "※" Or [chkTD11]) And ([cboTD12] Like "※" Or [chkTD12]) And ([cboTD13] Like "※" Or [chkTD13]) And ([cboTD14] Like "※" Or [chkTD14]) And (IsDate([txtTD15]) Or [chkTD15],"済","")
実際のうまくいかない式を提示してもらえますか。(長くてもいいので)
あと、そのフォームは連結フォームですか、非連結フォームですか。
連結フォームの場合は、単票フォームですか、帳票フォームですか。
式ですが、実際は「済」のあとに「*」を使っています。関係ないと思いましたが一応修正したものを載せます。
=IIf((IsDate([テキストボックス1]) Or [チェックボックス1]) AND (([コンボボックス2] Like "済*") Or [チェックボックス2]),"完了","")
こんにちは。この件ですが、どうもうまくいきません。式にエラーが出て、修正(一度消して打ち直す)すると見た目全く何も変化していないのにうまくいったり、同じことを何度も繰り返しています。時々「式が長すぎます」というようなエラーも出ます。実際すごく式が長いので、トライアンドエラーにすごく時間がかかっています。クエリのデザインビューで設定することはできますでしょうか。具体的には下記のような式が、長いものになります。(そもそも式が間違っているのでしょうか…)
=IIf((IsDate([テキストボックス1]) Or [チェックボックス1]) AND (([コンボボックス2] Like "済") Or [チェックボックス2]),"完了","")
テキストボックス1かチェックボックス1がTRUEで、コンボボックス2かチェックボックス2がTRUEなら完了、といった式が15個程度続いている
それでやってみて「どううまくいかない」んですか?
そっくりそのままやろうとするとコードに記述した時点でエラーメッセージが出ると思いますが
VBAは基本1行1命令の言語で、改行は命令の終わりという特別な文字です。SQLのようにただの文字の区切りというわけではないので、改行を消して1行で記述するか、それなりの対処が必要です
方法: コード内でステートメントを分割および連結する (Visual Basic)
hatena様
遅くなりました。
Dim strSQL As String
strSQL = "SELECT * FROM テーブル1 WHERE 地域 IN(SELECT 地域 FROM テーブル1"
WHERE (ID = 1 And 収入 >= 100)
Or (ID = 2 And 収入 >= 60) _
Or (ID = 3 And 収入 >= 20)
GROUP BY 地域
HAVING Count(1) = 3
);"
自分なりに調べましたが、ここまでが限界でした。
申し訳ありません。
こんばんは。
本日Windows10でのテストが無事終了しました。
VBSで起動する事ばかり考えていたので、mdbでの起動を教えて頂き、大変助かりました。
ありがとうございました🙇♂️
起動のコードも載せておきます。
かなり独学で書いていますので、もっとスマートな書き方があれば、お時間ある時にご教授頂けると幸いです。
本当にありがとうございました。
ごめんなさい、お返事確認する前に新しく投稿してしまいました。ごちゃついてしまいましたが、ご教示いただいた内容で確認します。ありがとうございます。
あ、上記はインポートの定義修正ではなく、新しく定義を保存するということですね。すみません。それならエクセルファイルでも同じですね。承知しました。ありがとうございました。
エクセルファイルだとインポート定義は使えませんね。
インポート先のテーブルを先に作っておいて、そこにインポートするとどうでしょうか。私は試したことがないですが、試してみてください。
エクセルファイルをインポートではなくリンクにしておいて、そのリンクテーブルから追加クエリを作成してインポート先のテーブルに追加するという方法を私なら使います。これだと、クエリのデザインビューで好きなように変更できますので。
ご教示ありがとうございます。すみません、インポートについて詳しく記載しておりませんでした。エクセルファイルでのインポートなのですが、修正は難しいでしょうか。難しいようであれば、新たにテキストファイルのインポートを作成してみようと思います。
とりあえず現状のできているところまでいいのでVBAを提示してもらえますか。
あと、情報が不足しているので、下記の点についても補足してください。
例えば、
非連結フォームのテキストボックスに入力してある(1レコード)
別テーブルにあるデータ(複数レコード)
外部からインポートまたはリンクしたでータ(複数レコード)
テキストファイルのインポートでしょうか。もしそうなら、下記の手順で。
最初にインポートするときに、インポート定義で不要なフィールドをスキップするように設定しておいて保存しておきます。
Accessで保存したインポートの定義の利用方法 | できるネット
インポートを実行して、ウィザードの最後で [インポート操作の保存] にチェックをいれてから終了します。
インポートやエクスポートの操作の詳細を定義として保存する - Access
これで、次回から保存したインポート操作を実行すると定義した通りにインポートされます。
hirotonさん
ありがとうございます。ほぼ疑問は解消出来たと思います。
色々とコードまで例示くださり、大変分かり易かったです。
初期値のところは知識の整理になりました。
標準モジュールでの変数宣言とフォーム上のコントロールの値の設定は、初期値を明示的に設定しなかった場合ルールが異なるということですね。
hatenaさん
こちらの掲示板をご案内いただきありがとうございました。
Access、AccessVBAはほぼ初心者に近いのでまた質問させていただく機会があるかと思います。その時はまたよろしくお願いいたします。
ありがとうございました。
やはりそうですか・・・
別の方法を検討してみます。
ありがとうございました。
新規追加なら、新規行のレコードセレクタをクリックして新規行を選択してから、貼り付ければ、可能ですね。
ただ、エクセルのようにアンドゥが効かないので、変なところを選択して上書きしてしまうと取り返しがつかないのて、通常の運用で使うのはお勧めできないですね。
下記の方法でクリップボードのデータを取得できますので、それを使ってVBAでデータを追加する機能を実装するのがいいでしょう。
クリップボードとデータのやりとりをする:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
コントロールソースの式に関してADOはまったく関係ないです。
ワイルドカードは普通にLike 演算子 - Access
上記で紹介されているワイルドカードは使えます。(Access内のコントロールソースやクエリでは * だが、ADOでは % になるというだけのことです。)
式がまちがっているのでしょう。
hirotonさんが丁寧に解説されているので、感想だけ。
確かに冗長な部分があるコードだと思います。
行数をカウントするのに変数を使わずにテキストボックスを使うとか。
改ページをコントロールするのも、改ページコントロールの可視を変更するというのも、私は使いません。
改ページコントロールの位置が最下部からずれると想定外の動作になったりするので。
ForceNewPageプロパティで改ページを制御しますね。
SendObject では一つのオブジェクトしか送れないようです。
メールソフトがOutlookならそれを操作して添付するとか、別の方法を検討するしかないでしょう。
最初の質問のSQLでうまくいかないということですか?
そのSQLをクエリのSQLビューに記述して開いた場合は、希望の結果が表示されますか。
というか、現状のうまくいかないコードを先に提示してください。
データシートビューの中で、各フィールドの枠付近にマウスカーソルを合わせると十字のアイコンに変わります。その状態でドラッグすると複数のフィールドが選択できるのでそれで貼り付けが可能です。
そうですか!それも試してみたのですが1つのセルに全部データが入るような感じで貼り付けできませんでした。
何か貼り付けの方法がありますでしょうか?
こんにちは。
'''
strAPPT = SysCmd(acSysCmdAccessDir) & "\MSACCESS.EXE"
’’’
と書き換えて、今のところ32bit、64bit共に問題なく起動できています。
来週pcの入れ替えが始まるので、Windows10で最終テストしてみます。
とりあえず、お知らせまで。
良いか悪いかは別にしてデータシートビューなら貼り付けできますね
考えられている通り、詳細_Format側を弄ればいいんじゃないかなと思います
初期化処理については、VBAで
Dim i As Long
とした場合は変数宣言のルールによりiには0が入っていますが、今回はフォーム上に[カウント]テキストボックスを設置していますので、フォーム上のコントロールの設定(規定値プロパティ)に従ってMe![カウント]
の値はNull
になっているのだと思います。VBAの初期化を使いたいのならモジュール先頭でのように変数を用意すればいいと思います。
また、データ件数が10件を超える場合、2ページの描画処理に入ったタイミング(のページヘッダー)で行数カウントをリセットしないと2度と
Me.カウント.Value = 10
がTrue
になることがないので困ったことになります。(このコードなら20件までは問題ないように動きますが)今回の件では変数の初期値自体は二の次の話ですね。
hatena様
返信遅くなりました。回答ありがとうございます。
strSQL = "サブクエリを含むSQL"
””の中にSQL文を記載したのですが、書き方が悪いのか実行できません。
また、( など、どのように記載するのか分かりません。
本当に図々しいお願いですが、このコードをどのように記載するのか、
お手本を見せていただけないしょうか?
hatenaさん
解説ありがとうございます。解説を基に色々コードをいじって確認してみました。
整理しますと自分の疑問点は結局以下に集約されます。
①[改ページ]コントロールのVisibleプロパティをFalseにする理由
②[改ページ]コントロールに関する設定を、ページヘッダーセクションに記述する理由
③[カウント]テキストボックスの値を0にする理由
④[カウント]テキストボックスの設定を、ページヘッダーセクションに記述する理由
①をTrueに設定してみました。確かにレコード毎に改行されてしまいました。だからFalseに設定する。ただ、この記述自体、Me.改ページ.Visible = Falseを無くしてしまっても問題無く動作します(10行毎にちゃんと改行される)。にも関わらず、わざわざ書く理由は可読性を考慮しているからなのですかね?
②に関しては、詳細セクションに記述してもきちんと動作しました。ただ、
との事ですから、レコードの数だけVisible = Falseを設定することになり、明らかに冗長な処理となることから、ページ毎に1回だけイベントが発生するページヘッダーセクションに記述するのが合理的という解釈で良いのですかね?
③に関しては、Me.カウント.Value = 0をコメントアウトすると、改行がされませんでした。イミディエイトウィンドウで値を確認してみるとNull値が入ってしまいカウントアップが働いていませんでした。なので初期化は必須ということが分かりました。ただ、この手の変数の設定は初期化を省略した場合、自動的に0が設定されて問題無く動くような気がしたのですが、この認識自体間違いですかね?例えば、以下のコードだと0が返ります。
④は、詳細セクションに記述してしまうとレコード毎に毎回最初に0がセットされてしまい、カウントが1以上から先に進まないことが確認できました。故にページヘッダーセクションに記述する必要があると理解出来ました。
以上より、①~③はまだ少しモヤモヤしています。ご回答いただけると幸いです。
hirotonさん
丁寧に解説ありがとうございました。
こんばんは。
起動.mdb作成してみました。
autoexecでverのチェック、アップデートなどはうまくいきました。
そこで問題があったのですが、
MSACCESS.EXEのパスが一定ではなく、
もちろん私と同じフォルダ名の人以外は動きませんでした…
各pcのMSACCESS.EXEのパスを取得して、起動できるのでしょうか?
下記がshellの部分です。
「代替の背景色」とは何ぞや?という話なんですが、英語でプロパティ名をみると「Alternatebackcolor」となってます。「Alternate」には「代わりの~」という意味があるのでそれをもって「代替の背景色」と日本語を充てることはできますが、「交互の~、1つおきの~」という意味を使うべき案件ですね。つまり「偶数行の背景色」を設定するプロパティなわけです。
結果からしたら認識されている通りで構わないんですが、偶数行なら通常の背景色(BackColor)よりも代替の背景色が優先されるので「[代替の背景色]に、「#FFFFFF」が設定されて」いるとVBAであろうとなかろうとBackColorを変更しても影響が出ない状態になってるよ、ということです。
VBAの命令「
Me.詳細.BackColor =
」は実際に色を塗る作業をしているわけではありません。背景色プロパティの値を変えているだけだと理解できると「じゃあ、実際に色を塗るタイミングでは何が起きているのか(偶数行だから代替の背景色が使われているな)」とつながると思います。その教材はみたことないのでコードからの推測です。
プレビュー時でも印刷時でもグループヘッダーは出力されませんね。
何のためにしているのかはわかりません。グループヘッダーの「可視」プロパティを「いいえ」にしても同じことのような気がします。
詳細セクションの[改ページ]コントロールがTrueだとレコード毎(1行毎)に改ページされてしまうからです。
これらのコードでやっていることは、10レコード(10行)毎に改ページするということだと推測します。
(教材に目的が書いてありますよね。)
下記の点を理解することが必要ですね。
ページヘッダーセクションのフォーマット時イベントはページが出力される一番最初に1回発生してヘッダーを出力する。
詳細セクションのフォーマット時イベントはレコード毎に発生して1行分出力する。
つまり、
最初にページヘッダーのフォーマット時イベントが発生してヘッダーが出力される。
そのときに、改ページを非表示にして1行毎に改ページしないようにする。
「カウント」テキストボックスは現在1ページ内で何行目かを取得するものなのでまずは初期化しておくす。
詳細セクションのフォーマット時で「カウント」の数値にプラス1をする。これによって現在、1ページ内で何行目を出力するのが分かる。
その数値が10なら10行目ということなので、改ページを表示させることで改ページして次のページに移動する。
ということです。
⑤に関してはその理解であってます。
レポートのイベントの発生メカニズムはかなり複雑です。
下記がその理解を深めるのに役立つと思いますので一度目を通しておくことをお勧めします。
レポートのイベントの発生メカニズムの研究 - hatena chips
レポートのイベントの発生メカニズムの研究 その2 - hatena chips
そういうことです。
mdbなら32ビットでも64ビットでも問題ないと思います。
ただ、実際にやったことはないので何か想定外の問題があるかも知れません。
とりあえずやってみてはどうでしょうか。
よく考えたら、列の表示/非表示はVBAで制御できますので可能ですね。
■T'sWare Access Tips #562 ~データシートフォームの列の表示/非表示を個別に切り替えるには?~
ただ、データシート表示なら、列固定ができますので、常に表示したい列は固定しておいて、あとはスクロールさせるという方法で対処できるので、それほど必要性はないと思います。
適当にためしてみたら、たまたま当たっていたようで自己解決しました。
=[リスト名].Column←列数を入れる。
すみません。ありがとうございました。
コントロール(コントロールソース)の理解があやふやな感じですねぇ
コントロールはコントロールソースの設定によって3種類の動作をします
1.コントロールソースにフォームのレコードソースのフィールドを指定する
指定したレコードソースのフィールドそのものにリンクされます。
現在のレコードの(指定したフィールドの)値が表示され、このコントロールを更新するとデータが書き換わります。
(フィールドがクエリの計算式などの場合、編集不可だったりもします)
2.コントロールソースに計算式を指定する
計算式に従った結果が表示されます。
編集不可です。このコントロールが直接データを書き換えることはありません。
3.コントロールソースに非連結を指定する
フォーム上で任意で編集ができるコントロールです。
このコントロールが直接データを書き換えることはありません。
今回の例のように、表示したい個人IDを入力したり、検索用のキーワードを入力するテキストボックスを設置するときに使います。
非連結のコントロールは、ユーザーが一時的に使いたいデータを入力するためのコントロールとなります。
また、上記はコントロールの値(value)に関する話で、いろいろな制御にかかわる各種プロパティは、別物です
これの第4引数(
"個人ID=" & Me.PF_CMB_個人ID.Value
)はフォームのFilterプロパティに値を設定する指定です。これ自体は何かデータを書き換えるようなことはしません。(コントロールに値を設定するようなこともありません)
サブフォームのデータを絞り込むときには
としました。今回はフォームが別になるので、同様に考えるなら
とすることができます。
ただし、フォームを新たに開くなら、hatenaさん提示のように同時に設定できるので
とできます。
同じことをしているとわかれば、個人IDを直接変更しているものではないとわかると思います。
各コントロールは、処理毎に、冒頭のコントロールのルールに従って内容を再表示します。
レコードの絞り込みの結果、現在のレコードが変更になれば、変更後のレコードの値を表示しなおします。
Excel的に言えば、見ている行が変わったというだけでデータそのものが変わったわけではありません。行が変わったので、その行の値をそれぞれ表示しなおしているだけです。
そうですよね。ありがとうございました。
おはようございます、ろでますです。
大変ありがとうございます、思った通りの動作ができました。
ちゃんと理解していれば、こんなスマートに書けるものなんですね。
DoCmd.OpenForm "ユーザー情報編集フォーム", , , "個人ID=" & Me.PF_CMB_個人ID.Value
で、対象のフォームのコントロールに、こういった形での引数渡しができることをはじめて知りました。
これだと、コントロールに値が入るので、他のコントロールも連動して変わってくれるという訳ですね。
また、
Forms!ポップアップ入力!PF_CMB_個人ID.Requery
Forms!ポップアップ入力!PF_CMB_個人ID.Value = Null
で、コントロール単位にReaueyできること教えていただきました。
大変良い勉強になりました、ありがとうございました。
営業日報テーブルをレコードソースとするレポートをメインレポートにして、
訪問先テーブル、休憩テーブルからそれぞれレポートを作成して、サブレポートとして埋め込む設計にすればいいでしょう。
サブレポートの罫線は下記の方法で。
レコードがない場合も用紙の最後まで罫線を出力する - hatena chips
帳票フォームで表示項目が多いとき、ページ切り替えで - hatena chips
上記のページのタブのことでしょうか。
だとしたら、不可能ですね。