Microsoft Access 掲示板

6,744 件中 2,041 から 2,080 までを表示しています。
2
nokonoko 2023/07/14 (金) 11:04:08 3e2e6@54883 >> 1

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

     On Error GoTo Err_Handler2
    .activeworkbook.saveas strsavebookpath

Err_Handler2:
MsgBox "適当なメッセージ"
xls.close SaveChanges:=False

Resume Exit_Here

としてみたのですが、xls.closeが間違っているということで、うまくいきませんでした。
初歩的な質問で申し訳ございませんが、どうすればよかったのでしょう。

1
hiroton 2023/07/14 (金) 10:41:36 5534d@f966d

そのクエリでは貸方も絞り込み出来ているのにフォーム上では機能しないのです。グループのコンボボックス更新後のサブフォームの対象にはRequeryもしているのですが。

真っ先に疑うのはコードの記述ミスですね
どのようなコードを記述してるんですか?

ついでに、コードエディタの方で「[デバッグ]→[(データベース名)のコンパイル]」でエラーが出てたりしませんか?

1
hiroton 2023/07/14 (金) 08:57:45 5534d@f966d

保存しようと思ってたもの破棄しちゃっていいんですか?
https://www.google.com/search?q=VBA Excelを保存しないで終了する方法

名前変えるのがNGなら適当にメッセージボックスだして待機させた後保存処理やり直したらいいんじゃない?

9
hiroton 2023/07/11 (火) 12:03:29 fc8bf@f966d

当初、表示を分ける必要がなかったので整数部と小数部をまとめて処理するためにLeft,InStrの組み合わせにしたんですけど、最終的な目的から見ればすでにやってる方法で問題ないと思いますよ

安っぽいやり方に思えて

ACCESSは実に安いソフトなので、安っぽい方法で目的が達成できたのなら喜びましょう

軽く触れましたが、文字(文字列)の表示は非常に高度な問題です。ACCESSはかなり苦手とする部類で、「レポートの表示だけでいい」のならある程度力業を組み合わせてしまったほうがすんなりいくものです

8
hiroton 2023/07/11 (火) 10:17:02 fc8bf@f966d >> 5

やっぱり計算式間違いやってるやーつ・・・

小数部表示:IIf([商品区分]="燃料油",Mid([丸めた数量]-Fix([丸めた数量])+0.001,2,3))&[単位]


小数部表示:IIf([商品区分]="燃料油",Mid([丸めた数量]-Fix([丸めた数量]+0.001),2,3))&[単位]


小数部表示:IIf([商品区分]="燃料油",Mid([丸めた数量]-Fix([丸めた数量])+0.001,2,3))&[単位]


実際にACCESS触らず手打ちでやってるとイカンなやつでした

7
oilService 2023/07/11 (火) 09:33:40 13b9a@89413

hirotonさん、貴重なお時間を使わせてしまって、本当にありがとうございました。
整数と小数を分けて取出して表示する方法は、下記の通り私も作っていたのですが、どうにも安っぽいやり方に思えて長年モヤモヤしていました。

整数部:fix([数量]
小数部:IIf([商品区分]="燃料油", Format([数量]-[整数部],"#.00"),""))

Left関数とinStr関数の組み合わせで表示できるとは、hirotonさんにあらためて感謝申し上げます。

6
hiroton 2023/07/10 (月) 22:52:30 7d804@2ee8f >> 2

さらに修正・・・

数量の表示: Left([丸めた数量]+0.001,InStr([丸めた数量] & ".",".")+IIf([商品区分]="燃料油",2,-1))

[丸めた数量][数量]は例えば[数量]9.999のとき[丸めた数量]10となって桁が変わる可能性があるので横着せず両方とも[丸めた数量]を使う必要がありました
意図せず記述してましたが、[丸めた数量]はやっぱり別フィールドにして計算させておいた方がよさそうですね

5
hiroton 2023/07/10 (月) 22:46:36 修正 7d804@2ee8f

整数の位置に表示できないでしょうか?

単位をどう表示するかも悩ましいところですが、文字位置は使っているフォントで調整が必要になったりするのでとても難しいですね

整数表示(右詰め)、小数部表示(左詰め)とテキストボックスを2つ並べてしまうのが簡単だと思います

整数表示 :Fix([丸めた数量])
小数部表示:IIf([商品区分]="燃料油",Mid([丸めた数量]-Fix([丸めた数量]+0.001),2,3))&[単位]
4
hiroton 2023/07/10 (月) 22:14:28 修正 7d804@2ee8f

ACCESS標準の書式設定ではちょっと難しい案件なので文字として整形してしまいます

Left(
    [丸めた数量]+0.001                    :0詰めをして小数点3桁にそろえた文字
    ,InStr([丸めた数量] & ".",".")        :小数点の位置
        +IIf([商品区分]="燃料油",2,-1)    :条件に合わせて+2(小数点以下2桁)/-1(整数)
)

登録するデータはある程度入力ルールが決まっていると思いますが、単純に数値とするといろいろな入力が考えられます

パターン123456←文字位置
A4
B24.13
C24.1
D9.543
E24.999

ほしい結果は2パターンで
Ⅰ:先頭から小数点の前の文字まで
Ⅱ:先頭から小数点の2文字先まで

先頭から文字列を抜き出せばいいのでLeft関数を使ってそれぞれ

Ⅰ:Left( 基準の文字列, 先頭から小数点の2文字先まで)
Ⅱ:Left( 基準の文字列, 先頭から小数点の前の文字まで)

を作ります

基準の文字列
文字列として処理するので丸め処理をした数値を基にします
注意が必要なのは、上記ACパターンで、小数点以下2桁までほしいのに文字列としては桁数が足りません。そこで、元の数値に影響なく、桁が足りないデータに対しては0で埋められるように[丸めた数量]+0.001と計算させています。丸め処理済みであれば数値のない小数点以下第3桁に1を加えても影響がでません
逆に丸め処理が済んでいない場合、例えばEパターンにこのような計算式を当ててしまうと基にすべき数値が変わってしまうので注意が必要です

先頭から小数点
InStr関数で文字位置を調べればいいですね。ただし、整数のデータには小数点がないので、小数点があると仮定した位置を返すように、[丸めた数量] & "."を元のデータとして"."を探すようにします

の2文字先まで/の前の文字まで
単純に+2/-1でいいので、これをIIf関数で条件を付けて切り替えます

3
oilService 2023/07/10 (月) 20:48:12 79353@76ab6

hirotonさん、すばらしいです!希望通りの表示になりました。ありがとうございます。ただ私のレベルでは、この式を紐解くのは無理なようです。ぜひ詳細なご説明をお願いいたします。
欲を言いますと、整数が右詰になってしまい、燃料油の少数第二位の位置に表示されます。
   レギュラー 23.56ℓ
   タイヤ     4本
ではなく
   レギュラー 23.56ℓ
   タイヤ    4  本
と整数の位置に表示できないでしょうか?

2
hiroton 2023/07/10 (月) 18:01:50 2c180@2ee8f >> 1

修正修正を重ねたらやっぱり間違ってるし

数量の表示: Left([丸めた数量]+0.001,InStr([数量] & ".",".")+IIf([商品区分]="燃料油",2,-1))

※不要な「)」が残ってました
数量の表示: Left([丸めた数量])+0.001,InStr([数量] & ".",".")+IIf([商品区分]="燃料油",2,-1))

1
hiroton 2023/07/10 (月) 17:27:04 修正 10a5a@f966d

表示用にテキストでデータを作る。かな

数量の表示: Left([丸めた数量])+0.001,InStr([数量] & ".",".")+IIf([商品区分]="燃料油",2,-1))
15
ビギナー 2023/07/10 (月) 16:48:02 ddfe5@06621

hatena様ありがとうございます。複数ユーザーで使用することはありません。現状は中途半端な知識なので非連結フォームはやめておいた方がいいですね。大変参考になりました。ありがとうございました。

14

あとご意見お聞きしたいのですがファームで入力の際、テーブル等を基にして直接する方法と非連結フォームを使い追加クエリーで登録する方法ありますが一般的にどうしているのしょうか? メリット・デメリットがあるのでしょうか? 

非連結フォームは帳票表示できないので、基本1レコード毎での入力になります。
帳票表示で入力したい場合は、一時テーブルに転記してそれを更新する、更新後、クエリかVBAで元テーブルに反映させるという設計になります。

メリット
自由度が高い
複数ユーザーで共有する場合、データベース破損の危険性が低減する

デメリット
コード量が多くなる
Accessが自動でやってくれることをすべて自前でやる必要があるので、高いスキルが必要。
特に複数ユーザーで共有する場合、排他制御などかなり高度なスキルが必要です。
中途半端なスキルだとかえってデータ破損、整合性不可の危険性が高いです

連結フォームはメリットデメリット上記の逆になります。
データベース破損の危険性はユーザー数か一桁なら、めったに壊れません。
2桁以上のユーザーが同時更新するなら、危険性は高くなりますが、そうなると、SQLサーバーなどのRDBMSを検討した方がいいという話になります。

13
ビギナー 2023/07/10 (月) 14:27:14 ddfe5@06621

すみません、この件は解決できました。仕訳時の貸方金額-借方金額が0より大きい場合のIIfでいけました。
色々とありがとうございました。もう少し経理の知識身につけてACCESSに展開したいと思います。

12
ビギナー 2023/07/10 (月) 13:17:14 ddfe5@06621

hiroton様ありがとうございます。確かにそうですね、その点は考えてみます。別の関連書類でどうしたら出来るのかなという事がでてきました。例えば日々の仕訳で下記の場合
仕訳ID 日付  借方科目     借方金額    貸方科目  貸方金額
  1  6/1   普通預金     9,500     売掛金   10,000
    2        支払い手数料    500

総勘定元帳(科目毎の履歴)には2つ以上の仕訳の場合”諸口”という表現での転記が必要で、売掛金用の台帳は
  日付  相手方勘定科目(売掛金に対して)  借方金額   貸方金額     残高
  6/1   諸口 ←                      10,000    10,000 
となるのです。この形にデータの加工はIIfか何かで可能でしょうか? いいアイデアありますでしょうか?

11
hiroton 2023/07/10 (月) 11:52:59 10a5a@f966d

借方or貸方のどちらかがNULLになることもあります。

とのことなので

案件ID
1
2

このようなデータに対して問題のレポートで「行をずらす」をした場合、1レコードに左右両方のデータを保存してしまうと

案件ID
1
1
1
2
2
2

のようになってしまいます。(行内で段を作って疑似的に行分けをしているだけでそれぞれの行が変わるわけではないため)

それと、1つの仕訳に関するデータが複数レコードになる場合があるので、どのデータがグループになっているのかという情報が必要になります。仕訳IDの設定とそれに付随して、仕訳メインテーブルの作成、日付は仕訳メインで登録というのはあってもいいと思います

というわけで、

項目

項目ID借り項目貸し項目
1売掛金売上高
2売掛金消費税

仕訳サブ

明細ID仕訳ID借り貸しフラグ項目ID金額
110111000
211110000
31121000

こんな感じでやるかなぁというのがhirotonの感想です

多対多のデータになるようなので結構大変な案件なんじゃないですかね

10
あん 2023/07/10 (月) 10:16:13 927ea@53b5d

hatena様、hiroton様
ご提案のコードでプログラム作成させていただきました。

動作検証も行いましたが、特に問題なさそうです。
どちらかを使わせていただきたいと思います。
また、コードのお勉強もさせていただました。
毎度、ありがとうございます。

hiroton様
バック(テーブル)がSQL Serverを用いておりますので、ファイル容量には問題ありません。
ご心配ありがとうございます。

りんご様
既製品の導入に関してですが、
Accessでファイル管理していくことに問題や不便があれば、検討しますが、何もないので導入はしません。
特に有料であればなおさらです。
無料の場合でも、Accessでの入力とは別途に、ユーザーが既製品ソフトを起動して、ファイルを保存したり、該当ファイルを出力したりの操作をするのは余計な手間になりますし、間違いも起こりえるでしょう。
ただし、Accessから自動的に既製品ソフトを開いてファイルを保存したり、該当ファイルを出力したりするプログラムが出来れば別ですが。

昭和でも、黒歴史でも、目的が達成できればいいです。
ユーザー本位のプログラムができれば。それができなければ、失敗作なのでしょう。

それでは、この度もありがとうございました。

10
ビギナー 2023/07/10 (月) 08:41:52 ddfe5@06621

hatena様ご意見ありがとうございます。親子フォームにしたいのでテーブルを1対多のリレーションの固定観念がありました。確かにメインが日付位であれば1レコードでいけますね。まだまだ試しの段階ですので日々の仕訳データを基に加工して色々な書類(最終的に決算書) の作成となります。経理の知識も平行して進めたいと思います。その際色々なコードが必要となりますのでまた質問させて頂きますね。あとご意見お聞きしたいのですがファームで入力の際、テーブル等を基にして直接する方法と非連結フォームを使い追加クエリーで登録する方法ありますが一般的にどうしているのしょうか? メリット・デメリットがあるのでしょうか? 

9

仕訳サブ のデータ例ですね。
これと 仕訳メイン の関係はどのようなものですか。
仕訳メインが 処理ID 日付 の2フィールドだけなら、メインとサブに分ける必要もないと思います。
仕訳サブ の方に 日付 フィールドを追加すればすみますので。

メインサブフォーム形式にしたいのなら、メインフォームは非連結で、非連結の日付テキストボックスを配置すればすみます。

上記の点は除外して、現状のテーブル設計で特に問題はないと思いますが、どの辺に不満点がありますか。

りんごさん提案の設計法もあると思いますが、最初の質問のような出力をレポートでするなら現状の方が扱いやすいように思います。

8
ビギナー 2023/07/07 (金) 15:00:19 ddfe5@06621

色々コメントありがとうございました。私自身経理担当ではなく詳しくはないのですが、日々の様々な取引が仕訳処理され、借方と貸方の合計金額は必ず合致します。項目は多数あります。売上高、売掛金、仕入れ高、買掛金 等。それらは借方、貸方のどちも使う項目となります。例えば1つの取引の仕訳で
仕訳明細ID  借方科目  借方金額  適用   貸方科目  貸方金額
1       売掛金   11,000     A社へ  売上高   10,000
2                                           消費税    1,000

こんな感じで借方or貸方のどちらかがNULLになることもあります。
例えば売上高に対しては売掛金、手形、現金等と選択肢は決まってきます。
経理担当がエクセルで処理しておりそこからデータ拾って色々な台帳作成しているのですが同じ事を何度も転記は手間でACCESSならこの仕訳入力だけでいけると思い。提案しているところなのです。経理ソフトもあるのですが自作の方がカスタマイズが自由にできていいなと思った次第です。(私自身別業務で少しだけACCESS使った経験があり、なんて便利なんだろうと感じたので)

7

hatena様 借方、貸方データはテーブルを分けておいた方が融通が効きますでしょうか? 

経理には詳しくないのですが、分ける必要性はないように思います。

・テーブル/仕訳メイン⇒①処理ID ②日付
・テーブル/仕訳サブ⇒①明細ID ②処理ID ③借方項目 ④借方金額 ⑤貸方項目 ⑥貸方金額

仕訳メイン と 仕訳サブ の関係性がよくわかりませんが、どのようなデータが格納されているのか、
データ例を提示してもらえませんか。

6
りんご 2023/07/06 (木) 18:36:59 935bc@0e907

何かいいアイデアがあればお願いします。
 借方項目、貸方項目は、1つのフィールドにまとめて、勘定科目。借方金額、貸方金額は、1つのフィールドにまとめて、仕訳金額。そして、貸借区分フィールドを追加。

5
ビギナー 2023/07/06 (木) 15:47:18 ddfe5@ff525

hatena様 借方、貸方データはテーブルを分けておいた方が融通が効きますでしょうか? 
各Subテーブルに処理IDをつけてMainテーブルにリレーションで(親フォームに子フォーム2つ配置する形)
フォーム入力時に(同じ取引上)借方で選んだ項目は貸方では選択できない、どちらかで選んだ項目に関連する項目だけが選択肢になる様な事もしたいと思ってます(まだそこまでは全然出来ていませんが)

4

クエリで1レコードにしています。

とのことから、元は複数レコードになっていると解釈したのですが、
T仕訳処理Sub のデータ自体が 借方、貸方のデータが1レコードに格納されているということでしょうか。

なら、レポート上で2行に配置ですね。

3
ビギナー 2023/07/06 (木) 14:33:49 ddfe5@ff525

hatena様 ありがとうございます。確かに配置ですね。レポートの基クエリは下記でどうかなと思ってます。
SELECT T仕訳処理Main.発生日付, T仕訳処理Sub.適用, T仕訳処理Sub.借方科目, T仕訳処理Sub.貸方科目, T仕訳処理Sub.借方金額, T仕訳処理Sub.貸方金額
FROM T仕訳処理Main INNER JOIN T仕訳処理Sub ON T仕訳処理Main.仕訳ID = T仕訳処理Sub.仕訳ID;
出力としては画像のイメージです(これはネットからの引用ですが)

2

上記の疑問点はとりあえず置いておいて、
1レコードのデータを2行にするなら、詳細セクションで、テキストボックスを2行になるように配置するだけのことだと思いますが。

画像1

1

借方・貸方が同じ行となります。メイン・サブを基にクエリで1レコードにしています。

1レコードにするからでは。
1レコードにする必要性がないように思いますが。

とりあえず現状の仕訳メイン仕訳サブのデータ例と、希望の結果出力例を提示してもらえますか。

9
hiroton 2023/07/03 (月) 17:05:43 修正 9d659@f966d

OLEオブジェクトの利点はプレビュー表示ができることです。プレビュー表示の必要なく、関連ファイルの管理をしたいだけならば添付ファイル型を使用したほうがいいと思います

データベースのレコードにファイルやグラフィックスを添付する

プレビューに関しても、対象が単票フォームであれば非連結オブジェクトフレームで対応するという方法がとれるかもしれません


それはそれとして、データベースに埋め込まないでACCESSでファイル管理機能を組む、というのもありだと思います。OLEオブジェクトにしろ添付ファイル型にしろ何かと制限はあるし、このご時世2GBまでというACCESSの制限はちょっと怖いです

ただし、ファイル操作に関して自前でVBAを駆使することになるのでそれなりに難易度は上がります

8
りんご 2023/07/03 (月) 16:57:45 935bc@0e907 >> 7

 やろうとしている事は昭和のあるあるですね。それをデータベースと呼ぶ時代も、もしかしたらあったのかもしれませんが、黒歴史です。
 データの一元管理がやりたいのであれば、Excelやpdfの中身を分解して、正規化済みのデータベースソフトに取り込んで下さい。
 既製品じゃ駄目なの?ラインナップは出揃っているし、オワコンの再発明(失敗作)を頑張る必要があるのかな。
 

7

ちなみに、Accessに格納するファイルというのは、仕様書、注文書、契約書等のExcelまたはPDFファイルになります。

6
あん 2023/07/03 (月) 15:51:34 927ea@53b5d

りんご様

Accessで構築している最中の業務システム内の「見積作成」で、「見積番号」フィールドで関連するファイル(Excel、PDF等)も一元管理しようと思い、AccessDBに収めようと思っています。

こういうケースでも、既製品ソフトで別途管理の方がよろしいのでしょうか?

5
りんご 2023/07/03 (月) 15:36:59 935bc@0e907 >> 4

 ファイル管理が目的ならばそれ用の既製品を使えば済みます。または、gitで管理。
 Excel連携するならば、fusion_placeみたいに、ちゃんと考えられているソフトがもうあたり前に登場している時代だと思います。

4
あん 2023/07/03 (月) 15:05:28 927ea@53b5d

りんご様、hatena様、hiroton様
ご回答ありがとうございます。

りんご様
>Excel連携するならば、Access以外の選択肢があるんじゃないでしょうか?
Excelで作成したファイルをデータベースに収めておきたいです。
Access以外とは、Access以外のデータベースソフトを使うということでしょうか?

hatena様、hiroton様
ご提示いただいたコードをやってみます。
ご指摘の通りに両方ともしっかりと動作検証を行いたいと思います。

結果をまたご連絡させていただきます。

3
hiroton 2023/07/03 (月) 09:17:25 修正 9d659@f966d

いろいろ弄ってたんですが連結オブジェクトフレームはなかなか不思議な動きをするんですねぇ
外部からのドラッグアンドドロップが問題になるなら使用可能プロパティを使うのも手だと思います

使用可能 |いいえ
編集ロック|いいえ

使用可能プロパティを「いいえ」にしてるので編集は適当にコマンドボタンを配置してVBAから操作します

Private Sub コマンド0_DblClick(Cancel As Integer)
    '//連結オブジェクトフレームはEnabled = Trueにしないと編集できない(っぽい)
    Me!xlsData.Enabled = True
    Me!xlsData.Action = acOLEActivate
End Sub

Private Sub xlsData_Updated(Code As Integer)
    '//編集の為Enabled = TrueにしたのをFalseに戻す
    '//ベストなイベント発生がないのでここで無理やり変更をかける
    On Error Resume Next
    Me!xlsData.Enabled = False
    On Error GoTo 0

    '//フォーカスを持っているフィールドなのになぜEnabled = Falseできるのか謎
    '//更新時イベント自体は複数回発生するが固定回数のようなのでカウントして対応したほうが丁寧だけど面倒なのでエラーは無視でいいんじゃないかな
End Sub

コマンドボタンの透明プロパティを「はい」にして、連結オブジェクトフレームにぴったり重ね合わせて前面に配置すればそれっぽくなると思います

なお、コードは「なぜか動く」系の怪しさ満点のコードなので十分に動作検証を行ってください


※プログラミング能力を疑うコードだったのでコメントを追加しました
より一層、公開したのを後悔するようなコードになった気がします

2

連結オブジェクトフレームでOLEオブジェクトを開いて編集したり閉じるときに更新時イベントが発生するようです。
閉じるときには、Code引数が2になるようです。
上記を利用して閉じたことを検知できそうです。

ただし、更新時イベントでは、更新中なので Locked = True にはできないので、タイマー時イベントで時間を遅らせてロックするようします。

簡単なサンプルの実験では下記のようなコードでうまくいっているようです。
連結オブジェクトフレームの名前は xlsData としています。

Private Sub Form_Timer()
    Me.TimerInterval = 0 'タイマー時イベント停止
    Me.Refresh           'レコード保存
    Me.xlsData.Locked = True
End Sub

Private Sub xlsData_Updated(Code As Integer)
    Select Case Code
    Case 0, 1
        Me.xlsData.Locked = False
    Case 2
        Me.TimerInterval = 10 '0.01秒後にタイマーイベント発動
    End Select
End Sub

連結オブジェクトフレームは普段使ったことがなく、今回、初めて簡単なサンプルで実験しただけなので、実際に使うときはしっかりと動作検証してから使ってください。

1
りんご 2023/07/01 (土) 15:41:25 935bc@0e907

 ロック解除と同時に何某かのプロパティを変更して、間接的に目的を達成できないかを検討するのはどうですか?保証はしませんが、オブジェクト非表示、マウス操作制御など。
 それはさておき、Excel連携するならば、Access以外の選択肢があるんじゃないでしょうか?
 

9
4年目 2023/06/30 (金) 17:37:43 8280a@2d6b0

ご返信いただきありがとうございます。
承知しました。
ご丁寧にご説明いただきありがとうございます。

8
りんご 2023/06/30 (金) 14:08:44 935bc@0e907 >> 7

ただテプラの書式に合わせて印刷したいのですが、やはりそれは難しいでしょうか?

 hirotonさんのリンク先に載っているようにするのが最善です。
 または、公式ソフトにあるような印刷レイアウトのオブジェクトを作って、試しに印刷して希望通りの出力になるまで、ひたすら微調整を繰り返してみる。きちんと定規で測ったのに、印刷するとズレるので、ひたすらチューニング、なんて事もあるかもしれませんね。

一応公式ソフトはあるのですが、二度手間になってしまうので、

 公式ソフトの機能があるのに、わざわざAccessのレポート機能で自作しようとするのが冗長です。

7
4年目 2023/06/30 (金) 12:05:54 2ce20@ab603

度々すみません。
印刷可能なプリンターの中に
KING JIM SR5900P-NWがあり印刷は可能でした。
ただテプラの書式に合わせて印刷したいのですが、やはりそれは難しいでしょうか?
一応公式ソフトはあるのですが、二度手間になってしまうので、何か良い方法はないかと思い、質問させていただきました。
お手数おかけしてますが、よろしくお願いします。