Private Sub 日付_Enter()
Me!日付カレンダー.SetFocus
End Sub
Private Sub 日付カレンダー_AfterUpdate()
Me!日付 = Me!日付カレンダー
End Sub
Private Sub 日付カレンダー_Change()
'//カレンダーの日付をクリックしたときに発生するイベント
'//ここで、別なコントロールに移動してAfterUpdateを発生させる
Me!次のコントロール.SetFocus
End Sub
Private Sub 日付カレンダー_Enter()
Me!日付.TabStop = False
If IsDate(Me!日付) Then
Me!日付カレンダー = Me!日付
Else
If IsDate(Me!対象年 & "/" & Me!対象月 & "/1") Then
Me!日付カレンダー = Me!対象年 & "/" & Me!対象月 & "/1"
Else
Me!日付カレンダー = Null
End If
End If
DoCmd.RunCommand acCmdShowDatePicker
End Sub
Private Sub 日付カレンダー_LostFocus()
Me!日付.TabStop = True
End Sub
Private Sub Form_Load()
Me!営業日数 = 営業日数取得
End Sub
Function 営業日数取得()
営業日数取得 = Day(Date) - DateDiff("ww", Date - Day(Date), Date, vbMonday) - DCount("*", "T_臨時休業日", "日付 Between #" & Date - Day(Date) + 1 & "# And #" & Date & "#")
End Function
SELECT Sum(IIf([損益分類ID]=4,[損益分類合計],0)) AS 期首在庫, Sum(IIf([損益分類ID]=3,[損益分類合計],0)) AS 仕入高, [期首在庫]+[仕入高] AS 当期仕入, Sum(IIf([損益分類ID]=5,[損益分類合計],0)) AS 期末在庫, [当期仕入]-[期末在庫] AS 売上原価, Sum(IIf([損益分類ID]=1,[損益分類合計],0)) AS 製品売上高, Sum(IIf([損益分類ID]=2,[損益分類合計],0)) AS 家賃収入, [製品売上高]+[家賃収入] AS 収入計, [収入計]-[売上原価] AS 売上総利益, Sum(IIf([損益分類ID]=6,[損益分類合計],0)) AS 販管費, [売上総利益]-[販管費] AS 営業利益, Sum(IIf([損益分類ID] In (7,8,9),[損益分類合計],0)) AS 営業外収益, Sum(IIf([損益分類ID] In (10,11,12,13,14,15),[損益分類合計],0)) AS 営業外費用, [営業利益]+[営業外収益]-[営業外費用] AS 経常利益, Sum(IIf([損益分類ID]=16,[損益分類合計],0)) AS 特別損失, [経常利益]-[特別損失] AS 税引前当期純利益, Sum(IIf([損益分類ID]=12,[損益分類合計],0)) AS 法人税等, [税引前当期純利益]-[法人税等] AS 当期純利益
FROM Q試算表用Base09_損益分類Gr集計;
SELECT ChrW( 64 + x.num ) As 項目
, Choose(
x.num
, y.項目A金額
, y.項目B金額
, y.項目C金額
, y.項目D金額
, y.項目E金額
, y.項目F金額
, y.項目G金額
, y.項目H金額
, y.項目I金額
, y.項目J金額
, y.項目K金額
, y.項目L金額
, y.項目M金額
, y.項目N金額
, y.項目O金額
, y.項目P金額
) As 金額
, x.num As 順番
FROM t_num x
, クエリ名 y
ORDER BY 3
;
■ ユニオンクエリを使う方法
SELECT 'A' As 項目, 項目A金額 As 金額, 1 As 順番 FROM クエリ名
UNION ALL
SELECT 'B', 項目B金額, 2 FROM クエリ名
UNION ALL
SELECT 'C', 項目C金額, 3 FROM クエリ名
UNION ALL
SELECT 'D', 項目D金額, 4 FROM クエリ名
UNION ALL
SELECT 'E', 項目E金額, 5 FROM クエリ名
UNION ALL
SELECT 'F', 項目F金額, 6 FROM クエリ名
UNION ALL
SELECT 'G', 項目G金額, 7 FROM クエリ名
UNION ALL
SELECT 'H', 項目H金額, 8 FROM クエリ名
UNION ALL
SELECT 'I', 項目I金額, 9 FROM クエリ名
UNION ALL
SELECT 'J', 項目J金額, 10 FROM クエリ名
UNION ALL
SELECT 'K', 項目K金額, 11 FROM クエリ名
UNION ALL
SELECT 'L', 項目L金額, 12 FROM クエリ名
UNION ALL
SELECT 'M', 項目M金額, 13 FROM クエリ名
UNION ALL
SELECT 'N', 項目N金額, 14 FROM クエリ名
UNION ALL
SELECT 'O', 項目O金額, 15 FROM クエリ名
UNION ALL
SELECT 'P', 項目P金額, 16 FROM クエリ名
ORDER BY 3
;
Public Function minifizeTags(s As Variant) As Variant
minifizeTags = s
If Nz(s) = "" Then Exit Function
Dim ary As Variant
ary = Split(s, "<")
Dim i As Long, buf As String, p1 As Long, p2 As Long
For i = 1 To UBound(ary)
buf = ary(i)
p1 = InStr(buf, " ")
p2 = InStr(buf, ">")
If p1 > 0 And p2 > 0 And p1 < p2 Then
ary(i) = Left(buf, p1 - 1) & Mid(buf, p2)
End If
Next
minifizeTags = Join(ary, "<")
End Function
Public Function LAA_Replace(ByVal html As Variant _
, ByVal reg_pattern As String _
, ByVal reg_replace As String) As Variant
LAA_Replace = html
If (LenB(Nz(html)) = 0) Then Exit Function
With CreateObject("VBScript.RegExp")
.Global = True
.IgnoreCase = True
.Pattern = reg_pattern
If (.Test(html)) Then
LAA_Replace = .Replace(html, reg_replace)
End If
End With
End Function
■SQL ( 文中のテーブル名は実際の名前に置き換えて下さい )
SELECT ID
, 品番
, 説明文
, LAA_Replace( 説明文, "(<(?:table|t[hd]|span))\s[^>]*(>)", "$1$2" ) as タグ指定置換
, LAA_Replace( 説明文, "(<\w+?)\s[^>]*(>)", "$1$2" ) As タグ無差別置換
FROM テーブル名
ORDER BY 1
;
ACCESSの仕様的に「日付」テキストボックスだけではどうしようもないかなーと思ってます
直接入力を禁止し、カレンダーからしか選べないような形であれば、入力用のテキストボックスを使ってどうにかなるかもしれません
入力用に「日付カレンダー」テキストボックス(非連結)を用意します。幅プロパティを「0cm」にし、「日付」テキストボックスの左端に重なるように設置して見た目上見えないようにします
以下、VBAを使って、「日付カレンダー」(見えないテキストボックス)で日付選択カレンダーを表示し、カレンダーの日付選択時に「日付」テキストボックスに値を設定するサンプルです。
※カレンダーで選択した値を反映させるために変更時('change')イベントを使ってコントロールの移動('setFocus')をしています。「
Me!次のコントロール」は適切なものを指定してくださいご回答ありがとうございます。
テーブルは、「日付」 日付/時刻型フィールド
フォームは、このテーブルがレコードソースになってます。
単票形式フォームです。
非連結テキストボックス 「対象年」、「対象月」があります。
連結テキストボックス「日付」があります。
「日付」を入力する際、カレンダーが表示されますが、
「対象年」と「対象月」が入力されていたらその月のカレンダーを表示してほしいです。
hiroton様
非連結のテキストボックスに入力したら、連結テキストボックスは空欄の状態で、入力する際に日付カレンダーをその月で表示してほしいです。
非連結の月に絞って、ユーザーが連結テキストボックスでカレンダーから入力してほしいです。
どうでしょうか。
日付選択カレンダーを表示したときに選択されている日付は、コントロールに日付が入力されている場合はその日付、入力がない場合は「今日」になるようです
非連結の2つのテキストボックスの更新時で日付フィールドの連結テキストボックスに日付を入力するようにするか、新規レコードの場合であれば、規定値プロパティを変更しても反映されます
ありがとうございます!とても嬉しいです!
やってみます。
最初に訂正を
>> 2ですが、なんでかかっこが漏れているところがありました
(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/(Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))
定義域集計関数と呼ばれる関数(D○○の名前を持ついくつかの関数)はおおよそ同じような記述を行い、「(フィールド名, テーブル/クエリ名, 抽出条件)」のように引数を取ります
すでに出ている例では
で使っていて、抽出条件部分は
"日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#"、実際に計算されるときは例えばのような文字列となって処理されます。この部分がSQLのWhere句に相当する部分となります
任意の日付を用いて特定の年月を対象としたいのであれば、「F01_日報」フォーム上に計算式を作るとして、上記計算では「今日(=
Date())」としていたところをフォーム上のコントロールの参照に置き換えますフォーム上の日付が最大の日付になる場合
さかのぼりで登録することを想定する場合([日付]よりも後の日付がテーブルに保存されている場合=月末日付を求める必要がある場合)
「日付」が入力されるまでは計算式はエラーになるので、Nz関数で補正して、未入力の場合は「今日」で仮に計算する等するとよいかもしれません(
[日付]→Nz([日付],Date()))この抽出条件をそれぞれの定義域集計関数部分に指定してあげてください
多分同様にできると思うので、まずはやってみてください
こちらで教えていただいた下記式について
T01_日報の総売上の合計を取得する際、「F01_日報」上の日付の年月を指定して合計値を求めたい場合はこの式のどこに追加したらいいですか?
これに加えて「T01_月初」テーブルから同じ年月の「家賃」の金額も追加したいです。
宜しくお願いいたします。
(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))
は!本当そのとおりですね!できました。ありがとうございます!!!!😅
文字ならコピペできます
デザインビューで対応していない高度なクエリ(unionクエリやサブクエリなど)を組むことができます
[客数]/[総売上]ではなく[総売上]/[客数]なのでは?
お世話になります。
二つ目のご回答いただいていることに今気が付きました。
2番目の質問はそちらでできそうですね!ありがとうございます☺
ありがとうございます!!
完璧にやりたいことができました。
臨時休業がある時のみ、その日を該当テーブルに登録する処理を追加して教えていただいたコードを記述することにします。
下記2点についても、お手すきの際ご教授ください。。。
1
「客単価(非連結)」を求める式で、希望の答えになりません。
「総売上」フォーカス喪失時に、客単価.requeryをしていて、
客単価には下記式を入力していますが、結果がつねに0になります。
=IIf([総売上]<>0,Int([客数]/[総売上]+0.5),0)
総売上、客単価は通貨型、客数は数値型です。宜しくお願いいたします。
2
このフォーム「F01_日報」のレコードソースは「T01_日報」ですが、フォーム上の「総売上」を
更新したタイミングでその合計値を加算して「その他日割り(非連結)」に表示することはできますか?
このフォームは保存と閉じるのボタンがあり、保存クリック時にイベントを発生させています。
やはり、T01_日報のレコードに保存されてからでないと入力中のレコードの値は利用できませんか?
Private Sub 保存_Click()
On Error Resume Next
strMsg = "登録しますか?"
DoCmd.GoToRecord , , acNewRec
End Sub
Private Sub 閉じる_Click()
On Error Resume Next
strMsg = "登録して閉じますか?"
DoCmd.RunCommand acCmdSaveRecord
If Not Me.Dirty Then DoCmd.Close
End Sub
よろしくおねがいいたします😣
続く集計も同様に計算させます
総営業日や定休日を自動計算させる場合の定休日の日数を求めるため、日報を記録し始めた最初の日を取得しておきます
計上の起算日:
DMin("日付","T01_日報")総売り上げの合計は、現在入力中のフォーム上の値を使うことになりますが、未入力状態だとNullになってしまうのでNz関数で補正しておくと良いでしょう
※「日報フォームを遡って表示する」ということを考えていないのでデータの最終日のチェック部分は含んでいません
今日を求める関数:
Date()日付から日部分を求める関数:
Day()今日の日の部分を求める計算式:
Day(Date())当月において、「今日」までの定休日の日数を数える計算式:
DateDiff("ww",Date()-Day(Date()),Date(),vbMonday)※DateDiff関数を使って、先月末日から該当曜日(月曜日)を何回跨いだか?を計算します
定休日を除いた日数:
Day(Date())-DateDiff("ww",Date()-Day(Date()),Date(),vbMonday)このような情報は余人の知るところではないので、目的に合わせたデータが必要です。例えば「T_臨時休業日」のようなテーブルを作成し、日付のデータを登録します
今日までの当月の臨時休業の日数: DCount("*","T_臨時休業日","日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#")
上記と組み合わせて次の計算式で営業日数が求められます
※どうせ休日を登録するテーブルが必要ならば、単に「T_休業日」として月曜日(定休日)の日付もすべて登録するという方法も考えられます
「営業日数(非連結)」に表示するには、そのまま非連結であってほしい(手入力が可能な状態にしたい)のであれば、VBAを使って適宜上記計算式を呼びだします
たとえば、フォームを読み込んだ時であれば、フォームの読み込み時イベントに[イベント プロシージャ]を設定し当該フォームのモジュールに以下のように記述します
特に営業日数を変更するようなことがないのであれば「営業日数」のコントロールソースに上記計算式をそのまま記述してもよいでしょう。ただし、
vbMondayのようなVBA内でのみ使えるような定数は書き換える必要がありますhatenaさん ありがとうございます。
各グループに段階的に1、-1持たして集計合計の形ですね。応用できる様に工夫してみす。
まずは参考分を理解するようにします。
下記のページの方法が参考になると思います。
レポートでの複雑な集計、グループ化(会計帳票) - hatena chips
簡単に説明すると項目マスターとは別に演算用のグループマスターを作成しておいてそれを結合して集計クエリにするという方法になります。
hatenaさんの2回目の回答(10)を見落としてました。失礼しました。
確かに仰る通りですね。縦に並んだ集計クエリを抜粋すると下記の様になってます。
項目 集計金額 ・・・
A 50
B 30
C 15
D 100
* *
これをA-B=X、X-C=Y のX、Yを縦並びの設計はどうなりますでしょうか? 根本から考え直す必用あり?
mayuさん ありがとうございます。それで出来ました。
x,yとした分を直積でしているのですね(自動生成されたクエリで気づきました)。
こんな方法はとても思いつきません。
細かい指摘も含め大変お世話になりました。
このクエリデータを変形しようとしているのですね。
このクエリのソース自体も名称からして集計クエリのようですね。
集計クエリをもとにクエリを作成するという設計は重い処理になりがちです。
メモリ消費も多くなりそうです。
また、このクエリは縦並びのもの(正規化された形)を横並びになるように変形するものですね。
で、質問でやろうとしていることは、この横並びのものを再び縦並びに戻すということですね。
縦のものを横にして、再び縦に戻すという無駄なことをしているように思えます。
大元のテーブルが正規化されたものなら、そこから直接希望の結果データを得るクエリを考えた方が軽い処理になりそうです。
方法としては大きく2つあります
【 1 】
t_num テーブルに従属列を作り、2列構成にします
SQL文では ChrW関数の使用箇所を
とテーブルの従属列への参照に置き換えるのが王道と言えるでしょう
個々のデータをテーブルというオブジェクトを使って「可視化」できるメリットが大きいため
私としては、こちらの方法をお薦めします
【 2 】
t_num テーブルは1列構成のままにしておき、SQL文中に文字リテラルを直に埋め込んでもいいでしょう
( お薦めはしませんが )
【 1 】の方法で実装したSQL
【 2 】の方法で実装したSQL
mayuさん ありがとうございます。
やはり全角スペースが入ってた様です。それを注意深く修正したら出来ました。
金額算出の指摘もありがとうございました(確かに間違ってました)。
この素晴らしいSQLは半分も理解できてないのですが(すみません)、コードのままだと項目がA、B・・・になってます(多分ChrWの兼ね合いですね)。それを元データのフィールド名の”期首在庫” ”仕入高” 等にするにはどうすればいいでしょうか? それと各金額を通貨型にするにはどうしたらいいでしょうか?(現在は文字列型になっているので)
Q試算表用Base10_損益各利益 クエリには 18列 あるわけですから
t_num のテーブルデータは、1~ 16 ではなく、1 ~ 18 になっていますか
また、>> 6のSQL文中に全角空白が含まれていますから、全て半角に修正して下さい
SQL文の句間を区切る空白に全角は使えません
それと
損益分類ID 12 は勘定科目が重複していますから、当期純利益の値が正確ではないように思えます
mayuさん ありがとうございます。
もう一つの方法で下記SQL実行させると クエリ式エラー , Choose( *** ’の構文エラー:演算子がありませんとなります。何か間違えてます?
hetenaさん ありがとうございます。
現行データはACCESS作成分で下記SQLとなってます。(最終的に18項目となりました)
FROMのクエリは集計クエリで分類毎の合計金額を出してます。その各合計金額を上記で更に色々計算させています(それで1行のデータになってます)。それを後々扱い易い様に縦並びにしたいのです。
この1行のデータの形がよくないでしょうか?
クエリの列数は 16 ということでしたが、実際は 16 列以上だったりしないでしょうか
あまりに縦結合する回数が多かったり、
演算フィールドの値に定義域集計関数を使っていたりすると、リソース不足になることも十分ありえます
また、>> 1の回答で補助テーブルを使う方法も紹介していますが、こちらの結果はどうだったのでしょうか
ユニオンクエリより軽い( クエリのデータスキャンが一回で済みます )ので
メモリ不足のエラーが発生するとは考えにくいです
16の演算フィールドは 全て同じ計算方法 で算出していますか
浮動小数点が含まれる列・含まない列があったり、列毎に使用する関数が異なっているなど
データ型が混在してたりはしないでしょうか混在する場合は、結合の際に CCur関数などで演算フィールドのデータ型を統一する必要があるでしょう
UNION ALL句を5回内包した単体のユニオンクエリを 3 ~ 4つ作り
単体のユニオンクエリ同士を、再度 UNION ALL で結合したということでしょうか
もし、そうであるなら 単体のクエリで利用するリソースが多すぎるということです
先に述べたように、補助テーブルを使う方法が妥当でしょう
このデータはAccessで作成したものでしょうか。
それとも外部から取り込んだものでしょうか。
どちらにしてもリレーショナルデータベースとしてはNGなテーブル設計です。
Accessで作成したものならテーブル設計を欲しい結果の形(正規形)になるようにし直しましょう。
外部から取り込んだものなら取り込むときに正規形のテーブルに変換して取り込むようにしましょう。
取り込むときに変換する方法はいろいろありますが、mayuさんの回答のクエリで正規形に変換して追加クエリで追加するのもひとつの方法です。
mayuさん ありがとうございます。
ユニオンクエリで試しまた。それでいけたのですが全項目だと”メモリ不足”や”これ以上テーブルは無理”のメッセージが出ます。5ヶ位づつのユニオンだといけます。ベースの各項目が計算でして出したものだからでしょうか?
2通りの方法を載せておきます
■ 1 ~ 16 までの数値を入力した補助テーブルを使う方法
・DDL・テーブルデータ・DML( 文中の クエリ名 及び 項目XXX金額 は実際の名前に変更して下さい )■ ユニオンクエリを使う方法
「 HTML テキスト内の全ての要素から全ての属性を取り除く」というのが主な目的なのであれば、
「DOM オブジェクトを使用する」という方法も一応は考えられますが、
上記のようなテキストを DOM オブジェクトで扱う場合は、以下の点に留意しなければならないでしょう。
<html>など最上位のタグで囲まれている状態でパースさせる必要がある。パースされた結果として各行にはインデントが自動的に挿入、調整される。
mayuさんから回答があるようにユーザー定義関数を作成することになると思います。
MSはVBScriptは将来的に廃止にする意向のようですのでVBScriptに依存しないものを作成してみました。
置換対象が「文字列」ではなく「ルール」ですから、VBA.Replace関数での実装は難しいでしょう
別案として 正規表現のUDFを利用する方法をご紹介します
■ユーザー定義関数
■SQL ( 文中のテーブル名は実際の名前に置き換えて下さい )
なお、正規表現に馴染みが無い場合は chatGPT あたりを利用し、AI に
というメッセージを送ってみたり、Grok に
とでも尋ねてみると、それなりの例やマニュアルを提示してくれるでしょう
「フォント」「dpi」あたりで検索すると幸せになれるかもしれません
※詳しく調べていませんが、リモートデスクトップで接続した時のみ現象が出る可能性があります。
三つ並んでいるのはフォントサイズ左から10,9,8です。
色々間違いがあったので訂正します。
・テキストボックスではなくラベルで、自動調整はラベルを右クリック>サイズ変更の自動調整の事です。
・windowsのバージョンは関係ありませんでした。
スクリーンショット用にサンプル作成時に気付いたのですが、モニターのサイズの影響の様です。

4Kモニター+FullHDモニターのPCで作成したものをFullHDモニターのPCで表示すると再現する事がわかりました。
右がFullHDモニターのPCで、下段はテキストボックスでフォントサイズ8、ラベルと幅を合わせたものです。
お手数おかけしました。
どのオブジェクト(フォーム/レポート)についての話をしているのか。
レポートについての話である場合、「印刷プレビュー(またはレポートビュー)で開いた際の表示内容」と「用紙への印刷結果」のどちらについての問題なのか。
とりあえず、以上の点について具体的に明記されることをお奨めします。
もし可能であれば、その状態が一目で判るようなスクリーンショットを添付されるとよいでしょう。
回答者が不具合を再現できるように、もう少し詳しく状況を説明するのはどうでしょう?
とりあえず、Windows11でテキストボックスの設定を調整し直すのはどうでしょう?
エラー行を全て削除し、更新クエリを実行したら、きちんと行えました。
誠にありがとうございました。
再びのご指摘ありがとうございます。
全てのレコードについて見直しましたら、ありました、ありました。
ご指摘の2番目、11文字目以降に"-"が含まれていない注文番号のデータがありました。
私の式が適切ではなく、条件に合致しないものがありました。
sk様、今回はご丁寧な解説ありがとうございました。
大変勉強になりました。
また、よろしくお願いいたします。
演算フィールド[発注番号]が Null を返している場合については問題ないはずです。
hiroton さんと私が指摘しているのは、[発注番号]が以下のような結果を返しているレコードが
[Q_手配内訳2]に 1 件以上含まれていないか、ということです。
[注文番号]の値が Null である(結果、Left 関数の第 2 引数に Null が渡されてエラーが発生する)。
[注文番号]の値の最初の 1 文字が "B" ではなく、かつ 11 文字目以降に "-" が含まれていない(結果、Left 関数の第 2 引数に -1 が渡されてエラーが発生する)。
[注文番号]の値の最初の 1 文字が "B" であり、かつ 12 文字目以降に "-" が含まれていない(結果、Mid 関数の第 3 引数に -2 が渡されてエラーが発生する)。
上記のケースに該当する場合に、エラー値が返されないように[発注番号]の式を組み直すか、[注文番号]の値を適切なものに書き換えるか、もしくは該当するレコード自体が[Q_手配内訳2]の結果に含まれないようになされば、[Q_手配内訳2]と[T_指定日インポート]を[発注番号]同士で結合できるようになるでしょう。