If Dir(cstrTemplateDir & cstrTemplateBook) = "" Then
MsgBox cstrTemplateDir & cstrTemplateBook & "は存在しません"
End If
Dim xlBook As Object
'ワークシートをコピー
Set xlBook = .Workbooks(cstrTemplateBook)
xlBook.Worksheets("sheet1").Copy
Set xlBook = Nothing
'データ元のクエリを開く
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("qsel受注伝票")
'保存するファイル名のフルパスを組み立て
strSaveBookPath = cstrSaveBookDir & "受注伝票_" & Format$(lngOrderID, "00000") & ".xlsx"
この部分が変数にする(固定では困る)部分ですかね
例えば
Public Sub ExcelTemplateSample(queryName As String, fileName As String)
'データ元のクエリを開く
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(queryName)
'保存するファイル名のフルパスを組み立て
strSaveBookPath = cstrSaveBookDir & fileName & ".xlsx"
のように変更して
Sub test()
ExcelTemplateSample "qsel特別会員", "特別会員"
ExcelTemplateSample "qsel通常会員", "通常会員"
ExcelTemplateSample "qselビジター", "ビジター"
End Sub
ファイル自体が悪さをしているというのはあまり経験がありません。コード自体は単純な処理なので、パス、ファイル名の作り方や単純なタイプミスをまず疑ってしまいます
コピー処理の前後を次のようにするとどうなりますか?
ありがとうございました。
通貨型の使い方を理解していなかったです。
回答ありがとうございます。
ファイルの件提示してい頂いた内容をもとに考えてみたいと思います。
ありがとうございました。
エラーの件ですが、
こちらに書き換えたところエラーが移り変わりました。
次はこれにエラーが出て、実行時エラー9「インデックスが有効範囲にありません」と出ます、、
やはりファイルが悪さしてるのでしょうか?
ちなみにシート名も間違いがないようコピーして貼り付けています、、
考え方として、3つファイルを出力したいのなら3回出力処理をすればいいですよ。という内容ですね(質問がざっくりだったので)
「種別」が決め打ちできる程度なら決め打ちで作成してもいいですし、出力内容を自動認識させたいならそれはそれでやり方もあります。参考コードだけでやり取りするのは齟齬の元なのでまずは1ファイルでもいいので出力できるコードができてからですね
エラーが出ている部分は特別な処理をしていないよくあるEXCELファイルを開くだけなので原因はよくわかりません
のように直接記述すると動作しますか?
として、エラーが出る直前で
cstrTemplateDir & cstrTemplateBook
の内容を確認すると実際に存在するファイルパスになっていますか?回答いただきありがとうございます。
こちらですが、特別会員、通常会員、ビジターの3つのクエリを作成するということでしょうか?
また、質問で提示したURL先のコードですが実行するとエラーが出てしまいました。
ここで指定したファイルパスが間違っていると出ます。
実行時エラーは1004です。
しかし、確かにここに格納されていますし、Shift+右クリックでパスのコピーをしてそのまま貼り付けています。
そしてデバッグを押すと、
ここが黄色くなります。
原因が分からず困っています・・・
もしこの原因がわかるようでしたら教えて頂けるとありがたいです。
重ねての質問になり申し訳ありません。
元の質問にも追記しました。
「pdfで保存する」とは、印刷物をスキャナか何かで再データ化するという意味ですか?
印刷後に何か手を加えて、それの重要度が高いのであればそうする必要があるかもしれませんが「システム」から全く同じものが発行できるのであれば必要になったときにそれをPDFで出力すればいいと思いますよ
これができるのがデータベースのメリットであり、そうやって管理をしよう効率化しようというのが「データベース化」です。
データベースの条件ではないですがやらない理由はないデータベース化の本質だと思いますよ
質問がざっくりなので回答もざっくりになりますが
「共通部分はひとまとめに、処理を変えたいところは変数にしてプログラム内で任意に変更できるように」します
リンク先のコードを参考にするなら
この部分が変数にする(固定では困る)部分ですかね
例えば
のように変更して
と、出力処理を3回実行してやればファイルを3つ作ることができます
「浮動小数点数 誤差」でWEB検索してみてください。正確な計算をおこないたいときは、使えないものだと分かるでしょう。
また、変数はきちんと型を指定して宣言しましょう。型宣言無しに小数を代入すると浮動小数点数になります。
小数点4桁までなら、通貨型を使うと誤差のない計算ができます。
hatena様
ご回答有難うございます。
データを確認した所、ご指摘の通りで
売上実績データにはユニークデータしか存在しませんでしたが、
他資料1.2には重複データがあり、
クエリで吐き出された2行の重複データも存在しました。
売上実績データがベース資料なので、これだけユニークになっていれば問題ないものだと思っていましたが、
他資料1.2もユニークデータしないと正しく表示されないということですね!
全てのデータがユニークでないといけないのですかね。
根本的に考え方が間違っていたようです、、有難うございます。
クエリで結合して件数が増える場合は、たいてい、一対多の関係になっていないのが原因ですね。多対多の関係になっているということです。
結合するフィールドの片方は、主キーか重複のないインデックスが設定されていますか。この辺のテーブル設計をきちんとしないとデータベースとしては使えないデータになってしまいます。
Requeryは全レコードの再読み込みですので、先頭に戻ります。
帳票フォームのカレントレコードを詳細フォームで更新したのなら、カレントレコードの更新のみ反映させればいいので、その場合は、Refresh を使うといいでしょう。これなら、先頭に戻ることはないです。
Requeryは複数レコードを更新してそれを一気に反映させたい場合に使えばいいでしょう。
メイン-サブ形式で単純にやるなら、親フォームの枠いっぱいにサブフォームを置いてしまうのが楽だと思います。親フォームはただの外枠扱いですね
案件毎ということはボタンがたくさん並んでいると思います。これをメインとサブに分けて同期してスクロールさせるのは現実的ではありません。上記方法のように親フォームを外枠扱いとするか、「詳細ボタン」はメインに一つにして、選択中の案件が分かりやすいようにサブフォームは選択中の行の背景色を変えるような仕組みにするかですかね
ご回答ありがとうございます。
そんな方法があるんですね。
今、帳票1案件毎に左に詳細フォームに飛ぶボタンがあるのですが、ここはメインに残しておいて、その他の部分をサブにして埋め込むイメージでしょうか・・?
(イメージがわいておらずスミマセン)
フォームに対してrequeryした場合にリストが再読み込みされて先頭に戻ってしまうのは仕様ですね
requery前にスクロール状態を保存して再度スクロール位置を調整する(面倒)か、メイン-サブフォーム形式にしてサブフォームコントロールをrequeryするのがセオリーでしょうか
MS明朝とMSゴシックが多いでしょうね。
最近のWindowsだと游ゴシックと游明朝が標準になってますね。
他にもいろいろ最初から入ってますので、その中からいいのをさがせばいいでしょう。
私は印刷物にそこまで拘りがないので、MS明朝とMSゴシックを使ってます。
普通はMSゴシックを使うものですか?
なんだか印刷しても汚い気がするんですよね
OSにインストールするしかないと思います。
回答ありがとうございます。
今手元にファイルがないため確認出来ないのですが、御指摘の手順も実行してみようと思います。
そのような経験はないですね。
もう一度、新規に①のクエリを作成、「B」を削除、「実行」としてみても同じ現象が再現しますか。
丁寧に説明をしていただいてありがとうございました。
頂いた説明を検討してみたいと思います。
ラベルとコントロールを選択して「上下の間隔を均等にする」を実行した場合、すべてのコントロールの上下間隔が均等になるので、ラベルとコントロールも上下に並ぶことになります。そういう仕様です。
ラベルとコントロールを左右に並べたい場合は、
コントロールだけ選択して「上下の間隔を均等にする」を実行、
ラベルだけを選択して「上下の間隔を均等にする」を実行、
というように分けてやるしかないと思います。
画像のアップロードの仕方は、下記に説明がありますので、参照してください。
Microsoft Access 掲示板 の使い方 Microsoft Access 掲示板 - zawazawa
画像のアップロードのやり方がわかりません。
残念ですけど、もう少し自分で考えてそれでもだめなら、またお願いします。
ありがとうございました。
元のデータがどのようになっているのか次第ですね。
データ自体に改行がある。
あるいは、
1行目のデータと2行目のデータが別のフィールドに分けている。
ということなら簡単に判断できますので、レポートのフォーマット時イベントで行数に応じて、セクションの高さとコントロールの位置を設定すれば可能ですね。
下記はグループヘッダーの項目名をセンタリングするサンプルですが、これを応用して、詳細セクションに置き換えれば同様にできます。
グループ項目を垂直方向にセンタリングする - hatena chips
特に改行とか、フィールドを分けてあるとかでないなら、2行にするかしないかをどのように判断するのか、2行にする場合場はどこで改行するのかどうやって決めるのか、などをどのように考えているのか詳細な情報が必要ですね。
特別いい案は知りません
データ的な部分と表示的な部分を分けて考えます
■データ的な部分
2行になる条件のもと、クエリ上でフィールドを2つ(3つ)作ります。
[複数行]フィールドは計算に使うだけなので、各表示用フィールドに直接記述する場合は不要です。2行になる条件が複雑な場合は分けたほうが見やすいでしょう
■表示部分
1行用表示のテキストボックスと2行用表示のテキストボックスを重ねて設置します。それぞれのテキストボックスはそれぞれの表示に見合うよう調整します。前面に表示されるテキストボックスは背景色を「透明」にします
全てのレコードで表示1も表示2も常に表示する設定で、[複数行]の条件で片側は空白(非表示)にすることで望みの見た目になると思います
あいまいな条件なので、複雑な条件で自動認識させたいとかなると途端に難しくなります。回答では、これについてはほぼ「できているモノ」としています。クエリでやるのが難しい場合はテキストボックスは一つで、VBAで上余白を調整するとかになると思います
もう少し具体的に行った操作を説明してください。
どのコントロールを選択した状態で、「上下の間隔を均等にする」を実行したのですか。
それらのコントロールはどのようなレイアウトになっていたのですか。
そして、最終的にどのようなレイアウトになるのがご希望だったのですか。
この掲示板は画像をアップロードできるので、実行前のレイアウトと実行後のレイアウトの画像をアップしてもらえると分かり安いですね。
できるはずです。どこか間違っているのだと思いますが、こちらからはそちらのファイルが見えませんので指摘できませんが、ちゃんと設定すればできるはずです。
まずは基本を理解してください。
DoCmd.OpenReport メソッド (Access) | Microsoft Docs
上記の説明を読んで理解できれば、
DoCmd.OpenReport "R10_検索", acViewPreview, , Me.Filter, , Me.OrderBy
このコードで OpenArgs が設定できていることが理解できると思います。
6番目の引数に設定した値が、レポートのOpenArgsプロパティに設定されます。
OpenArgsプロパティは値を受け取るだけなので、それを設定しても何も起こりません。
レポート側のイベントプロシージャでOpenArgsに代入された値を使って並べ替える処理を実行して、並べ替えることができます。
もう一度、内容を理解してそれぞれのコードやレポートの設定を見直してください。
どうしても、うまくいかない場合は、右のカラムの一番下の「ファイル送信フォーム」から現状のファイルを送ってください。それを見れば、間違いを指摘できると思います。
ごめんなさい!できました!!!
しっかりと読み返してやっと意味が理解できました。
無駄なやり取りをしてしまってすみませんでした。
根本的にOpenArgsを勘違いしていました!
両方でOpenArgsの設定が必要だと思っていて勝手に混乱していました。
もう一度勉強してみます。ありがとうございました!解決です。
ありがとうございます。
今の状態だと、開くときイベントに教えてもらったコードを書いても並び替えされません。
前述のとおり、呼び出す側には「DoCmd.OpenReport "R10_検索", acViewPreview, , Me.Filter, , Me.OrderBy」
としか記述していないので、開くときにこのコードを記述する際はOpenArgsにも設定する必要がありますか?
繰り返しになりますが、レポートの「開く時」のイベントプロシージャに前回の回答のコードを記述する必要があります。
念のために手順を書いておきますと、
以上です。
ありがとうございます。
docmd.openreportでは、openargsは特にしてなくて書いた通り、下記の文になってます。
DoCmd.OpenReport "R10_検索", acViewPreview, , Me.Filter, , Me.OrderBy
ここのme.orderbyに値が入っています。
この文ではだめで、openargsをdocmd.openreportで指定しないといけないってことですか?
何度もすみません。よろしくお願いいたします。
勘違いされているようですが、
DoCmd.OpenReport の OpenArgs引数は単にレポートに値を渡すだけです。レポート側でその渡された値を使って何か処理をするためのものです。プログラマーがその処理を書かなければ何も起こりません。
並べ替えをしたいのなら、前回の回答のコードが必要です。
いいえ。レポートのイベント欄には何にも記述していません。。。
何か変なことをどこかでしているはずですよね。レポートの並び替え設定は何も書いてなければ設定されてないですよね?
呼び出すときは値を渡してそうなんで不思議です。
レポートの「開く時」のイベントプロシージャで下記のようなコードを記述してますか。
はい、しています。
整列というコマンドボタンがあってそこの更新後処理でやっています。
Private Sub option_整列方法_AfterUpdate()
OrderBy = "[性別] DESC"
OrderByOn = True
DoCmd.OpenReport "R10_検索", acViewPreview, , Me.Filter, , Me.OrderByの、
orderbyには(me.orderby="[性別]")という感じでちゃんとデータはわたっているようです。
DoCmd.OpenReport "R10_検索", acViewPreview, , Me.Filter, , Me.OrderBy
だけでは並べ替えできないので、レポートを開く時のイベントで OrderBy を設定するコードが必要ですが、してますか。
ありがとうございます。それがレポート側で設定されていないんです。。。
よろしくお願いします。
レポートをデザインビューで開いて、リボンの「グループ化と並べ替え」をクリックして、グループ化や並べ替えが設定されていないか確認してください。そちらが設定されているとそれが優先されます。
ありがとうございます!この設定でやりたいことができました!
今回も大変勉強になりました。
解決クローズです。
フォームのプロパティを下記のように設定します。
さらに開く時にコンボボックスを検索値に設定しておくいいでしょう。
検索フォームからこのフォームを呼び出すときは、下記のように OpenArgs を設定しておきます。
ありがとうございます!
上記の方法で希望したことができることを確認しましたが、ひとつ説明不足でできないことがあります。
すみません。。。
更新削除フォームを直接開くと、商品コード検索という非連結のコンボボックスがひとつおいてあって
そこで選んだ商品コードに値するレコードが表示できるようにしています。
「入力用」にすると、これがきかなくなってしまいます。
入力用にしないで新規レコード入力の状態で開くことはできますか?
よろしくお願いいたします。