心当たりは全くありません。今年の3月に現役を引退し、日ごろ使うこともなっかので、今年の3月までは(?)使えてたと思います。
hirotonさん ありがとうございます。 データベースの最適化/修復では変化ありせんでした。その他の方法はこれから試して様子見たいと思ってます。 サブフォームだけ開いてみると[F振替入力Sub].Form!の借方科目、貸方科目のパラメータクエリの形になりグループ項目を入力すると絞り込みは出来てました(最初に要求される借方グループをNullで貸方グループだけ入力しても)。メインフォームで開くときだけ機能しない様です。 これはやはり謎のバグなのでしょうか?
手動でやってダメならVBA(コード)は関係ないですね 直接クエリを開いた場合は絞り込みされているということであれば、あとはもう「ACCESS謎のバグ」ですかね
・[データベースツール]→[データベースの最適化/修復]を試す ・新規にデータベースを作成し、[外部データ]→[ACCESSデータベースのインポート]から既存ファイルのオブジェクトを全てインポートする ・新規に0から作り直す
ご意見ありがとうございます。 F9押すと画面は一瞬ちらつきますが絞り込み機能しません(全表示になる)。Requeryコード行にブレークポイントを設定すると更新後VBA画面が表示され停止しています。
原因に心当たりは?
とりあえず確認手法として、コンボボックスにフォーカスを当て[F9]キーを押すと再計算されます(手動) これを使うと絞り込みはされますか?
また、コードの方で[F振替入力Sub].Form![貸方科目].Requeryの行にブレークポイントを設定するときちんとここで止まりますか?
[F振替入力Sub].Form![貸方科目].Requery
hirotonさん ご意見ありがとうございます。 コードはメインフォームに配置してます仕訳グループコンボの更新後に [F振替入力Sub].Form![貸方科目].Requery です。 サブフォームに対する借方項目はコード中央が[借方科目]としてましてそれで機能しています。 サブフォームの貸方項目コンボの値集合ソースにクエリとしており、それを実行では機能しているのに不思議なのです・・・ 何がいけないのかが分からなくて。コンパイルもしてみましたが引っかかりませんでした。
情報が不足しているので、下記のようだと仮定して、回答します。
テーブル名 あるテーブル フィールド名 AutoNo, F1, F2, F3, F4, F5
AutoNo以外のフィールドはテキスト型とします。 下記のような削除クエリを作成して実行すればいいでしょう。
DELETE * FROM あるテーブル WHERE AutoNo>DMin("AutoNo","あるテーブル","F1='" & [F1] & "' AND F2='" & [F2] & "' AND F3='" & [F3] & "' AND F4='" & [F4] & "' AND F5='" & [F5] & "'");
VBAならば、
Dim strSQL As String strSQL = "DELETE * FROM あるテーブル " & _ "WHERE AutoNo > DMin(""AutoNo"",""あるテーブル"",""F1='"" & [F1] & ""' AND F2='"" & [F2] & ""' AND F3='"" & [F3] & ""' AND F4='"" & [F4] & ""' AND F5='"" & [F5] & ""'"");" currentDb.execute strSQL, dbFailOnError
AutoNo以外の属性が完全に一致する重複レコードを1つ残して
要するに、AutoNo以外の属性の組み合わせの重複を認めない。AutoNo以外の属性を集めたテーブルを作って、全部に主キー制約をかけておく。あとは標題のレコードをループ処理で移行するような処理を考えれば?
帳票フォームで複数レコードを表示するには、連結フォームでないと無理ですが、 フォームはテーブルまたはクエリと連結していますか。 (レコードソースにテーブルまたはクエリが設定してありますか。)
もし、非連結フォームなら、1レコード分しか表示できません。 Do Loopでループさせても、おなじテキストボックスを上書きしているだけです。
F_伝票番号を作って帳票形式で保存しないの?わざわざコードに書き起こすのは、何か理由があるから?
新しいフォームを作った後、テキストボックスを全て選択して表形式に変更しましたか?
フォームを一つ用意してテキストボックスを配置し、テキストボックスの名前プロパティをNameとします
Name
テキストボックスのダブルクリック時にイベントプロシージャを設定して、テキストボックスの内容をいろいろ変えつつ
Private Sub Name_DblClick(Cancel As Integer) Debug.Print Me.name Debug.Print Me!name End Sub
を実行してみましょう
まぁ、日本語開発環境なら全部「.」を使ってしまってもまず問題が起きることもないんですけどね
.
ご回答ありがとうございました。できました。
理屈は難しくてわかりませんでしたが、対処は覚えておきます。
Controlsの前の!を.に変更してください。
Controls
!
Set mytxt = [Forms]![元フォーム名].Controls("txt" & Format(i, "00"))
メンバー アクセス演算子
上記の公式の説明はなんか難しくてよく分からないと思いますが、 Controlsのようなプロパティは.しか使えないと覚えておくとよいでしょう。 フォーム名とかコントロール名は!でも.でも使えます。
回答ありがとうございました。 頂いたコードを参考にして勉強します。
やり直す≒繰り返す動きをさせるのでループ処理を組みます
Dim 成功 As Boolean On Error Resume Next Do Until 成功 .activeworkbook.SaveAs strsavebookpath If Err <> 0 Then On Error GoTo -1 MsgBox "ファイルが保存できませんでした。現在使用中でないか確認してください" Else 成功 = ture End If Loop On Error GoTo 0
※これだけだと「保存できない」限り無限ループになることには注意が必要です
回答ありがとうございます。
On Error GoTo Err_Handler2 .activeworkbook.saveas strsavebookpath Err_Handler2: MsgBox "適当なメッセージ" xls.close SaveChanges:=False Resume Exit_Here
としてみたのですが、xls.closeが間違っているということで、うまくいきませんでした。 初歩的な質問で申し訳ございませんが、どうすればよかったのでしょう。
そのクエリでは貸方も絞り込み出来ているのにフォーム上では機能しないのです。グループのコンボボックス更新後のサブフォームの対象にはRequeryもしているのですが。
真っ先に疑うのはコードの記述ミスですね どのようなコードを記述してるんですか?
ついでに、コードエディタの方で「[デバッグ]→[(データベース名)のコンパイル]」でエラーが出てたりしませんか?
保存しようと思ってたもの破棄しちゃっていいんですか? https://www.google.com/search?q=VBA Excelを保存しないで終了する方法
名前変えるのがNGなら適当にメッセージボックスだして待機させた後保存処理やり直したらいいんじゃない?
当初、表示を分ける必要がなかったので整数部と小数部をまとめて処理するためにLeft,InStrの組み合わせにしたんですけど、最終的な目的から見ればすでにやってる方法で問題ないと思いますよ
Left
InStr
安っぽいやり方に思えて
ACCESSは実に安いソフトなので、安っぽい方法で目的が達成できたのなら喜びましょう
軽く触れましたが、文字(文字列)の表示は非常に高度な問題です。ACCESSはかなり苦手とする部類で、「レポートの表示だけでいい」のならある程度力業を組み合わせてしまったほうがすんなりいくものです
やっぱり計算式間違いやってるやーつ・・・
小数部表示:IIf([商品区分]="燃料油",Mid([丸めた数量]-Fix([丸めた数量])+0.001,2,3))&[単位]
誤 小数部表示:IIf([商品区分]="燃料油",Mid([丸めた数量]-Fix([丸めた数量]+0.001),2,3))&[単位] ↓ 正 小数部表示:IIf([商品区分]="燃料油",Mid([丸めた数量]-Fix([丸めた数量])+0.001,2,3))&[単位]
実際にACCESS触らず手打ちでやってるとイカンなやつでした
hirotonさん、貴重なお時間を使わせてしまって、本当にありがとうございました。 整数と小数を分けて取出して表示する方法は、下記の通り私も作っていたのですが、どうにも安っぽいやり方に思えて長年モヤモヤしていました。
整数部:fix([数量] 小数部:IIf([商品区分]="燃料油", Format([数量]-[整数部],"#.00"),""))
Left関数とinStr関数の組み合わせで表示できるとは、hirotonさんにあらためて感謝申し上げます。
さらに修正・・・
数量の表示: Left([丸めた数量]+0.001,InStr([丸めた数量] & ".",".")+IIf([商品区分]="燃料油",2,-1))
[丸めた数量]と[数量]は例えば[数量]が9.999のとき[丸めた数量]が10となって桁が変わる可能性があるので横着せず両方とも[丸めた数量]を使う必要がありました 意図せず記述してましたが、[丸めた数量]はやっぱり別フィールドにして計算させておいた方がよさそうですね
[丸めた数量]
[数量]
9.999
10
整数の位置に表示できないでしょうか?
単位をどう表示するかも悩ましいところですが、文字位置は使っているフォントで調整が必要になったりするのでとても難しいですね
整数表示(右詰め)、小数部表示(左詰め)とテキストボックスを2つ並べてしまうのが簡単だと思います
整数表示 :Fix([丸めた数量]) 小数部表示:IIf([商品区分]="燃料油",Mid([丸めた数量]-Fix([丸めた数量]+0.001),2,3))&[単位]
ACCESS標準の書式設定ではちょっと難しい案件なので文字として整形してしまいます
Left( [丸めた数量]+0.001 :0詰めをして小数点3桁にそろえた文字 ,InStr([丸めた数量] & ".",".") :小数点の位置 +IIf([商品区分]="燃料油",2,-1) :条件に合わせて+2(小数点以下2桁)/-1(整数) )
登録するデータはある程度入力ルールが決まっていると思いますが、単純に数値とするといろいろな入力が考えられます
ほしい結果は2パターンで Ⅰ:先頭から小数点の前の文字まで Ⅱ:先頭から小数点の2文字先まで
先頭から文字列を抜き出せばいいのでLeft関数を使ってそれぞれ
Ⅰ:Left( 基準の文字列, 先頭から小数点の2文字先まで) Ⅱ:Left( 基準の文字列, 先頭から小数点の前の文字まで)
を作ります
基準の文字列 文字列として処理するので丸め処理をした数値を基にします 注意が必要なのは、上記A、Cパターンで、小数点以下2桁までほしいのに文字列としては桁数が足りません。そこで、元の数値に影響なく、桁が足りないデータに対しては0で埋められるように[丸めた数量]+0.001と計算させています。丸め処理済みであれば数値のない小数点以下第3桁に1を加えても影響がでません 逆に丸め処理が済んでいない場合、例えばEパターンにこのような計算式を当ててしまうと基にすべき数値が変わってしまうので注意が必要です
[丸めた数量]+0.001
先頭から小数点 InStr関数で文字位置を調べればいいですね。ただし、整数のデータには小数点がないので、小数点があると仮定した位置を返すように、[丸めた数量] & "."を元のデータとして"."を探すようにします
[丸めた数量] & "."
"."
の2文字先まで/の前の文字まで 単純に+2/-1でいいので、これをIIf関数で条件を付けて切り替えます
+2/-1
IIf
hirotonさん、すばらしいです!希望通りの表示になりました。ありがとうございます。ただ私のレベルでは、この式を紐解くのは無理なようです。ぜひ詳細なご説明をお願いいたします。 欲を言いますと、整数が右詰になってしまい、燃料油の少数第二位の位置に表示されます。 レギュラー 23.56ℓ タイヤ 4本 ではなく レギュラー 23.56ℓ タイヤ 4 本 と整数の位置に表示できないでしょうか?
修正修正を重ねたらやっぱり間違ってるし
数量の表示: Left([丸めた数量]+0.001,InStr([数量] & ".",".")+IIf([商品区分]="燃料油",2,-1))
※不要な「)」が残ってました 数量の表示: Left([丸めた数量])+0.001,InStr([数量] & ".",".")+IIf([商品区分]="燃料油",2,-1))
表示用にテキストでデータを作る。かな
数量の表示: Left([丸めた数量])+0.001,InStr([数量] & ".",".")+IIf([商品区分]="燃料油",2,-1))
hatena様ありがとうございます。複数ユーザーで使用することはありません。現状は中途半端な知識なので非連結フォームはやめておいた方がいいですね。大変参考になりました。ありがとうございました。
あとご意見お聞きしたいのですがファームで入力の際、テーブル等を基にして直接する方法と非連結フォームを使い追加クエリーで登録する方法ありますが一般的にどうしているのしょうか? メリット・デメリットがあるのでしょうか?
非連結フォームは帳票表示できないので、基本1レコード毎での入力になります。 帳票表示で入力したい場合は、一時テーブルに転記してそれを更新する、更新後、クエリかVBAで元テーブルに反映させるという設計になります。
メリット 自由度が高い 複数ユーザーで共有する場合、データベース破損の危険性が低減する
デメリット コード量が多くなる Accessが自動でやってくれることをすべて自前でやる必要があるので、高いスキルが必要。 特に複数ユーザーで共有する場合、排他制御などかなり高度なスキルが必要です。 中途半端なスキルだとかえってデータ破損、整合性不可の危険性が高いです
連結フォームはメリットデメリット上記の逆になります。 データベース破損の危険性はユーザー数か一桁なら、めったに壊れません。 2桁以上のユーザーが同時更新するなら、危険性は高くなりますが、そうなると、SQLサーバーなどのRDBMSを検討した方がいいという話になります。
すみません、この件は解決できました。仕訳時の貸方金額-借方金額が0より大きい場合のIIfでいけました。 色々とありがとうございました。もう少し経理の知識身につけてACCESSに展開したいと思います。
hiroton様ありがとうございます。確かにそうですね、その点は考えてみます。別の関連書類でどうしたら出来るのかなという事がでてきました。例えば日々の仕訳で下記の場合 仕訳ID 日付 借方科目 借方金額 貸方科目 貸方金額 1 6/1 普通預金 9,500 売掛金 10,000 2 支払い手数料 500
総勘定元帳(科目毎の履歴)には2つ以上の仕訳の場合”諸口”という表現での転記が必要で、売掛金用の台帳は 日付 相手方勘定科目(売掛金に対して) 借方金額 貸方金額 残高 6/1 諸口 ← 10,000 10,000 となるのです。この形にデータの加工はIIfか何かで可能でしょうか? いいアイデアありますでしょうか?
借方or貸方のどちらかがNULLになることもあります。
とのことなので
このようなデータに対して問題のレポートで「行をずらす」をした場合、1レコードに左右両方のデータを保存してしまうと
のようになってしまいます。(行内で段を作って疑似的に行分けをしているだけでそれぞれの行が変わるわけではないため)
それと、1つの仕訳に関するデータが複数レコードになる場合があるので、どのデータがグループになっているのかという情報が必要になります。仕訳IDの設定とそれに付随して、仕訳メインテーブルの作成、日付は仕訳メインで登録というのはあってもいいと思います
というわけで、
項目
仕訳サブ
こんな感じでやるかなぁというのがhirotonの感想です
多対多のデータになるようなので結構大変な案件なんじゃないですかね
hatena様、hiroton様 ご提案のコードでプログラム作成させていただきました。
動作検証も行いましたが、特に問題なさそうです。 どちらかを使わせていただきたいと思います。 また、コードのお勉強もさせていただました。 毎度、ありがとうございます。
hiroton様 バック(テーブル)がSQL Serverを用いておりますので、ファイル容量には問題ありません。 ご心配ありがとうございます。
りんご様 既製品の導入に関してですが、 Accessでファイル管理していくことに問題や不便があれば、検討しますが、何もないので導入はしません。 特に有料であればなおさらです。 無料の場合でも、Accessでの入力とは別途に、ユーザーが既製品ソフトを起動して、ファイルを保存したり、該当ファイルを出力したりの操作をするのは余計な手間になりますし、間違いも起こりえるでしょう。 ただし、Accessから自動的に既製品ソフトを開いてファイルを保存したり、該当ファイルを出力したりするプログラムが出来れば別ですが。
昭和でも、黒歴史でも、目的が達成できればいいです。 ユーザー本位のプログラムができれば。それができなければ、失敗作なのでしょう。
それでは、この度もありがとうございました。
hatena様ご意見ありがとうございます。親子フォームにしたいのでテーブルを1対多のリレーションの固定観念がありました。確かにメインが日付位であれば1レコードでいけますね。まだまだ試しの段階ですので日々の仕訳データを基に加工して色々な書類(最終的に決算書) の作成となります。経理の知識も平行して進めたいと思います。その際色々なコードが必要となりますのでまた質問させて頂きますね。あとご意見お聞きしたいのですがファームで入力の際、テーブル等を基にして直接する方法と非連結フォームを使い追加クエリーで登録する方法ありますが一般的にどうしているのしょうか? メリット・デメリットがあるのでしょうか?
仕訳サブ のデータ例ですね。 これと 仕訳メイン の関係はどのようなものですか。 仕訳メインが 処理ID 日付 の2フィールドだけなら、メインとサブに分ける必要もないと思います。 仕訳サブ の方に 日付 フィールドを追加すればすみますので。
メインサブフォーム形式にしたいのなら、メインフォームは非連結で、非連結の日付テキストボックスを配置すればすみます。
上記の点は除外して、現状のテーブル設計で特に問題はないと思いますが、どの辺に不満点がありますか。
りんごさん提案の設計法もあると思いますが、最初の質問のような出力をレポートでするなら現状の方が扱いやすいように思います。
色々コメントありがとうございました。私自身経理担当ではなく詳しくはないのですが、日々の様々な取引が仕訳処理され、借方と貸方の合計金額は必ず合致します。項目は多数あります。売上高、売掛金、仕入れ高、買掛金 等。それらは借方、貸方のどちも使う項目となります。例えば1つの取引の仕訳で 仕訳明細ID 借方科目 借方金額 適用 貸方科目 貸方金額 1 売掛金 11,000 A社へ 売上高 10,000 2 消費税 1,000
こんな感じで借方or貸方のどちらかがNULLになることもあります。 例えば売上高に対しては売掛金、手形、現金等と選択肢は決まってきます。 経理担当がエクセルで処理しておりそこからデータ拾って色々な台帳作成しているのですが同じ事を何度も転記は手間でACCESSならこの仕訳入力だけでいけると思い。提案しているところなのです。経理ソフトもあるのですが自作の方がカスタマイズが自由にできていいなと思った次第です。(私自身別業務で少しだけACCESS使った経験があり、なんて便利なんだろうと感じたので)
hatena様 借方、貸方データはテーブルを分けておいた方が融通が効きますでしょうか?
経理には詳しくないのですが、分ける必要性はないように思います。
・テーブル/仕訳メイン⇒①処理ID ②日付 ・テーブル/仕訳サブ⇒①明細ID ②処理ID ③借方項目 ④借方金額 ⑤貸方項目 ⑥貸方金額
仕訳メイン と 仕訳サブ の関係性がよくわかりませんが、どのようなデータが格納されているのか、 データ例を提示してもらえませんか。
何かいいアイデアがあればお願いします。 借方項目、貸方項目は、1つのフィールドにまとめて、勘定科目。借方金額、貸方金額は、1つのフィールドにまとめて、仕訳金額。そして、貸借区分フィールドを追加。
Accessのテーブルやクエリのデータを貼り付ける場合は下記で、Markdown書式のテーブルに変換して貼り付けてください。
Markdown Tables generator
心当たりは全くありません。今年の3月に現役を引退し、日ごろ使うこともなっかので、今年の3月までは(?)使えてたと思います。
hirotonさん ありがとうございます。
データベースの最適化/修復では変化ありせんでした。その他の方法はこれから試して様子見たいと思ってます。
サブフォームだけ開いてみると[F振替入力Sub].Form!の借方科目、貸方科目のパラメータクエリの形になりグループ項目を入力すると絞り込みは出来てました(最初に要求される借方グループをNullで貸方グループだけ入力しても)。メインフォームで開くときだけ機能しない様です。
これはやはり謎のバグなのでしょうか?
手動でやってダメならVBA(コード)は関係ないですね
直接クエリを開いた場合は絞り込みされているということであれば、あとはもう「ACCESS謎のバグ」ですかね
・[データベースツール]→[データベースの最適化/修復]を試す
・新規にデータベースを作成し、[外部データ]→[ACCESSデータベースのインポート]から既存ファイルのオブジェクトを全てインポートする
・新規に0から作り直す
ご意見ありがとうございます。
F9押すと画面は一瞬ちらつきますが絞り込み機能しません(全表示になる)。Requeryコード行にブレークポイントを設定すると更新後VBA画面が表示され停止しています。
原因に心当たりは?
とりあえず確認手法として、コンボボックスにフォーカスを当て[F9]キーを押すと再計算されます(手動)
これを使うと絞り込みはされますか?
また、コードの方で
[F振替入力Sub].Form![貸方科目].Requery
の行にブレークポイントを設定するときちんとここで止まりますか?hirotonさん ご意見ありがとうございます。
コードはメインフォームに配置してます仕訳グループコンボの更新後に [F振替入力Sub].Form![貸方科目].Requery です。
サブフォームに対する借方項目はコード中央が[借方科目]としてましてそれで機能しています。
サブフォームの貸方項目コンボの値集合ソースにクエリとしており、それを実行では機能しているのに不思議なのです・・・
何がいけないのかが分からなくて。コンパイルもしてみましたが引っかかりませんでした。
情報が不足しているので、下記のようだと仮定して、回答します。
テーブル名 あるテーブル
フィールド名 AutoNo, F1, F2, F3, F4, F5
AutoNo以外のフィールドはテキスト型とします。
下記のような削除クエリを作成して実行すればいいでしょう。
VBAならば、
要するに、AutoNo以外の属性の組み合わせの重複を認めない。AutoNo以外の属性を集めたテーブルを作って、全部に主キー制約をかけておく。あとは標題のレコードをループ処理で移行するような処理を考えれば?
帳票フォームで複数レコードを表示するには、連結フォームでないと無理ですが、
フォームはテーブルまたはクエリと連結していますか。
(レコードソースにテーブルまたはクエリが設定してありますか。)
もし、非連結フォームなら、1レコード分しか表示できません。
Do Loopでループさせても、おなじテキストボックスを上書きしているだけです。
F_伝票番号を作って帳票形式で保存しないの?わざわざコードに書き起こすのは、何か理由があるから?
新しいフォームを作った後、テキストボックスを全て選択して表形式に変更しましたか?
フォームを一つ用意してテキストボックスを配置し、テキストボックスの名前プロパティを
Name
としますテキストボックスのダブルクリック時にイベントプロシージャを設定して、テキストボックスの内容をいろいろ変えつつ
を実行してみましょう
まぁ、日本語開発環境なら全部「
.
」を使ってしまってもまず問題が起きることもないんですけどねご回答ありがとうございました。できました。
理屈は難しくてわかりませんでしたが、対処は覚えておきます。
Controls
の前の!
を.
に変更してください。メンバー アクセス演算子
上記の公式の説明はなんか難しくてよく分からないと思いますが、
Controlsのようなプロパティは.しか使えないと覚えておくとよいでしょう。
フォーム名とかコントロール名は!でも.でも使えます。
回答ありがとうございました。
頂いたコードを参考にして勉強します。
やり直す≒繰り返す動きをさせるのでループ処理を組みます
※これだけだと「保存できない」限り無限ループになることには注意が必要です
回答ありがとうございます。
としてみたのですが、xls.closeが間違っているということで、うまくいきませんでした。
初歩的な質問で申し訳ございませんが、どうすればよかったのでしょう。
真っ先に疑うのはコードの記述ミスですね
どのようなコードを記述してるんですか?
ついでに、コードエディタの方で「[デバッグ]→[(データベース名)のコンパイル]」でエラーが出てたりしませんか?
保存しようと思ってたもの破棄しちゃっていいんですか?
https://www.google.com/search?q=VBA Excelを保存しないで終了する方法
名前変えるのがNGなら適当にメッセージボックスだして待機させた後保存処理やり直したらいいんじゃない?
当初、表示を分ける必要がなかったので整数部と小数部をまとめて処理するために
Left
,InStr
の組み合わせにしたんですけど、最終的な目的から見ればすでにやってる方法で問題ないと思いますよACCESSは実に安いソフトなので、安っぽい方法で目的が達成できたのなら喜びましょう
軽く触れましたが、文字(文字列)の表示は非常に高度な問題です。ACCESSはかなり苦手とする部類で、「レポートの表示だけでいい」のならある程度力業を組み合わせてしまったほうがすんなりいくものです
やっぱり計算式間違いやってるやーつ・・・
誤
小数部表示:IIf([商品区分]="燃料油",Mid([丸めた数量]-Fix([丸めた数量]+0.001),2,3))&[単位]
↓
正
小数部表示:IIf([商品区分]="燃料油",Mid([丸めた数量]-Fix([丸めた数量])+0.001,2,3))&[単位]
実際にACCESS触らず手打ちでやってるとイカンなやつでした
hirotonさん、貴重なお時間を使わせてしまって、本当にありがとうございました。
整数と小数を分けて取出して表示する方法は、下記の通り私も作っていたのですが、どうにも安っぽいやり方に思えて長年モヤモヤしていました。
整数部:fix([数量]
小数部:IIf([商品区分]="燃料油", Format([数量]-[整数部],"#.00"),""))
Left関数とinStr関数の組み合わせで表示できるとは、hirotonさんにあらためて感謝申し上げます。
さらに修正・・・
[丸めた数量]
と[数量]
は例えば[数量]
が9.999
のとき[丸めた数量]
が10
となって桁が変わる可能性があるので横着せず両方とも[丸めた数量]
を使う必要がありました意図せず記述してましたが、
[丸めた数量]
はやっぱり別フィールドにして計算させておいた方がよさそうですね単位をどう表示するかも悩ましいところですが、文字位置は使っているフォントで調整が必要になったりするのでとても難しいですね
整数表示(右詰め)、小数部表示(左詰め)とテキストボックスを2つ並べてしまうのが簡単だと思います
ACCESS標準の書式設定ではちょっと難しい案件なので文字として整形してしまいます
登録するデータはある程度入力ルールが決まっていると思いますが、単純に数値とするといろいろな入力が考えられます
ほしい結果は2パターンで
Ⅰ:先頭から小数点の前の文字まで
Ⅱ:先頭から小数点の2文字先まで
先頭から文字列を抜き出せばいいので
Left
関数を使ってそれぞれを作ります
基準の文字列
文字列として処理するので丸め処理をした数値を基にします
注意が必要なのは、上記A、Cパターンで、小数点以下2桁までほしいのに文字列としては桁数が足りません。そこで、元の数値に影響なく、桁が足りないデータに対しては0で埋められるように
[丸めた数量]+0.001
と計算させています。丸め処理済みであれば数値のない小数点以下第3桁に1を加えても影響がでません逆に丸め処理が済んでいない場合、例えばEパターンにこのような計算式を当ててしまうと基にすべき数値が変わってしまうので注意が必要です
先頭から小数点
InStr
関数で文字位置を調べればいいですね。ただし、整数のデータには小数点がないので、小数点があると仮定した位置を返すように、[丸めた数量] & "."
を元のデータとして"."
を探すようにしますの2文字先まで/の前の文字まで
単純に
+2/-1
でいいので、これをIIf
関数で条件を付けて切り替えますhirotonさん、すばらしいです!希望通りの表示になりました。ありがとうございます。ただ私のレベルでは、この式を紐解くのは無理なようです。ぜひ詳細なご説明をお願いいたします。
欲を言いますと、整数が右詰になってしまい、燃料油の少数第二位の位置に表示されます。
レギュラー 23.56ℓ
タイヤ 4本
ではなく
レギュラー 23.56ℓ
タイヤ 4 本
と整数の位置に表示できないでしょうか?
修正修正を重ねたらやっぱり間違ってるし
※不要な「)」が残ってました
数量の表示: Left([丸めた数量])+0.001,InStr([数量] & ".",".")+IIf([商品区分]="燃料油",2,-1))
表示用にテキストでデータを作る。かな
hatena様ありがとうございます。複数ユーザーで使用することはありません。現状は中途半端な知識なので非連結フォームはやめておいた方がいいですね。大変参考になりました。ありがとうございました。
非連結フォームは帳票表示できないので、基本1レコード毎での入力になります。
帳票表示で入力したい場合は、一時テーブルに転記してそれを更新する、更新後、クエリかVBAで元テーブルに反映させるという設計になります。
メリット
自由度が高い
複数ユーザーで共有する場合、データベース破損の危険性が低減する
デメリット
コード量が多くなる
Accessが自動でやってくれることをすべて自前でやる必要があるので、高いスキルが必要。
特に複数ユーザーで共有する場合、排他制御などかなり高度なスキルが必要です。
中途半端なスキルだとかえってデータ破損、整合性不可の危険性が高いです
連結フォームはメリットデメリット上記の逆になります。
データベース破損の危険性はユーザー数か一桁なら、めったに壊れません。
2桁以上のユーザーが同時更新するなら、危険性は高くなりますが、そうなると、SQLサーバーなどのRDBMSを検討した方がいいという話になります。
すみません、この件は解決できました。仕訳時の貸方金額-借方金額が0より大きい場合のIIfでいけました。
色々とありがとうございました。もう少し経理の知識身につけてACCESSに展開したいと思います。
hiroton様ありがとうございます。確かにそうですね、その点は考えてみます。別の関連書類でどうしたら出来るのかなという事がでてきました。例えば日々の仕訳で下記の場合
仕訳ID 日付 借方科目 借方金額 貸方科目 貸方金額
1 6/1 普通預金 9,500 売掛金 10,000
2 支払い手数料 500
総勘定元帳(科目毎の履歴)には2つ以上の仕訳の場合”諸口”という表現での転記が必要で、売掛金用の台帳は
日付 相手方勘定科目(売掛金に対して) 借方金額 貸方金額 残高
6/1 諸口 ← 10,000 10,000
となるのです。この形にデータの加工はIIfか何かで可能でしょうか? いいアイデアありますでしょうか?
とのことなので
き
う
このようなデータに対して問題のレポートで「行をずらす」をした場合、1レコードに左右両方のデータを保存してしまうと
のようになってしまいます。(行内で段を作って疑似的に行分けをしているだけでそれぞれの行が変わるわけではないため)
それと、1つの仕訳に関するデータが複数レコードになる場合があるので、どのデータがグループになっているのかという情報が必要になります。仕訳IDの設定とそれに付随して、仕訳メインテーブルの作成、日付は仕訳メインで登録というのはあってもいいと思います
というわけで、
項目
仕訳サブ
こんな感じでやるかなぁというのがhirotonの感想です
多対多のデータになるようなので結構大変な案件なんじゃないですかね
hatena様、hiroton様
ご提案のコードでプログラム作成させていただきました。
動作検証も行いましたが、特に問題なさそうです。
どちらかを使わせていただきたいと思います。
また、コードのお勉強もさせていただました。
毎度、ありがとうございます。
hiroton様
バック(テーブル)がSQL Serverを用いておりますので、ファイル容量には問題ありません。
ご心配ありがとうございます。
りんご様
既製品の導入に関してですが、
Accessでファイル管理していくことに問題や不便があれば、検討しますが、何もないので導入はしません。
特に有料であればなおさらです。
無料の場合でも、Accessでの入力とは別途に、ユーザーが既製品ソフトを起動して、ファイルを保存したり、該当ファイルを出力したりの操作をするのは余計な手間になりますし、間違いも起こりえるでしょう。
ただし、Accessから自動的に既製品ソフトを開いてファイルを保存したり、該当ファイルを出力したりするプログラムが出来れば別ですが。
昭和でも、黒歴史でも、目的が達成できればいいです。
ユーザー本位のプログラムができれば。それができなければ、失敗作なのでしょう。
それでは、この度もありがとうございました。
hatena様ご意見ありがとうございます。親子フォームにしたいのでテーブルを1対多のリレーションの固定観念がありました。確かにメインが日付位であれば1レコードでいけますね。まだまだ試しの段階ですので日々の仕訳データを基に加工して色々な書類(最終的に決算書) の作成となります。経理の知識も平行して進めたいと思います。その際色々なコードが必要となりますのでまた質問させて頂きますね。あとご意見お聞きしたいのですがファームで入力の際、テーブル等を基にして直接する方法と非連結フォームを使い追加クエリーで登録する方法ありますが一般的にどうしているのしょうか? メリット・デメリットがあるのでしょうか?
仕訳サブ のデータ例ですね。
これと 仕訳メイン の関係はどのようなものですか。
仕訳メインが 処理ID 日付 の2フィールドだけなら、メインとサブに分ける必要もないと思います。
仕訳サブ の方に 日付 フィールドを追加すればすみますので。
メインサブフォーム形式にしたいのなら、メインフォームは非連結で、非連結の日付テキストボックスを配置すればすみます。
上記の点は除外して、現状のテーブル設計で特に問題はないと思いますが、どの辺に不満点がありますか。
りんごさん提案の設計法もあると思いますが、最初の質問のような出力をレポートでするなら現状の方が扱いやすいように思います。
色々コメントありがとうございました。私自身経理担当ではなく詳しくはないのですが、日々の様々な取引が仕訳処理され、借方と貸方の合計金額は必ず合致します。項目は多数あります。売上高、売掛金、仕入れ高、買掛金 等。それらは借方、貸方のどちも使う項目となります。例えば1つの取引の仕訳で
仕訳明細ID 借方科目 借方金額 適用 貸方科目 貸方金額
1 売掛金 11,000 A社へ 売上高 10,000
2 消費税 1,000
こんな感じで借方or貸方のどちらかがNULLになることもあります。
例えば売上高に対しては売掛金、手形、現金等と選択肢は決まってきます。
経理担当がエクセルで処理しておりそこからデータ拾って色々な台帳作成しているのですが同じ事を何度も転記は手間でACCESSならこの仕訳入力だけでいけると思い。提案しているところなのです。経理ソフトもあるのですが自作の方がカスタマイズが自由にできていいなと思った次第です。(私自身別業務で少しだけACCESS使った経験があり、なんて便利なんだろうと感じたので)
経理には詳しくないのですが、分ける必要性はないように思います。
仕訳メイン と 仕訳サブ の関係性がよくわかりませんが、どのようなデータが格納されているのか、
データ例を提示してもらえませんか。