Microsoft Access 掲示板

views
4 フォロー
6,283 件中 1,801 から 1,840 までを表示しています。
13
名前なし 2023/05/29 (月) 22:58:30 851bf@8fdc9

レポートを修正したら実行ができました!
しかし、オーバーフローしましたと最後にエラーが表示されます。
下記の行でエラーになっているようです。
 If FormatCount = 1 Then Ruikei = Ruikei + Me!積載

12

エラーメッセージと、どの行でエラーになっているか教えてください。

11
アクセス初心者 2023/05/29 (月) 17:15:21 fe6cd@a220e

迅速なご回答ありがとうございます。
試みてみましたが、依然としてエラーが表示されました。
何度もご対応いただき申し訳ございません。

Option Compare Database
Option Explicit
Private Ruikei As Long

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
Ruikei = 0
End Sub

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  If FormatCount = 1 Then Ruikei = Ruikei + Me!積載
  Me!累計 = Ruikei
  If Ruikei > 400000000 Then
    Me!改ページ.Visible = True
  Else
    Me!改ページ.Visible = False
  End If
  
MsgBox "Finish"

End Sub
10

Me!積載 でエラーになるということですね。

レポート上にテキストボックスを配置してコントロールソースを「積載」、可視を「いいえ」に設定してください。

レポートでVBAからフィールドを参照する場合、レポート上にそのフィールドを参照するコントロールが必要という仕様があります。

9
アクセス初心者 2023/05/29 (月) 16:07:46 fe6cd@a220e >> 8

上記で正しく表示されなかったため、訂正します。
コチラでエラーが表示されます。
「Meキーワードの使用方法が不正です」

  If FormatCount = 1 Then Ruikei = Ruikei + Me!積載
8
アクセス初心者 2023/05/29 (月) 16:03:42 fe6cd@a220e

レポートで累計値を表示して、累計値が400000000を超えたら、改ページして、かつ、累計値をリセットして(0にして)、再度累計していく。2023/05/23 (火) 20:59:21 の回答に例示したサンプルのようにしたい。ということで間違いないですか。
間違いございません。ご確認ありがとうございます。

2023/05/24のコードで実行したところ、下記の赤文字の部分で
「Meキーワードの使用方法が不正です」といったエラーが表示されました。
どうすれば解消できますでしょうか。

Option Compare Database
Option Explicit
Private Ruikei As Long

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
    Ruikei = 0
End Sub

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  If FormatCount = 1 Then Ruikei = Ruikei + %%{fg:red}Me!積載%%
  Me!累計 = Ruikei
  If Ruikei > 400000000 Then
    Me!改ページ.Visible = True
  Else
    Me!改ページ.Visible = False
  End If
End Sub
7
hatena 2023/05/29 (月) 13:27:04 修正

もう、一度確認しますが、やりたいことは、
レポートで累計値を表示して、累計値が400000000を超えたら、改ページして、かつ、累計値をリセットして(0にして)、再度累計していく。
2023/05/23 (火) 20:59:21 の回答に例示したサンプルのようにしたい。
ということで間違いないですか。

だとしたら、
https://hatenachips.blog.fc2.com/blog-entry-443.html
で紹介した方法はテーブルのフィールドに累計値を出力する方法ですので、今回のご希望とは合致しないと思います。

2023/05/24 (水) 10:01:52 で紹介した方法でできるはずですので、確認してください。
ただし、グループ毎の累計ということは考慮してなかったのでグループヘッダーのフォーマット時で累計値の変数(Ruikei)をリセットするコードを追加してください。

Private Sub グループヘッダー0_Format(Cancel As Integer, FormatCount As Integer)
    Ruikei = 0
End Sub
6
アクセス初心者 2023/05/29 (月) 12:00:52 fe6cd@a220e

ご回答いただき、誠にありがとうございます。
大変申し訳ありません。私の理解不足でvbaによる累計算出ができませんでした。
以下のURLを参考に作成しましたが、うまくいきませんでした。

https://hatenachips.blog.fc2.com/blog-entry-443.html
https://okwave.jp/qa/q9018234.html

Q. グループ化させず累計を算出する場合、下記の〇△◇には何を入れるべきでしょうか。
If SetCumulativeTotal("数値","累計表示フィールド名","テーブル名","〇◎","△▽,◇◆") Then
     MsgBox "完了"
End If

3

3番目の画像の黄色反転しているコードのところで、1番目、2番目のエラーがでるということでしょうか。
「M_店舗」というテーブルはローカルテーブルでしょうか。

どちらにしても、まずは「データベースの分割」を実行することをお勧めします。

2
f_fire 2023/05/27 (土) 11:56:48 df43f@04293

リンクテーブルマネージャーは空欄で何も表示されてません。

1

そのMDBにはリンクテーブルが含まれますか。
また、リンクテーブルのMDBも同じNASに存在しますか。

だとしたら、リンクテーブルのリンク先も NASのネットワークパスに変更してください。

ただし、運用法としてはこのような運用は推奨されません。
データベースファイルの破損の確率が高くなります。

データベースをフロントエンドとバックエンドに分割して運用する方法をお勧めします。詳細は下記のリンク先を参照ください。

Access データベースを分割する - Microsoft サポート

ACCESS データベースを分割して複数人で共有する方法 - たすけてACCESS

5

改ページするタイミング(400000000を超えた時点)で累計をリセットするということですね。

「集計実行」の設定では、そのようなことは不可能ですので、累計はVBAで加算していって表示させるという方法にする必要があります。

Option Compare Database
Option Explicit
Private Ruikei As Long

Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
    Ruikei = 0
End Sub

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  If FormatCount = 1 Then Ruikei = Ruikei + Me!積載
  Me!累計 = Ruikei
  If Ruikei > 400000000 Then
    Me!改ページ.Visible = True
  Else
    Me!改ページ.Visible = False
  End If
End Sub

VBAで累計値を表示させる場合は、レポートのイベントの発生メカニズムを理解していないと、想定通りにならない場合がありますので注意が必要です。
説明すると長くなるので、下記のリンク先を参照して理解するようにしてください。

レポートのイベントの発生メカニズムの研究 - hatena chips

レポートのイベントの発生メカニズムの研究 その2 - hatena chips

4
アクセス初心者 2023/05/24 (水) 09:31:22 fe6cd@a220e

ありがとうございます。ご推察の通りです。

私の方でもネットで調べて作成してみますが、
こういったやり方があるなどございましたら、
ご教示いただけますと幸いです。よろしくお願いいたします。

3

⇒可能であれば改ページした際に再度累計を実行したいと考えております。

累計が 400000000 を超えた時点で、リセット(0に戻す)して、加算していくという意味でしょうか。

例えば、すべてのレコードが100000000として、

100000000
200000000
300000000
400000000
(改ページ)
100000000
200000000
300000000
400000000

というようなイメージですか。

もし、違うなら、上記のように具体例を出して説明してもらえますか。

3
nuneru 2023/05/23 (火) 12:49:20 e48ae@9a838

ありがとうございます!!できました。
大変助かりました!!

1

テキストボックスに(777*8888)と入力すると、カーソルがあった側、(777)だけまたは(8888)だけ選択状態になります。
テキストの先頭、又は末尾に(*)があった場合、(*)以外が選択状態になります。

テキストボックス内のテキストがダブルクリックされた際の挙動として、
ダブルクリックされた位置にある単語が自動的に範囲選択されます。
それが DblClick イベントの後に実行されるため。

ダブルクリックのイベント時にこれを回避するにはどうしたらよいでしょうか?

DblClick イベントの引数 Cancel に False を渡せばよいでしょう。

2
アクセス初心者 2023/05/23 (火) 10:05:43 fe6cd@a220e
Me!改ページ.Visible() = True

の部分は転記ミスしてました。
「累計」テキストボックスのコントロールソース・集計実行設定は以下となっています。
コントロールソース:クエリに記載されている「積載」データ
集計実行設定:「グループ全体」
累計値はレポートビューで確認できていますので、問題ないと思われます。

だとしたら、そのコードでは、累計が400000000を超えた時点で毎レコード改行されることになりますが、それは想定通りですか。
⇒可能であれば改ページした際に再度累計を実行したいと考えております。
 400000000を越えた時点で改ページを繰り返していくイメージが理想です。

1
  Me!改ページ.Visible() = True

の部分は転記ミスですか。

また、
「累計」テキストボックスのコントロールソース、集計実行の設定はどうなってますか。
累計値が表示されるような設定になっているのですか。

だとしたら、そのコードでは、累計が400000000を超えた時点で毎レコード改行されることになりますが、それは想定通りですか。

3

たいてい .Value は既定のプロパティなので省略できるはずです。
ただし、.Value がないコントロールなどは当然エラーになりますが。

14
ノッチ 2023/05/22 (月) 15:35:36 c8dc0@e817a

お世話様です。ご教示を有難うございました。
VBAで多少不詳の所が有りますが、トライしてみます。
種々、大変に有難うございました。

3
nuneru 2023/05/22 (月) 14:46:23 e48ae@9a838

お二方ともありがとうございます。さすがです。
早速やってみたいと思います!

2
マルオ 2023/05/22 (月) 12:16:37 ddfe5@fd35b

すみません、色々試してみるとエラーの再現がなくなりました。きっと別な間違いだったと思います。
因みにこの.Valueは省略しても通常エラーがでることはないでしょうか?

1

うまくいかないとは、具体的にどのようにうまくいかないのでしょうか。

エラーが出るということなら、そのエラーメッセージを提示してください。

13

上記のテストコードで動かすと、エクセルに元々あるシート1~3には書き込みがされず、同じブック内に新たにシート11/21/31と言うシートを作って、その3つのシートに3つのクエリのデータが一つづつ書込まれます。

最初の質問とは異なる現象ですね。当方で実験した限りでは、すでに同名シートがある場合は上書きされました。

どちらにしても、DoCmd.TransferSpreadsheetを使うなら、設計としては下記のようになるかと思います。
テンプレートには、Sheet1、Sheet2、Sheet3 は持たせない。
テンプレートを複製して、そのファイルにクエリをエクスポートする。
テンプレートファイル側で、エクスポートされたシートからテンプレートシートにデータを転記する(Access VBAでエクセルファイルを操作する方法でもOK)。

もし、テストコードに指定する見積りNOのデータのみエクスポートするコードが有ればご教示ください。

エクスポートするクエリはパラメータークエリにして、パラメータはフォームのテキストボックスを参照するようにして、テキストボックスに条件値を入力してから、DoCmd.TransferSpreadsheetを実行すれば、条件値で絞り込まれたデータがエクスポートされます。

12
ノッチ 2023/05/19 (金) 09:30:58 c8dc0@e817a

お世話様です。お手数を掛けます。
ご教示を有難うございます。
上記のテストコードで動かすと、エクセルに元々あるシート1~3には書き込みがされず、同じブック内に新たにシート11/21/31と言うシートを作って、その3つのシートに3つのクエリのデータが一つづつ書込まれます。
これは既にテストをしておりましたが、見積りが多くなって毎回すべてのデータが書込まれると大変なため、このコードに指定した見積りNOのデータのみをエクスポートするコードが無いか調べましたが、ヒントとなるコードでエクスポートするとシート3のみだけ指定見積りNOのデータがエクスポートされましたが、シート1と2は残りませんでした。これ以外は見つからないためにDAOでエクスポートする方策を検討していました。
もし、テストコードに指定する見積りNOのデータのみエクスポートするコードが有ればご教示ください。
様々にお世話になりますが、よろしくお願いします。

14
えいじ 2023/05/18 (木) 21:51:04

hiroton様
返信が遅れて申し訳ありません。
ご丁寧にありがとうございました。

11

このように想定通りに動作しない場合、原因を探るには、なるべく単純化したコードで一つずつ、動作を確認していき、とこで異常が発生するかを特定するというようなデバッグ作業をするようにします。
その場合、エラートラップのコードはコメントアウトしておきます。そうしないと、エラーが出てもどこででているか特定できないので。

とりあえず下記のコードを実行して、見積書.xlsxファイルを開いて、Sheet1, Sheet2, Sheet3 にそれぞれのクエリのデータが出力されているか、確認してください。

Function エクスポートテスト()
    DoCmd.TransferSpreadsheet acExport, 10, "Q_見積明細1_P", "正しいフルパス\見積書.xlsx", True, "Sheet1"
    DoCmd.TransferSpreadsheet acExport, 10, "Q_明細2_R", "正しいフルパス\見積書.xlsx", True, "Sheet2"
    DoCmd.TransferSpreadsheet acExport, 10, "Q_明細3_R", "正しいフルパス\\見積書.xlsx", True, "Sheet3"
End Function
2
モネ 2023/05/18 (木) 16:06:48 c3738@25820

ご回答ありがとうございます。
小数点の方は出来ました。 計算式の方もやってみます。

10
ノッチ 2023/05/18 (木) 16:02:42 c8dc0@e817a

お世話様です。書き込みを有難うございます。
転記したときの誤りの様で、実際のファイルパスは全て同じです。
よろしくお願いします。

9

質問が混在してますが、とりあえず、最初の質問の

DoCmd.TransferSpreadsheetで3つのクエリをエクスポートすると3つ目のデータはエクスポートされますが
、前の2つは消えてしまいます。

についてのみ。

該当するコードは下記の部分だと思いますが、

    DoCmd.TransferSpreadsheet acExport, 10, "Q_見積明細1_P", "\SV30\metal2***課\HDD\リフォーム見積りDB\見積書.xlsx", True, "Sheet1"
    DoCmd.TransferSpreadsheet acExport, 10, "Q_明細2_R", "\SV30\metal2\**課\HDD\リフォーム見積りDB\見積書.xlsx", True, "Sheet2"
    DoCmd.TransferSpreadsheet acExport, 10, "Q_明細3_R", "\SV30\metal2\*****課\HDD\リフォーム見積りDB\見積書.xlsx", True, "Sheet3"

エクスボート先のファイルパスがそれぞれ異なりますが、これは、コードを転記したときに転記ミスですか。
実際のパス名は3つとも同じになってますか。

1

金額は計算されるのですが、小数点2位まで出てしまいます。
どこで設定をすればいいのでしょうか。

「書式」プロパティで設定すればいいのでは。
あるいは、「小数点以下表示桁数」プロパティ。

これでわからなければ、もう少し状況を説明してください。
テーブルのフィールドのデータ型、書式、などの設定
どこにどのように表示したときにそうなるのか。

もう一点質問ですが、計算式で出した答えを使って計算式を作ることはできますか?
振込手数料:[支払対象額]-[振込金額]と言う風にしたいのですが…

できます。
できないなら、どこでどのような計算式を設定して、それをどこで使うのか、説明してください。

4
タツ 2023/05/18 (木) 12:47:42 ddfe5@b26af

hirotonさん 丁寧な回答ありがとうございました。
大変参考になりました。奥が深いものですね。

3
hiroton 2023/05/18 (木) 11:48:00 c11bf@f966d

Form.Load イベント (Access)

最初にフォームを開くと、次の順序でイベントが発生します。

Open → Load → Resize → Activate → Current

マクロまたはイベント プロシージャに Open イベントと Load イベントのどちらを使用するかを決定しようとしている場合、大きな違いの 1 つは Open イベントを 取り消すことができるが、 Load イベントでは使用できないことです。 たとえば、フォームの Open イベントのイベント プロシージャでフォームのレコード ソースを動的に作成する場合、表示するレコードがない場合はフォームの開き方を取り消すことができます。

2
タツ 2023/05/18 (木) 11:32:17 ddfe5@b26af

hirotonさん ありがとうございました。
その設定をするとフォームのプロパティシートにはID=***は残ったままですが動作は正常となりました。
因みにですがフォーム開く時、読み込み時のタイミングには大きな違いがあるものでしょうか?(初歩的な事ですみません)

1
hiroton 2023/05/18 (木) 10:28:24 c11bf@f966d

読み込み時にフィルターを適用プロパティをいいえにして保存します

2

私も、hirotonさんの回答と同様のVBSファイルで起動用ファイルを作成するという方法を利用してます。
ちょっと古い記事ですが、下記でコードを紹介してますのでご参考に。
Accessのバージョンによっては手直しが必要かもしれませんが。

複数ユーザーで共有している場合のフロントエンドファイルのバージョンアップ - hatena chips

8
ノッチ 2023/05/17 (水) 15:40:55 c8dc0@e817a

【追記】
DoCmd.Trnasferは見積りNOでフィルターが掛けられず、全てのデータが出てくるので、これにフィルターが掛けられればこちらのほうが簡単です。
よろしくお願いします。

1
hiroton 2023/05/17 (水) 14:04:22 97216@f966d

バージョン管理をします
メインのファイルはバージョンごとにファイル名を変えます。単純なのは「〇〇システム_20230517.ACCDE」等後ろに日付をつける程度でいいでしょう

バージョン管理テーブルを作成します
メインのファイルを更新するごとにそのファイル名を記録していきます

起動用ファイルを作成します
バージョン管理テーブルから最新の情報を取得してそのファイルを開きます

(メインのファイルでもバージョン管理テーブルを参照するようにすれば、使用中のシステムが最新かどうかを知ることができるでしょう)


起動用ファイルはメインのファイルを実行するだけで、画面を表示する必要はないのでVBSファイルで作ってしまうなんてのもありだと思います

7
ノッチ 2023/05/16 (火) 13:44:59 c8dc0@e817a

■DoCmdエクスポートのコードです~シート3のみが保存されてシート1・2は消えてしまいました。
Function エクセルへエクスポート()

 Dim strSaveBookPath As String
 Dim xls As Object
  'テンプレートの保存先フォルダ
  Const cstrTemplateDir As String = "\SV30**\metal2*課\HDD\リフォーム見積りDB\見積書\"
  'テンプレートのファイル名
  Const cstrTemplateBook As String = "RF見積書.xlsx"
  'データが代入されたファイルの保存先フォルダ
  Const cstrSaveBookDir As String = "\SV30
\metal*2****課\HDD\リフォーム見積りDB\見積書\"
  On Error GoTo エクセルへエクスポート_Err

  'Excelオブジェクトを生成
  Set xls = CreateObject("Excel.Application")
  With xls
    '画面の再描画を抑止
    .ScreenUpdating = False
    'テンプレートファイルを開く
    .Workbooks.Open cstrTemplateDir & cstrTemplateBook

On Error GoTo エクセルへエクスポート_Err

    DoCmd.TransferSpreadsheet acExport, 10, "Q_見積明細1_P", "\SV30**\metal2*課\HDD\リフォーム見積りDB\見積書.xlsx", True, "Sheet1"
    DoCmd.TransferSpreadsheet acExport, 10, "Q_明細2_R", "\SV30
\metal*2*課\HDD\リフォーム見積りDB\見積書.xlsx", True, "Sheet2"
    DoCmd.TransferSpreadsheet acExport, 10, "Q_明細3_R", "\SV30
\metal*2****課\HDD\リフォーム見積りDB\見積書.xlsx", True, "Sheet3"

       '保存するファイル名のフルパスを組み立て
    .strSaveBookPath = cstrSaveBookDir & "見積書_" & Format$(Forms!F_見積!物件名) & ".xlsx"

    '同名ファイルを強制削除
    On Error Resume Next
    Kill strSaveBookPath
    On Error GoTo 0

   '画面の再描画を元に戻す
    .ScreenUpdating = True

    'データを代入したブックを保存
    .ActiveWorkbook.SaveAs strSaveBookPath

    MsgBox "データを保存しました"

    'Excelを終了
    .Quit

  End With

  Set xls = Nothing

エクセルへエクスポート_Exit:
    Exit Function

エクセルへエクスポート_Err:
    MsgBox Error$
    Resume エクセルへエクスポート_Exit

End Function