Microsoft Access 掲示板

6,622 件中 4,281 から 4,320 までを表示しています。
5
hiroton 2021/03/11 (木) 14:58:53 26d02@f966d

ファイル自体が悪さをしているというのはあまり経験がありません。コード自体は単純な処理なので、パス、ファイル名の作り方や単純なタイプミスをまず疑ってしまいます

コピー処理の前後を次のようにするとどうなりますか?

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
2
nokonoko 2021/03/11 (木) 13:31:25 653a6@54883

ありがとうございました。

通貨型の使い方を理解していなかったです。

4
bunta 2021/03/11 (木) 11:22:29 3e392@fa49d

回答ありがとうございます。
ファイルの件提示してい頂いた内容をもとに考えてみたいと思います。
ありがとうございました。

エラーの件ですが、

.Workbooks.Open "C:\テスト\受注伝票テンプレート.xlsx"

こちらに書き換えたところエラーが移り変わりました。

 'ワークシートをコピー
    .Workbooks(cstrTemplateBook).Worksheets("sheet1").Copy

次はこれにエラーが出て、実行時エラー9「インデックスが有効範囲にありません」と出ます、、
やはりファイルが悪さしてるのでしょうか?
ちなみにシート名も間違いがないようコピーして貼り付けています、、

3
hiroton 2021/03/11 (木) 11:04:12 26d02@f966d >> 2

こちらですが、特別会員、通常会員、ビジターの3つのクエリを作成するということでしょうか?

考え方として、3つファイルを出力したいのなら3回出力処理をすればいいですよ。という内容ですね(質問がざっくりだったので)

「種別」が決め打ちできる程度なら決め打ちで作成してもいいですし、出力内容を自動認識させたいならそれはそれでやり方もあります。参考コードだけでやり取りするのは齟齬の元なのでまずは1ファイルでもいいので出力できるコードができてからですね


エラーが出ている部分は特別な処理をしていないよくあるEXCELファイルを開くだけなので原因はよくわかりません

.Workbooks.Open "C:\テスト\受注伝票テンプレート.xlsx"

のように直接記述すると動作しますか?

Debug.Print cstrTemplateDir & cstrTemplateBook
.Workbooks.Open cstrTemplateDir & cstrTemplateBook

として、エラーが出る直前でcstrTemplateDir & cstrTemplateBookの内容を確認すると実際に存在するファイルパスになっていますか?

2
bunta 2021/03/11 (木) 10:21:16 3e392@fa49d

回答いただきありがとうございます。

Sub test()
  ExcelTemplateSample "qsel特別会員", "特別会員"
  ExcelTemplateSample "qsel通常会員", "通常会員"
  ExcelTemplateSample "qselビジター", "ビジター"
End Sub

こちらですが、特別会員、通常会員、ビジターの3つのクエリを作成するということでしょうか?

また、質問で提示したURL先のコードですが実行するとエラーが出てしまいました。

'テンプレートの保存先フォルダ
  Const cstrTemplateDir As String = "C:\テスト\"
  'テンプレートのファイル名
  Const cstrTemplateBook As String = "受注伝票テンプレート.xlsx"
  'データが代入されたファイルの保存先フォルダ
  Const cstrSaveBookDir As String = "C:\テスト\"

ここで指定したファイルパスが間違っていると出ます。
実行時エラーは1004です。
しかし、確かにここに格納されていますし、Shift+右クリックでパスのコピーをしてそのまま貼り付けています。
そしてデバッグを押すと、

'テンプレートファイルを開く
    .Workbooks.Open cstrTemplateDir & cstrTemplateBook

ここが黄色くなります。

原因が分からず困っています・・・
もしこの原因がわかるようでしたら教えて頂けるとありがたいです。

重ねての質問になり申し訳ありません。

元の質問にも追記しました。

1
hiroton 2021/03/11 (木) 10:11:20 26d02@f966d

「pdfで保存する」とは、印刷物をスキャナか何かで再データ化するという意味ですか?
印刷後に何か手を加えて、それの重要度が高いのであればそうする必要があるかもしれませんが「システム」から全く同じものが発行できるのであれば必要になったときにそれをPDFで出力すればいいと思いますよ

それともレコードに請求書idを付与しておき、請求書一覧を表示できるようにして
再発行や確認(再表示)のたびにデータベースを照合して作成しなおすものですか?

これができるのがデータベースのメリットであり、そうやって管理をしよう効率化しようというのが「データベース化」です。

データベースの条件ではないですがやらない理由はないデータベース化の本質だと思いますよ

1
hiroton 2021/03/11 (木) 09:16:28 26d02@f966d

質問がざっくりなので回答もざっくりになりますが

「共通部分はひとまとめに、処理を変えたいところは変数にしてプログラム内で任意に変更できるように」します

リンク先のコードを参考にするなら

  'データ元のクエリを開く
  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

と、出力処理を3回実行してやればファイルを3つ作ることができます

1

「浮動小数点数 誤差」でWEB検索してみてください。正確な計算をおこないたいときは、使えないものだと分かるでしょう。

また、変数はきちんと型を指定して宣言しましょう。型宣言無しに小数を代入すると浮動小数点数になります。

小数点4桁までなら、通貨型を使うと誤差のない計算ができます。

Dim SumFM As Currency
Dim ctl As TextBox
Dim i As Long
For i = 1 to 25
    set ctl = me.Controls("txt0" & Format (i,00))
    SumFM = SumFM + Nz(ctl ,0)
next i
2
みこ 2021/03/06 (土) 15:32:28

hatena様
ご回答有難うございます。
データを確認した所、ご指摘の通りで
売上実績データにはユニークデータしか存在しませんでしたが、
他資料1.2には重複データがあり、
クエリで吐き出された2行の重複データも存在しました。

売上実績データがベース資料なので、これだけユニークになっていれば問題ないものだと思っていましたが、
他資料1.2もユニークデータしないと正しく表示されないということですね!
全てのデータがユニークでないといけないのですかね。
根本的に考え方が間違っていたようです、、有難うございます。

1

クエリで結合して件数が増える場合は、たいてい、一対多の関係になっていないのが原因ですね。多対多の関係になっているということです。

結合するフィールドの片方は、主キーか重複のないインデックスが設定されていますか。この辺のテーブル設計をきちんとしないとデータベースとしては使えないデータになってしまいます。

4

Requeryは全レコードの再読み込みですので、先頭に戻ります。

帳票フォームのカレントレコードを詳細フォームで更新したのなら、カレントレコードの更新のみ反映させればいいので、その場合は、Refresh を使うといいでしょう。これなら、先頭に戻ることはないです。

Requeryは複数レコードを更新してそれを一気に反映させたい場合に使えばいいでしょう。

3
hiroton 2021/03/05 (金) 15:08:37 bfb00@d3250 >> 1

メイン-サブ形式で単純にやるなら、親フォームの枠いっぱいにサブフォームを置いてしまうのが楽だと思います。親フォームはただの外枠扱いですね

帳票1案件毎に左に詳細フォームに飛ぶボタン

案件毎ということはボタンがたくさん並んでいると思います。これをメインとサブに分けて同期してスクロールさせるのは現実的ではありません。上記方法のように親フォームを外枠扱いとするか、「詳細ボタン」はメインに一つにして、選択中の案件が分かりやすいようにサブフォームは選択中の行の背景色を変えるような仕組みにするかですかね

2
セロハン 2021/03/05 (金) 13:19:27 0029a@1c915 >> 1

ご回答ありがとうございます。
そんな方法があるんですね。
今、帳票1案件毎に左に詳細フォームに飛ぶボタンがあるのですが、ここはメインに残しておいて、その他の部分をサブにして埋め込むイメージでしょうか・・?
(イメージがわいておらずスミマセン)

1
hiroton 2021/03/05 (金) 13:01:42 bfb00@d3250

フォームに対してrequeryした場合にリストが再読み込みされて先頭に戻ってしまうのは仕様ですね

requery前にスクロール状態を保存して再度スクロール位置を調整する(面倒)か、メイン-サブフォーム形式にしてサブフォームコントロールをrequeryするのがセオリーでしょうか

Me!サブフォーム.Requery '=>スクロール位置は変わらない
Me!サブフォーム.Form.Requery '=>先頭に移動する
3

MS明朝とMSゴシックが多いでしょうね。
最近のWindowsだと游ゴシックと游明朝が標準になってますね。
他にもいろいろ最初から入ってますので、その中からいいのをさがせばいいでしょう。

私は印刷物にそこまで拘りがないので、MS明朝とMSゴシックを使ってます。

2
ねむ 2021/03/04 (木) 18:39:26 58219@894df

普通はMSゴシックを使うものですか?
なんだか印刷しても汚い気がするんですよね

1

OSにインストールするしかないと思います。

2

回答ありがとうございます。
今手元にファイルがないため確認出来ないのですが、御指摘の手順も実行してみようと思います。

1

そのような経験はないですね。
もう一度、新規に①のクエリを作成、「B」を削除、「実行」としてみても同じ現象が再現しますか。

4
Tonochan 2021/03/03 (水) 20:11:33 9351e@32cf6

丁寧に説明をしていただいてありがとうございました。
頂いた説明を検討してみたいと思います。

3

ラベルとコントロールを選択して「上下の間隔を均等にする」を実行した場合、すべてのコントロールの上下間隔が均等になるので、ラベルとコントロールも上下に並ぶことになります。そういう仕様です。

ラベルとコントロールを左右に並べたい場合は、
コントロールだけ選択して「上下の間隔を均等にする」を実行、
ラベルだけを選択して「上下の間隔を均等にする」を実行、
というように分けてやるしかないと思います。

画像のアップロードの仕方は、下記に説明がありますので、参照してください。

Microsoft Access 掲示板 の使い方 Microsoft Access 掲示板 - zawazawa

2
Tonochan 2021/03/01 (月) 21:36:42 9351e@1c63d

画像のアップロードのやり方がわかりません。
残念ですけど、もう少し自分で考えてそれでもだめなら、またお願いします。
ありがとうございました。

2

文字列が長い場合にのみ二段表示にしたい

元のデータがどのようになっているのか次第ですね。

データ自体に改行がある。
あるいは、
1行目のデータと2行目のデータが別のフィールドに分けている。
ということなら簡単に判断できますので、レポートのフォーマット時イベントで行数に応じて、セクションの高さとコントロールの位置を設定すれば可能ですね。

下記はグループヘッダーの項目名をセンタリングするサンプルですが、これを応用して、詳細セクションに置き換えれば同様にできます。

グループ項目を垂直方向にセンタリングする - hatena chips

特に改行とか、フィールドを分けてあるとかでないなら、2行にするかしないかをどのように判断するのか、2行にする場合場はどこで改行するのかどうやって決めるのか、などをどのように考えているのか詳細な情報が必要ですね。

1
hiroton 2021/03/01 (月) 10:40:54 4b3d7@f966d

特別いい案は知りません

データ的な部分と表示的な部分を分けて考えます

■データ的な部分
2行になる条件のもと、クエリ上でフィールドを2つ(3つ)作ります。

複数行:(2行になる条件) //true または false になる
表示1:IIf([複数行],"",[所属])
表示2:IIf([複数行],(所属の2行表示の文字列),"")

[複数行]フィールドは計算に使うだけなので、各表示用フィールドに直接記述する場合は不要です。2行になる条件が複雑な場合は分けたほうが見やすいでしょう

■表示部分
1行用表示のテキストボックスと2行用表示のテキストボックスを重ねて設置します。それぞれのテキストボックスはそれぞれの表示に見合うよう調整します。前面に表示されるテキストボックスは背景色を「透明」にします

全てのレコードで表示1も表示2も常に表示する設定で、[複数行]の条件で片側は空白(非表示)にすることで望みの見た目になると思います


文字列が長い場合にのみ二段表示にしたい

あいまいな条件なので、複雑な条件で自動認識させたいとかなると途端に難しくなります。回答では、これについてはほぼ「できているモノ」としています。クエリでやるのが難しい場合はテキストボックスは一つで、VBAで上余白を調整するとかになると思います

1
hatena 2021/03/01 (月) 10:26:27 修正

もう少し具体的に行った操作を説明してください。

どのコントロールを選択した状態で、「上下の間隔を均等にする」を実行したのですか。
それらのコントロールはどのようなレイアウトになっていたのですか。
そして、最終的にどのようなレイアウトになるのがご希望だったのですか。

この掲示板は画像をアップロードできるので、実行前のレイアウトと実行後のレイアウトの画像をアップしてもらえると分かり安いですね。

12

できるはずです。どこか間違っているのだと思いますが、こちらからはそちらのファイルが見えませんので指摘できませんが、ちゃんと設定すればできるはずです。

まずは基本を理解してください。

DoCmd.OpenReport メソッド (Access) | Microsoft Docs

上記の説明を読んで理解できれば、

DoCmd.OpenReport "R10_検索", acViewPreview, , Me.Filter, , Me.OrderBy

このコードで OpenArgs が設定できていることが理解できると思います。
6番目の引数に設定した値が、レポートのOpenArgsプロパティに設定されます。

OpenArgsプロパティは値を受け取るだけなので、それを設定しても何も起こりません。
レポート側のイベントプロシージャでOpenArgsに代入された値を使って並べ替える処理を実行して、並べ替えることができます。

もう一度、内容を理解してそれぞれのコードやレポートの設定を見直してください。

どうしても、うまくいかない場合は、右のカラムの一番下の「ファイル送信フォーム」から現状のファイルを送ってください。それを見れば、間違いを指摘できると思います。

11

ごめんなさい!できました!!!
しっかりと読み返してやっと意味が理解できました。
無駄なやり取りをしてしまってすみませんでした。
根本的にOpenArgsを勘違いしていました!
両方でOpenArgsの設定が必要だと思っていて勝手に混乱していました。
もう一度勉強してみます。ありがとうございました!解決です。

10

ありがとうございます。
今の状態だと、開くときイベントに教えてもらったコードを書いても並び替えされません。
前述のとおり、呼び出す側には「DoCmd.OpenReport "R10_検索", acViewPreview, , Me.Filter, , Me.OrderBy」
としか記述していないので、開くときにこのコードを記述する際はOpenArgsにも設定する必要がありますか?

9
hatena 2021/02/28 (日) 16:08:10 修正

繰り返しになりますが、レポートの「開く時」のイベントプロシージャに前回の回答のコードを記述する必要があります。

念のために手順を書いておきますと、

  • R10_検索」レポートをデザインビューで開く。
  • プロパティのイベントタブの「開く時」のドロップダウンリストから[イベント プロシージャ]を選択してビルドボタン[...] をクリックする。
  • VBAウィンドウが開き、下記のように既に記述されています。
Private Sub Report_Open(Cancel As Integer)

End Sub
  • これを下記のように修正します。
Private Sub Report_Open(Cancel As Integer)
    If Me.OpenArgs <> "" Then
        Me.OrderBy = Me.OpenArgs
        Me.OrderByOn = True
    End If
End Sub
  • レポートを保存して閉じます。

以上です。

8

ありがとうございます。
docmd.openreportでは、openargsは特にしてなくて書いた通り、下記の文になってます。
DoCmd.OpenReport "R10_検索", acViewPreview, , Me.Filter, , Me.OrderBy

ここのme.orderbyに値が入っています。

この文ではだめで、openargsをdocmd.openreportで指定しないといけないってことですか?
何度もすみません。よろしくお願いいたします。

7

勘違いされているようですが、
DoCmd.OpenReport の OpenArgs引数は単にレポートに値を渡すだけです。レポート側でその渡された値を使って何か処理をするためのものです。プログラマーがその処理を書かなければ何も起こりません。
並べ替えをしたいのなら、前回の回答のコードが必要です。

6

いいえ。レポートのイベント欄には何にも記述していません。。。
何か変なことをどこかでしているはずですよね。レポートの並び替え設定は何も書いてなければ設定されてないですよね?
呼び出すときは値を渡してそうなんで不思議です。

5

レポートの「開く時」のイベントプロシージャで下記のようなコードを記述してますか。

Private Sub Report_Open(Cancel As Integer)
    If Me.OpenArgs <> "" Then
        Me.OrderBy = Me.OpenArgs
        Me.OrderByOn = True
    End If
End Sub
4

はい、しています。
整列というコマンドボタンがあってそこの更新後処理でやっています。
Private Sub option_整列方法_AfterUpdate()
OrderBy = "[性別] DESC"
OrderByOn = True

DoCmd.OpenReport "R10_検索", acViewPreview, , Me.Filter, , Me.OrderByの、
orderbyには(me.orderby="[性別]")という感じでちゃんとデータはわたっているようです。

3

DoCmd.OpenReport "R10_検索", acViewPreview, , Me.Filter, , Me.OrderBy

だけでは並べ替えできないので、レポートを開く時のイベントで OrderBy を設定するコードが必要ですが、してますか。

2

ありがとうございます。それがレポート側で設定されていないんです。。。
よろしくお願いします。

1

レポートをデザインビューで開いて、リボンの「グループ化と並べ替え」をクリックして、グループ化や並べ替えが設定されていないか確認してください。そちらが設定されているとそれが優先されます。

8

ありがとうございます!この設定でやりたいことができました!
今回も大変勉強になりました。
解決クローズです。

7
hatena 2021/02/27 (土) 12:43:05 修正

フォームのプロパティを下記のように設定します。

プロパティ設定値
フィルター商品コード=Forms!F05_更新削除!商品コード検索
読み込み時にフィルターを適用はい
データ入力用いいえ
フィルターの使用いいえ
 
「商品コード検索」の更新後処理で再クエリするようにします。VBAなら、下記のコードで。
Private Sub 商品コード検索_AfterUpdate()
    Me.Requery
End Sub

さらに開く時にコンボボックスを検索値に設定しておくいいでしょう。

Private Sub Form_Open(Cancel As Integer)
    If Me.OpenArgs <> "" Then
      me.商品コード検索.Value = Me.OpenArgs
    End If
End Sub

検索フォームからこのフォームを呼び出すときは、下記のように OpenArgs を設定しておきます。

    Dim args As String
    args = Me.商品コード
    DoCmd.OpenForm "氏名テーブル", acNormal, , "氏名ID=" & args & "", , acDialog, args
6

ありがとうございます!
上記の方法で希望したことができることを確認しましたが、ひとつ説明不足でできないことがあります。
すみません。。。
更新削除フォームを直接開くと、商品コード検索という非連結のコンボボックスがひとつおいてあって
そこで選んだ商品コードに値するレコードが表示できるようにしています。
「入力用」にすると、これがきかなくなってしまいます。
入力用にしないで新規レコード入力の状態で開くことはできますか?
よろしくお願いいたします。