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
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
度々すみません。
印刷可能なプリンターの中に
KING JIM SR5900P-NWがあり印刷は可能でした。
ただテプラの書式に合わせて印刷したいのですが、やはりそれは難しいでしょうか?
一応公式ソフトはあるのですが、二度手間になってしまうので、何か良い方法はないかと思い、質問させていただきました。
お手数おかけしてますが、よろしくお願いします。
回答ありがとうございます。
としてみたのですが、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使った経験があり、なんて便利なんだろうと感じたので)
経理には詳しくないのですが、分ける必要性はないように思います。
仕訳メイン と 仕訳サブ の関係性がよくわかりませんが、どのようなデータが格納されているのか、
データ例を提示してもらえませんか。
hatena様 借方、貸方データはテーブルを分けておいた方が融通が効きますでしょうか?
各Subテーブルに処理IDをつけてMainテーブルにリレーションで(親フォームに子フォーム2つ配置する形)
フォーム入力時に(同じ取引上)借方で選んだ項目は貸方では選択できない、どちらかで選んだ項目に関連する項目だけが選択肢になる様な事もしたいと思ってます(まだそこまでは全然出来ていませんが)
とのことから、元は複数レコードになっていると解釈したのですが、
T仕訳処理Sub のデータ自体が 借方、貸方のデータが1レコードに格納されているということでしょうか。
なら、レポート上で2行に配置ですね。
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;
出力としては画像のイメージです(これはネットからの引用ですが)
上記の疑問点はとりあえず置いておいて、
1レコードのデータを2行にするなら、詳細セクションで、テキストボックスを2行になるように配置するだけのことだと思いますが。
1レコードにするからでは。
1レコードにする必要性がないように思いますが。
とりあえず現状の仕訳メインと仕訳サブのデータ例と、希望の結果出力例を提示してもらえますか。
OLEオブジェクトの利点はプレビュー表示ができることです。プレビュー表示の必要なく、関連ファイルの管理をしたいだけならば添付ファイル型を使用したほうがいいと思います
データベースのレコードにファイルやグラフィックスを添付する
プレビューに関しても、対象が単票フォームであれば非連結オブジェクトフレームで対応するという方法がとれるかもしれません
それはそれとして、データベースに埋め込まないでACCESSでファイル管理機能を組む、というのもありだと思います。OLEオブジェクトにしろ添付ファイル型にしろ何かと制限はあるし、このご時世2GBまでというACCESSの制限はちょっと怖いです
ただし、ファイル操作に関して自前でVBAを駆使することになるのでそれなりに難易度は上がります
やろうとしている事は昭和のあるあるですね。それをデータベースと呼ぶ時代も、もしかしたらあったのかもしれませんが、黒歴史です。
データの一元管理がやりたいのであれば、Excelやpdfの中身を分解して、正規化済みのデータベースソフトに取り込んで下さい。
既製品じゃ駄目なの?ラインナップは出揃っているし、オワコンの再発明(失敗作)を頑張る必要があるのかな。
ちなみに、Accessに格納するファイルというのは、仕様書、注文書、契約書等のExcelまたはPDFファイルになります。
りんご様
Accessで構築している最中の業務システム内の「見積作成」で、「見積番号」フィールドで関連するファイル(Excel、PDF等)も一元管理しようと思い、AccessDBに収めようと思っています。
こういうケースでも、既製品ソフトで別途管理の方がよろしいのでしょうか?
ファイル管理が目的ならばそれ用の既製品を使えば済みます。または、gitで管理。
Excel連携するならば、fusion_placeみたいに、ちゃんと考えられているソフトがもうあたり前に登場している時代だと思います。
りんご様、hatena様、hiroton様
ご回答ありがとうございます。
りんご様
>Excel連携するならば、Access以外の選択肢があるんじゃないでしょうか?
Excelで作成したファイルをデータベースに収めておきたいです。
Access以外とは、Access以外のデータベースソフトを使うということでしょうか?
hatena様、hiroton様
ご提示いただいたコードをやってみます。
ご指摘の通りに両方ともしっかりと動作検証を行いたいと思います。
結果をまたご連絡させていただきます。
いろいろ弄ってたんですが連結オブジェクトフレームはなかなか不思議な動きをするんですねぇ
外部からのドラッグアンドドロップが問題になるなら使用可能プロパティを使うのも手だと思います
使用可能プロパティを「いいえ」にしてるので編集は適当にコマンドボタンを配置してVBAから操作します
コマンドボタンの透明プロパティを「はい」にして、連結オブジェクトフレームにぴったり重ね合わせて前面に配置すればそれっぽくなると思います
なお、コードは「なぜか動く」系の怪しさ満点のコードなので十分に動作検証を行ってください
※プログラミング能力を疑うコードだったのでコメントを追加しました
より一層、公開したのを後悔するようなコードになった気がします
連結オブジェクトフレームでOLEオブジェクトを開いて編集したり閉じるときに更新時イベントが発生するようです。
閉じるときには、Code引数が2になるようです。
上記を利用して閉じたことを検知できそうです。
ただし、更新時イベントでは、更新中なので Locked = True にはできないので、タイマー時イベントで時間を遅らせてロックするようします。
簡単なサンプルの実験では下記のようなコードでうまくいっているようです。
連結オブジェクトフレームの名前は xlsData としています。
連結オブジェクトフレームは普段使ったことがなく、今回、初めて簡単なサンプルで実験しただけなので、実際に使うときはしっかりと動作検証してから使ってください。
ロック解除と同時に何某かのプロパティを変更して、間接的に目的を達成できないかを検討するのはどうですか?保証はしませんが、オブジェクト非表示、マウス操作制御など。
それはさておき、Excel連携するならば、Access以外の選択肢があるんじゃないでしょうか?
ご返信いただきありがとうございます。
承知しました。
ご丁寧にご説明いただきありがとうございます。
hirotonさんのリンク先に載っているようにするのが最善です。
または、公式ソフトにあるような印刷レイアウトのオブジェクトを作って、試しに印刷して希望通りの出力になるまで、ひたすら微調整を繰り返してみる。きちんと定規で測ったのに、印刷するとズレるので、ひたすらチューニング、なんて事もあるかもしれませんね。
公式ソフトの機能があるのに、わざわざAccessのレポート機能で自作しようとするのが冗長です。
度々すみません。
印刷可能なプリンターの中に
KING JIM SR5900P-NWがあり印刷は可能でした。
ただテプラの書式に合わせて印刷したいのですが、やはりそれは難しいでしょうか?
一応公式ソフトはあるのですが、二度手間になってしまうので、何か良い方法はないかと思い、質問させていただきました。
お手数おかけしてますが、よろしくお願いします。