with e
.visible=true
d.minimizeall
.opencurrentdatabase("フルパス")
↑
此処の部分も条件分岐事に表記が必要でしょうか?
余白設定は、入れなくて良いのは、分かりました。
印刷のやり方でクエリを一々開く必要があるかも分かりません。乱文申し訳ありません。ご教授お願い致します。
VBA
a="印刷物1"
b="印刷物2"
c=msgbox(a & vbcrlf & b & "印刷しますか?")
if c=6 then
set d=createobject("shell.application")
set e=createobject("access.application")
with e
.visible=true
d.minimizeall
.opencurrentdatabase("フルパス")
with e.printer
.leftmargin=0
end with
.docmd.echo false
.docmd.openquery a
.docmd.printout
.docmd.openquery b
.docmd.printout
.docmd echo true
.quit
end with
else
end if
大変申し訳ありません。if文が抜けていました。
if文による分岐をselect case で行いinputbox関数の戻り値を利用して多数の印刷物を印刷出来るものを作りたく思っていますが、コンパクトにするにはどうすれば良いか分かりません。条件分岐事に最小化、余白設定のコードが必要なのか、それを回避する策はあるかが分かりません。ご教授お願い致します。
Public Sub AllFormsSizeCange()
Dim Frm As Access.AccessObject
For Each Frm In Application.CurrentProject.AllForms
DoCmd.OpenForm Frm.Name, acDesign 'デザインビューで開く
Call FormSizeChange(Forms(Frm.Name), 0.8) 'サイズ変更
DoCmd.Close acForm, Frm.Name, acSaveYes '保存して閉じる
Next Frm
End Sub
Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
Me.連番 = i & "/" & Me!発注数
If i < Me!発注数 Then
Me.NextRecord = False
i = i + 1
Else
i = 1
End If
End Sub
Private Sub コマンド8_Click()
CurrentDb.Execute "追加クエリ"
Forms![フォーム1].SetFocus
Forms![フォーム1].Requery
End Sub
追加クエリを作成したくないなら、コードにSQLを直接記述することも可能です。
Private Sub コマンド8_Click()
CurrentDb.Execute "INSERT INTO テーブル1 SELECT [テーブル2].* FROM テーブル2;"
Forms![フォーム1].SetFocus
Forms![フォーム1].Requery
End Sub
一応、追加クエリ(SQL)を使わない別案も出しておきます。
Private Sub コマンド8_Click()
Dim MeRs As DAO.Recordset
Set MeRs = Me.Recordset
If MeRs.RecordCount = 0 Then
MsgBox "データがありません。"
Exit Sub
End If
Forms![フォーム1].SetFocus
Dim TargetRs As DAO.Recordset
Set TargetRs = Forms![フォーム1].Recordset
MeRs.MoveFirst
Do Until MeRs.EOF
TargetRs.AddNew
TargetRs!項目 = MeRs!項目
TargetRs!金額 = MeRs!金額
TargetRs.Update
MeRs.MoveNext
Loop
End Sub
適当なファイルを作って試してみました(Excel2013,ACCESS2013)
ACCESSでリンクしたテーブルをデザインビューで開いてみるとExcelの「区分」の内容によって数値型だったり短いテキスト型だったりしました
何を基準にしているのかはちょっとわかりそうにもありません
ちなみに(Excelに)日時列を作って日付だけを入力して置いたら日付/時刻型になっていました
Excel側で区分の列の書式を文字列にしたら数字のみのデータでも短いテキスト型になりました
エクセルのデータをデータベースとして使いたいのならすべての列に書式を設定して「標準」を使わないようにすべきなのでしょう
何とか上手く作れました。有難う御座いました。
印刷したいクエリが同じデータベースファイル内にあるのなら必要ありません。
別のデータベースファイルにあるのなら必要になります。その場合は、開いたデータベースを閉じる処理も必要になります。
with e
.visible=true
d.minimizeall
.opencurrentdatabase("フルパス")
↑
此処の部分も条件分岐事に表記が必要でしょうか?
余白設定は、入れなくて良いのは、分かりました。
印刷のやり方でクエリを一々開く必要があるかも分かりません。乱文申し訳ありません。ご教授お願い致します。
VBA
a="印刷物1"
b="印刷物2"
c=msgbox(a & vbcrlf & b & "印刷しますか?")
if c=6 then
set d=createobject("shell.application")
set e=createobject("access.application")
with e
.visible=true
d.minimizeall
.opencurrentdatabase("フルパス")
with e.printer
.leftmargin=0
end with
.docmd.echo false
.docmd.openquery a
.docmd.printout
.docmd.openquery b
.docmd.printout
.docmd echo true
.quit
end with
else
end if
大変申し訳ありません。if文が抜けていました。
if文による分岐をselect case で行いinputbox関数の戻り値を利用して多数の印刷物を印刷出来るものを作りたく思っていますが、コンパクトにするにはどうすれば良いか分かりません。条件分岐事に最小化、余白設定のコードが必要なのか、それを回避する策はあるかが分かりません。ご教授お願い致します。
呈示のコードにはIf文はないですが?
もう少しやりたいことを具体的に説明してください。
access.application のインスタンスは一回生成して使いまわしてOKです。
余白サイズも application の Prunter に設定してあるので一回でOKです。
excelに記述してあります。vbs で使えるように実行時バインドで記述してあります。宜しくお願い致します。
このVBAはAccessファイルに記述してあるのでしょうか。それともExcelなど他のOfficeのファイルに記述してあるものでしょうか。
SQLを学習するために意気込む程の気持ちはなくても大丈夫です。
ACCESSなら「クエリデザインでデザインビューとSQLビューを切り替えて確認できる」くらいに思っておけば大丈夫です。
違いは、デザインビューは画面操作で簡単にSQLが作れるけれど複雑SQLは作れない(ユニオンクエリもこれに該当)といった程度です。
インターネット上でやり取りをする場合はテキストベースがほとんどですので、SQLを文字列で扱えるとなれば大きなアドバンテージになります。
(扱えると言うのはコピー&ペーストができるというレベルで大丈夫です)
それではもっと基本的なところからもう少し具体的な手順を
1.選択クエリで出庫明細、入庫明細を作る
元の元になるデータとして
出庫明細
と
入庫明細
といったデータが必要になります。選択クエリで問題なく作れますか?
今後のやり取りを楽にするために、それぞれ出来上がったものはQ出庫明細とQ入庫明細(クエリは頭文字にQをつける)としておきましょう
2.ユニオンクエリでデータを縦につなげる(前段階)
それぞれ出来上がったQ出庫明細とQ入庫明細を使いやすいように手を入れます。
Q出庫明細
↓
Q入庫明細
↓
クエリビューではユニオンクエリが作れないので作業を簡単にするためにQ出庫明細とQ入庫明細を同じ列数、同じ列名に揃えておきます。
さらに、合体させた後に入庫なのか出庫なのかわかるように[入出庫フラグ]フィールドを追加しておきます(このフィールドのデータはすべて「出庫」または「入庫」で固定)
3.ユニオンクエリで入出庫明細をつくる
Q入出庫明細
事前準備をしてあるので、最も基本的なユニオンクエリの使い方でつくれます
4.集計クエリで入出庫数を横に並べる
Q入出庫集計_sub
これも集計クエリとしては基本的な使い方をやることになります。
まだ月ごとの集計になっていないのでQ入出庫集計_subとしておきます。
とりあえずここまで
どこまでできますか?
躓いたら出来上がったところまでのクエリをSQLビューで表示してこの掲示板にコピペしつつ質問しましょう
(SQLビューを開けばSQL文がすべて反転表示されているはずなのでそのまま右クリックからコピーするだけです)
ご助言ありがとうございます。
私自身、本を見ながらの組んでいたもので基本的には初心者です。
ユニオンクエリと言われてピンときません。
SQL?とかを学習しないと難しいでしょうか?
SQLやユニオンクエリ、集計クエリをどのように行えばいいのかわかりません。
大変申し訳ありません。
早速の返信ありがとうございます。
表示されました。いろいろ勉強になります。
ありがとうございました。
上記のページを参考にしたということでしょうか。
デザインビューで、リストボックスに得意先名と担当者名を表示できるようにしたということですね。
フォームのモジュールの下記の部分を修正してください。
どの程度のことができるのかわからないのでヒントだけ
最終的には横並びに月と入庫数や出庫数を見たいのだと思いますが、出庫と入庫が別々なテーブルに分かれているのでちょっと面倒です。
ユニオンクエリ、集計クエリあたりをつかって入出庫集計クエリを作ります
「在庫」は「その月までの入庫の合計-出庫の合計」と計算させるのが基本ですが、レポートを使うのであればテキストボックスのプロパティ「集計実行」を使って簡単に実装できます
ありがとうございます。
試してみます。
念のためにバッグアップを取ってから実行してください。
hatena様
ご返信いただきありがとうございます。
お教えいただいた内容確認させていただきました。
この方法ですと、全てのフォームにこの機能を持たせようと思うと、全てのフォームにこの設定をしなければなりませんか?
OS側で120%の設定がされていても、Accessのみ100%表示にできる方法というのはないでしょうか?
確認をさせて頂きましたらしっかり動作致しました。
理解不足でありました為、もう一度一からしっかり勉強させて頂きます。
ありがとうございます。
下記の式にしてください。AND は""の内側にいれます。
DSum の第3引数は、SQLとしての抽出条件式を文字列として設定します。
設定したいSQL条件式は例えば下記のようなものですよね。
これを文字列にするには、
と"で囲みます。
2019/12/31 と 1 の部分は可変にしたいので、まず分割します。
分割した "2019/12/31"と"1"の部分をフィールド参照に書き換えます。
これで完成です。このように順番に少しずつ書き換えていくと理解しやすいでしょう。
質問の条件式
は
"文字列" AND "文字列"
の形なっており、AND は文字列ではなくなってますので、AND演算を実行しますが、文字列同士では AND演算 はできないのでエラーになります。
前の回答で説明したようにリンク親フィールド、リンク子フィールドの設定で可能なはずです。
現状、
リンク親フィールド txtDate
リンク子フィールド 日付
ということですね。
メインフォームで、氏名コードを表示しているテキストボックス名を txtSimeiCode とすると、
リンク親フィールド txtDate;txtSimeiCode
リンク子フィールド 日付;氏名コード
とすればOKです。
テキストボックス名やフィールド名は実際のものに変更してください。
この説明で分からないのなら、現状のファイルを右カラムの下の方のファイル送信フォームから送信してください。
hatenaさんのやり方でカレンダーを作成したのですが、今はtxtDateと日付でリンクさせています。
そして、カレンダーの方にも氏名別で予定を表示させたいのですが、今は登録されているすべての予定が表示されてしまっています。
すみません。説明不足で。
hatenaさんのやり方でカレンダーを作成したのですが、個人でスケジュール管理するために氏名別で表示されるようにしたいです。
サブフォームならリンク親フィールド、リンク子フィールドの設定で簡単にリンクできます。
サブフォームのレコードソースは、テーブルか抽出条件を設定してないクエリにします。
複数のフィールドでリンクさせるときは、
例えば、日付 と 氏名コード なら、
日付;氏名コード
というように;で区切って設定します。
初心者さん、不明点を知りたいのですが、
カレンダーもサブフォームもフォームに設置したのですか?
予定の入力はできるけれども氏名別にならないという意味ですか?
氏名一覧テーブルと予定テーブルによるクエリーがうまくいかないのですか。どうなればクエリーがうまくいく事になるのですか?
解決できてよかったですね。
もし、ディスプレイの設定を125%のままで使いたい場合は、下記のリンク先で紹介している関数を使うと簡単にフォームの拡大縮小ができます。これを使って0.8 (1/1.25)で縮小するといいでしょう。
大変失礼致しました。
マシンのディスプレイの設定でAccessの表示が125%になっていました。
今回はこれにて解決いたしました。
また相談させて頂きます。
失礼しました。
ありがとうございました。
再インストールしてみます。
だとすると、Officeをアンインストールして、再インストールしてみてください。
64bitか32bitかは関係ないと思います。
返信ありがとうございます。
新たに作成したファイルもダメです...
試しに、他の関数もしてみたのですが他の関数もダメみたいです。
今思えば、Accessのインストール時に少しエラーが出たのを思い出しました。
64bit版のほうがいいのでしょうか?
そのエラーが出るのは、そのファイルだけですか。それとも他のファイルでもでますか。
また、新規にAccessファイルを作成して、簡単なテーブルを作成してデータを入力して、クエリでDSumを使った場合はどうなりますか。
ありがとうございます。
期待通りの結果になりました。
難しく考えすぎており、行き詰まってしまいました。
もう少し頭を柔らかくして望みたいと思います。
レポートの詳細セクションにテキストボックスを配置して、名前を「連番」とします。
下記にように1行追加すればどうでしょうか。
ありがとうございました。
情報提供ありがとうございました。
更新プログラムの不具合らしいです。下記のリンクを参照してください。
2019年11月アップデート(KB4484113、KB4484119、KB4484127ʌ - マイクロソフト コミュニティ
更新プログラムをアンインストールするか、MSの修正バージョンがでるのを待つことになるそうです。
詳細は上記のスレッドを読んでください。
hatena 様
ありがとうございます。
3通りとも確認し思っていた通りに動作しました。
追加クエリを使用することに致しました。
お手数をお掛け致しました。
勉強になりました。
どのように複雑なのでしょうか。
フォーム2のデータをフォーム1にそのまま追加するだけではないのですか。
データを追加するだけなら、追加クエリが一番簡単です。追加クエリをコードで実行して再クエリです。
コード例
追加クエリを作成したくないなら、コードにSQLを直接記述することも可能です。
一応、追加クエリ(SQL)を使わない別案も出しておきます。
追加クエリの方がシンプルですし、処理も高速です。
hatena 様
ありがとうございます。
追加クエリを使わない方法はないでしょうか?
サンプルは簡素化しておりまして実際は複雑になっており
作り直しができない状態です。
コードではできないのでしょうか?
申し訳ありません。
ファイルを見ました。
フォーム1のレコードソースは「クエリ1」です。
フォーム2のレコードソースは「テーブル2」です。
「フォーム2」のデータを一括で「フォーム2」に追加したいということは、
言い換えれば、「テーブル2」のデータを「クエリ1」(テーブル1と同じもの)に追加するということです。
追加クエリという機能がありますので、それを使えば簡単に一括追加できます。
「テーブル2」から「テーブル1」にデータを追加する追加クエリを作成してください。
一括ボタンのクリック時にその追加クエリを実行するコードを記述すればいいでしょう。
追加クエリを実行後に、フォーム1を再クエリするれば、追加データが表示されます。
Accessのオプション
↓
オブジェクトデザイナー
↓
sqlサーバー互換構文
の中のデータベースのチェックを外したら直りました。
フォームフィルタの画面で「*」を入力してライク検索する際に
今までは、likeとなっていたのに勝手にAlikeとなっていたので気がつきました。
「sqlサーバー互換構文」チェックはした記憶はないのですが不思議です。
ちょっと前にWindowsのアップデートが原因でしょうか?
結構壊れる時がありますから…
ご相談させて頂きましてありがとうございました。