Microsoft Access 掲示板

6,739 件中 121 から 160 までを表示しています。
4
hiroton 2025/09/19 (金) 15:49:49 修正 2d761@f966d

ACCESSの仕様的に「日付」テキストボックスだけではどうしようもないかなーと思ってます
直接入力を禁止し、カレンダーからしか選べないような形であれば、入力用のテキストボックスを使ってどうにかなるかもしれません

入力用に「日付カレンダー」テキストボックス(非連結)を用意します。プロパティを「0cm」にし、「日付」テキストボックスの左端に重なるように設置して見た目上見えないようにします

以下、VBAを使って、「日付カレンダー」(見えないテキストボックス)で日付選択カレンダーを表示し、カレンダーの日付選択時に「日付」テキストボックスに値を設定するサンプルです。

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

※カレンダーで選択した値を反映させるために変更時('change')イベントを使ってコントロールの移動('setFocus')をしています。「Me!次のコントロール」は適切なものを指定してください

3
あん 2025/09/19 (金) 11:57:44 3a8f2@888cb

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

テーブルは、「日付」 日付/時刻型フィールド

フォームは、このテーブルがレコードソースになってます。
単票形式フォームです。

非連結テキストボックス 「対象年」、「対象月」があります。
連結テキストボックス「日付」があります。

「日付」を入力する際、カレンダーが表示されますが、
「対象年」と「対象月」が入力されていたらその月のカレンダーを表示してほしいです。

hiroton様
非連結のテキストボックスに入力したら、連結テキストボックスは空欄の状態で、入力する際に日付カレンダーをその月で表示してほしいです。

非連結の月に絞って、ユーザーが連結テキストボックスでカレンダーから入力してほしいです。

どうでしょうか。

2
hiroton 2025/09/19 (金) 10:44:18 2d761@f966d

日付選択カレンダーを表示したときに選択されている日付は、コントロールに日付が入力されている場合はその日付、入力がない場合は「今日」になるようです
非連結の2つのテキストボックスの更新時で日付フィールドの連結テキストボックスに日付を入力するようにするか、新規レコードの場合であれば、規定値プロパティを変更しても反映されます

9

ありがとうございます!とても嬉しいです!
やってみます。

8
hiroton 2025/08/25 (月) 13:14:27 b296d@f966d

最初に訂正を
>> 2ですが、なんでかかっこが漏れているところがありました

(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/(Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))

(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/(Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))


定義域集計関数と呼ばれる関数(D○○の名前を持ついくつかの関数)はおおよそ同じような記述を行い、「(フィールド名, テーブル/クエリ名, 抽出条件)」のように引数を取ります

すでに出ている例では

DCount("*","T_臨時休業日","日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#")

で使っていて、抽出条件部分は"日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#"、実際に計算されるときは例えば

日付 Between #2025/8/1# And #2025/8/25#

のような文字列となって処理されます。この部分がSQLのWhere句に相当する部分となります


任意の日付を用いて特定の年月を対象としたいのであれば、「F01_日報」フォーム上に計算式を作るとして、上記計算では「今日(=Date())」としていたところをフォーム上のコントロールの参照に置き換えます
フォーム上の日付が最大の日付になる場合

"日付 Between #" & [日付]-Day([日付])+1 & "# And #" & [日付] &"#"

さかのぼりで登録することを想定する場合([日付]よりも後の日付がテーブルに保存されている場合=月末日付を求める必要がある場合)

"日付 Between #" & [日付]-Day([日付])+1 & "# And #" & DateSerial(Year([日付]),Month([日付])+1,0) &"#"

「日付」が入力されるまでは計算式はエラーになるので、Nz関数で補正して、未入力の場合は「今日」で仮に計算する等するとよいかもしれません([日付]Nz([日付],Date())

この抽出条件をそれぞれの定義域集計関数部分に指定してあげてください

DSum("総売り上げ","T01_日報")
↓
DSum("総売り上げ","T01_日報","日付 Between #" & [日付]-Day([日付])+1 & "# And #" & DateSerial(Year([日付]),Month([日付])+1,0) &"#")

これに加えて「T01_月初」テーブルから同じ年月の「家賃」の金額も追加したいです。

多分同様にできると思うので、まずはやってみてください

7

こちらで教えていただいた下記式について
T01_日報の総売上の合計を取得する際、「F01_日報」上の日付の年月を指定して合計値を求めたい場合はこの式のどこに追加したらいいですか?
これに加えて「T01_月初」テーブルから同じ年月の「家賃」の金額も追加したいです。
宜しくお願いいたします。

(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))

6

は!本当そのとおりですね!できました。ありがとうございます!!!!😅

1
hiroton 2025/08/21 (木) 18:27:49 ecd92@f966d

文字ならコピペできます

デザインビューで対応していない高度なクエリ(unionクエリやサブクエリなど)を組むことができます

5
token 2025/08/21 (木) 18:08:35 dc26a@20372

[客数]/[総売上]ではなく[総売上]/[客数]なのでは?

4

お世話になります。
二つ目のご回答いただいていることに今気が付きました。
2番目の質問はそちらでできそうですね!ありがとうございます

3

ありがとうございます!!
完璧にやりたいことができました。
臨時休業がある時のみ、その日を該当テーブルに登録する処理を追加して教えていただいたコードを記述することにします。
下記2点についても、お手すきの際ご教授ください。。。


「客単価(非連結)」を求める式で、希望の答えになりません。
「総売上」フォーカス喪失時に、客単価.requeryをしていて、
客単価には下記式を入力していますが、結果がつねに0になります。
=IIf([総売上]<>0,Int([客数]/[総売上]+0.5),0)
総売上、客単価は通貨型、客数は数値型です。宜しくお願いいたします。


このフォーム「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

よろしくおねがいいたします😣

2
hiroton 2025/08/21 (木) 10:56:13 4750b@f966d

続く集計も同様に計算させます
総営業日や定休日を自動計算させる場合の定休日の日数を求めるため、日報を記録し始めた最初の日を取得しておきます
計上の起算日: DMin("日付","T01_日報")

総売り上げの合計は、現在入力中のフォーム上の値を使うことになりますが、未入力状態だとNullになってしまうのでNz関数で補正しておくと良いでしょう

(DSum("総売り上げ","T01_日報")+Nz([総売り上げ],0))/Date()-DMin("日付","T01_日報")+1-DateDiff("ww",DMin("日付","T01_日報"),Date(),2)-DCount("*","T_臨時休業日"))

※「日報フォームを遡って表示する」ということを考えていないのでデータの最終日のチェック部分は含んでいません

1
hiroton 2025/08/21 (木) 10:09:05 4750b@f966d

今日を求める関数: Date()
日付から日部分を求める関数: Day()
今日の日の部分を求める計算式: Day(Date())

月曜日が定休日なので

当月において、「今日」までの定休日の日数を数える計算式: DateDiff("ww",Date()-Day(Date()),Date(),vbMonday)
※DateDiff関数を使って、先月末日から該当曜日(月曜日)を何回跨いだか?を計算します

定休日を除いた日数: Day(Date())-DateDiff("ww",Date()-Day(Date()),Date(),vbMonday)

しかし万が一8月3日(日)を臨時休業としてた場合は、8月5日(火)の日報入力フォームは3と表示させたいです。

このような情報は余人の知るところではないので、目的に合わせたデータが必要です。例えば「T_臨時休業日」のようなテーブルを作成し、日付のデータを登録します

今日までの当月の臨時休業の日数: DCount("*","T_臨時休業日","日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#")

上記と組み合わせて次の計算式で営業日数が求められます

Day(Date())-DateDiff("ww",Date()-Day(Date()),Date(),vbMonday)-DCount("*","T_臨時休業日","日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#")

※どうせ休日を登録するテーブルが必要ならば、単に「T_休業日」として月曜日(定休日)の日付もすべて登録するという方法も考えられます


「営業日数(非連結)」に表示するには、そのまま非連結であってほしい(手入力が可能な状態にしたい)のであれば、VBAを使って適宜上記計算式を呼びだします
たとえば、フォームを読み込んだ時であれば、フォームの読み込み時イベントに[イベント プロシージャ]を設定し当該フォームのモジュールに以下のように記述します

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

特に営業日数を変更するようなことがないのであれば「営業日数」のコントロールソースに上記計算式をそのまま記述してもよいでしょう。ただし、vbMondayのようなVBA内でのみ使えるような定数は書き換える必要があります

=Day(Date())-DateDiff("ww",Date()-Day(Date()),Date(),2)-DCount("*","T_臨時休業日","日付 Between #" & Date()-Day(Date())+1 & "# And #" & Date() &"#")
14
beginner 2025/08/05 (火) 11:29:44 61dd6@2128d

hatenaさん ありがとうございます。
各グループに段階的に1、-1持たして集計合計の形ですね。応用できる様に工夫してみす。
まずは参考分を理解するようにします。

13

下記のページの方法が参考になると思います。

レポートでの複雑な集計、グループ化(会計帳票) - hatena chips

簡単に説明すると項目マスターとは別に演算用のグループマスターを作成しておいてそれを結合して集計クエリにするという方法になります。

12
beginner 2025/08/05 (火) 08:53:53 61dd6@2128d

hatenaさんの2回目の回答(10)を見落としてました。失礼しました。
確かに仰る通りですね。縦に並んだ集計クエリを抜粋すると下記の様になってます。
項目  集計金額 ・・・
A   50
B    30
C   15 
D   100 
*   *
これをA-B=X、X-C=Y のX、Yを縦並びの設計はどうなりますでしょうか? 根本から考え直す必用あり?

11
beginner 2025/08/04 (月) 16:13:17 61dd6@2128d

mayuさん ありがとうございます。それで出来ました。
x,yとした分を直積でしているのですね(自動生成されたクエリで気づきました)。
こんな方法はとても思いつきません。
細かい指摘も含め大変お世話になりました。

10

現行データはACCESS作成分で下記SQLとなってます。(最終的に18項目となりました)

このクエリデータを変形しようとしているのですね。
このクエリのソース自体も名称からして集計クエリのようですね。
集計クエリをもとにクエリを作成するという設計は重い処理になりがちです。
メモリ消費も多くなりそうです。

また、このクエリは縦並びのもの(正規化された形)を横並びになるように変形するものですね。

で、質問でやろうとしていることは、この横並びのものを再び縦並びに戻すということですね。
縦のものを横にして、再び縦に戻すという無駄なことをしているように思えます。

大元のテーブルが正規化されたものなら、そこから直接希望の結果データを得るクエリを考えた方が軽い処理になりそうです。

9

コードのままだと項目がA、B・・・になってます(多分ChrWの兼ね合いですね)。
それを元データのフィールド名の”期首在庫” ”仕入高” 等にするにはどうすればいいでしょうか?

方法としては大きく2つあります

【 1 】

t_num テーブルに従属列を作り、2列構成にします

CREATE TABLE t_num ( 
      num  INT PRIMARY KEY
    , 科目 VARCHAR(100)
);

 

num科目
1期首在庫
2仕入高
3当期仕入
4期末在庫
5売上原価
6製品売上高
7賃収入
8収入計
9売上総利益
10販管費
11営業利益
12営業外収益
13営業外費用
14経常利益
15特別損失
16税引前当期純利益
17法人税等
18当期純利益

 
SQL文では ChrW関数の使用箇所を

- SELECT ChrW(64 + x.num) As 項目

+ SELECT x.科目 As 項目

とテーブルの従属列への参照に置き換えるのが王道と言えるでしょう

個々のデータをテーブルというオブジェクトを使って「可視化」できるメリットが大きいため
私としては、こちらの方法をお薦めします

【 2 】

t_num テーブルは1列構成のままにしておき、SQL文中に文字リテラルを直に埋め込んでもいいでしょう
( お薦めはしませんが )

- SELECT ChrW(64 + x.num) As 項目

+ SELECT Choose(
+              x.num
+           , '期首在庫'
+           , '仕入高'
+           , '当期仕入'
+           , '売上原価'
+           , '製品売上高'
+           , '賃収入'
+           , '収入計'
+           , '売上総利益'
+           , '賃収入'
+           , '収入計'
+           , '売上総利益'
+           , '販管費'
+           , '営業利益'
+           , '営業外収益'
+           , '営業外費用'
+           , '経常利益'
+           , '特別損失'
+           , '税引前当期純利益'
+           , '法人税等'
+           , '当期純利益'
+        ) As 項目

 

それと各金額を通貨型にするにはどうしたらいいでしょうか?(現在は文字列型になっているので)

 
【 1 】の方法で実装したSQL

SELECT x.科目 As 項目
     , Choose( 
           x.num
         , CCur( y.期首在庫 )
         , CCur( y.仕入高 )
         , CCur( y.当期仕入 )
         , CCur( y.期末在庫 )
         , CCur( y.売上原価 )
         , CCur( y.製品売上高 )
         , CCur( y.家賃収入 )
         , CCur( y.収入計 )
         , CCur( y.売上総利益 )
         , CCur( y.販管費 )
         , CCur( y.営業利益 )
         , CCur( y.営業外収益 )
         , CCur( y.営業外費用 )
         , CCur( y.経常利益 )
         , CCur( y.特別損失 )
         , CCur( y.税引前当期純利益 )
         , CCur( y.法人税等 )
         , CCur( y.当期純利益 )
       ) As 金額
     , x.num As 順番
FROM t_num x
   , Q試算表用Base10_損益各利益 y
ORDER BY 3
;

 
【 2 】の方法で実装したSQL

SELECT Choose(
             x.num
          , '期首在庫'
          , '仕入高'
          , '当期仕入'
          , '売上原価'
          , '製品売上高'
          , '賃収入'
          , '収入計'
          , '売上総利益'
          , '賃収入'
          , '収入計'
          , '売上総利益'
          , '販管費'
          , '営業利益'
          , '営業外収益'
          , '営業外費用'
          , '経常利益'
          , '特別損失'
          , '税引前当期純利益'
          , '法人税等'
          , '当期純利益'
       ) As 項目
     , Choose( 
           x.num
         , CCur( y.期首在庫 )
         , CCur( y.仕入高 )
         , CCur( y.当期仕入 )
         , CCur( y.期末在庫 )
         , CCur( y.売上原価 )
         , CCur( y.製品売上高 )
         , CCur( y.家賃収入 )
         , CCur( y.収入計 )
         , CCur( y.売上総利益 )
         , CCur( y.販管費 )
         , CCur( y.営業利益 )
         , CCur( y.営業外収益 )
         , CCur( y.営業外費用 )
         , CCur( y.経常利益 )
         , CCur( y.特別損失 )
         , CCur( y.税引前当期純利益 )
         , CCur( y.法人税等 )
         , CCur( y.当期純利益 )
       ) As 金額
     , x.num As 順番
FROM t_num x
   , Q試算表用Base10_損益各利益 y
ORDER BY 3
;
8
beginner 2025/08/04 (月) 14:32:31 61dd6@2128d

mayuさん ありがとうございます。
やはり全角スペースが入ってた様です。それを注意深く修正したら出来ました。
金額算出の指摘もありがとうございました(確かに間違ってました)。
この素晴らしいSQLは半分も理解できてないのですが(すみません)、コードのままだと項目がA、B・・・になってます(多分ChrWの兼ね合いですね)。それを元データのフィールド名の”期首在庫” ”仕入高” 等にするにはどうすればいいでしょうか? それと各金額を通貨型にするにはどうしたらいいでしょうか?(現在は文字列型になっているので)

7
mayu 2025/08/04 (月) 11:59:44 修正 fc5d2@6c788 >> 6

クエリ式エラー , Choose( *** ’の構文エラー:演算子がありませんとなります。何か間違えてます?

現行データはACCESS作成分で下記SQLとなってます。(最終的に18項目となりました)

Q試算表用Base10_損益各利益 クエリには 18列 あるわけですから
t_num のテーブルデータは、1~ 16 ではなく、1 ~ 18 になっていますか

また、>> 6のSQL文中に全角空白が含まれていますから、全て半角に修正して下さい
SQL文の句間を区切る空白に全角は使えません

それと

Sum(IIf([損益分類ID] In (10,11,12,13,14,15),[損益分類合計],0)) AS 営業外費用
Sum(IIf([損益分類ID]=12,[損益分類合計],0)) AS 法人税等

損益分類ID 12 は勘定科目が重複していますから、当期純利益の値が正確ではないように思えます

6
beginner 2025/08/04 (月) 11:47:16 61dd6@2128d

mayuさん ありがとうございます。
もう一つの方法で下記SQL実行させると クエリ式エラー , Choose( *** ’の構文エラー:演算子がありませんとなります。何か間違えてます?

 SELECT ChrW(64 + x.num) As 項目
     , Choose( 
           x.num
         , y.期首在庫
         , y.仕入高
         , y.当期仕入
         , y.期末在庫
         , y.売上原価
         , y.製品売上高
         , y.家賃収入
     , y.収入計
         , y.売上総利益
         , y.販管費
         , y.営業利益
         , y.営業外収益
         , y.営業外費用
         , y.経常利益
         , y.特別損失
         , y.税引前当期純利益
         , y.法人税等
     , y.当期純利益
      ) As 金額
    , x.num As 順番
FROM t_num x
   , Q試算表用Base10_損益各利益 y
ORDER BY 3
;
5
beginner 2025/08/04 (月) 10:25:03 61dd6@2128d

hetenaさん ありがとうございます。
現行データはACCESS作成分で下記SQLとなってます。(最終的に18項目となりました)

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集計;

FROMのクエリは集計クエリで分類毎の合計金額を出してます。その各合計金額を上記で更に色々計算させています(それで1行のデータになってます)。それを後々扱い易い様に縦並びにしたいのです。
この1行のデータの形がよくないでしょうか?

4

全項目だと”メモリ不足”や”これ以上テーブルは無理”のメッセージが出ます。

クエリの列数は 16 ということでしたが、実際は 16 列以上だったりしないでしょうか

あまりに縦結合する回数が多かったり、
演算フィールドの値に定義域集計関数を使っていたりすると、リソース不足になることも十分ありえます

また、>> 1の回答で補助テーブルを使う方法も紹介していますが、こちらの結果はどうだったのでしょうか
ユニオンクエリより軽い( クエリのデータスキャンが一回で済みます )ので
メモリ不足のエラーが発生するとは考えにくいです
 

ベースの各項目が計算でして出したものだからでしょうか?

16の演算フィールドは 全て同じ計算方法 で算出していますか

浮動小数点が含まれる列・含まない列があったり、列毎に使用する関数が異なっているなど
データ型が混在 してたりはしないでしょうか
混在する場合は、結合の際に CCur関数などで演算フィールドのデータ型を統一する必要があるでしょう
 

5ヶ位づつのユニオンだといけます

UNION ALL句を5回内包した単体のユニオンクエリを 3 ~ 4つ作り
単体のユニオンクエリ同士を、再度 UNION ALL で結合したということでしょうか

もし、そうであるなら 単体のクエリで利用するリソースが多すぎるということです
先に述べたように、補助テーブルを使う方法が妥当でしょう

3

現行データは
[項目A金額] [項目B金額] [項目C金額]・・・の1行だけのデータです(16項目)
  10     15     100 ・・・

このデータはAccessで作成したものでしょうか。
それとも外部から取り込んだものでしょうか。

どちらにしてもリレーショナルデータベースとしてはNGなテーブル設計です。

Accessで作成したものならテーブル設計を欲しい結果の形(正規形)になるようにし直しましょう。
外部から取り込んだものなら取り込むときに正規形のテーブルに変換して取り込むようにしましょう。

取り込むときに変換する方法はいろいろありますが、mayuさんの回答のクエリで正規形に変換して追加クエリで追加するのもひとつの方法です。

2
beginner 2025/08/04 (月) 08:30:37 61dd6@2128d

mayuさん ありがとうございます。
ユニオンクエリで試しまた。それでいけたのですが全項目だと”メモリ不足”や”これ以上テーブルは無理”のメッセージが出ます。5ヶ位づつのユニオンだといけます。ベースの各項目が計算でして出したものだからでしょうか? 

1

1行だけのクエリデータを縦並びにしたいのですが、それは可能でしょうか?
現行データは
[項目A金額] [項目B金額] [項目C金額]・・・の1行だけのデータです(16項目)

2通りの方法を載せておきます

 
■ 1 ~ 16 までの数値を入力した補助テーブルを使う方法
 
・DDL

CREATE TABLE t_num ( num INT PRIMARY KEY ) ;

 
・テーブルデータ

num
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

 
・DML ( 文中の クエリ名 及び 項目XXX金額 は実際の名前に変更して下さい )

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
;
3
sk 2025/07/28 (月) 08:20:02 修正 88328@64ac3

「 HTML テキスト内の全ての要素から全ての属性を取り除く」というのが主な目的なのであれば、
「DOM オブジェクトを使用する」という方法も一応は考えられますが、

<table style="width: 100%;">
<tr>
<th style="width:100%;">型式</th>
<td style="width:100%;">AA1111</td>
</tr>
</table>
<span style="color: red;">あああああ</span>

上記のようなテキストを DOM オブジェクトで扱う場合は、以下の点に留意しなければならないでしょう。

  • <html> など最上位のタグで囲まれている状態でパースさせる必要がある。

  • パースされた結果として各行にはインデントが自動的に挿入、調整される。

2
hatena 2025/07/27 (日) 04:02:42 修正

mayuさんから回答があるようにユーザー定義関数を作成することになると思います。

MSはVBScriptは将来的に廃止にする意向のようですのでVBScriptに依存しないものを作成してみました。

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
1

のように置換のルールを並べて記載して

置換対象が「文字列」ではなく「ルール」ですから、VBA.Replace関数での実装は難しいでしょう
別案として 正規表現のUDFを利用する方法をご紹介します

 
■ユーザー定義関数

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
;

 
なお、正規表現に馴染みが無い場合は chatGPT あたりを利用し、AI に

vbscript 正規表現 マニュアル

というメッセージを送ってみたり、Grok

vbscript 正規表現 メタ文字

とでも尋ねてみると、それなりの例やマニュアルを提示してくれるでしょう

6
hiroton 2025/07/17 (木) 12:55:40 be9ae@f966d

「フォント」「dpi」あたりで検索すると幸せになれるかもしれません

5
ssassaki 2025/07/17 (木) 12:33:46 27741@c3bad >> 3

※詳しく調べていませんが、リモートデスクトップで接続した時のみ現象が出る可能性があります。

4
ssassaki 2025/07/17 (木) 12:13:27 27741@c3bad >> 3

三つ並んでいるのはフォントサイズ左から10,9,8です。

3
ssassaki 2025/07/17 (木) 12:10:10 27741@c3bad

色々間違いがあったので訂正します。
・テキストボックスではなくラベルで、自動調整はラベルを右クリック>サイズ変更の自動調整の事です。
・windowsのバージョンは関係ありませんでした。

スクリーンショット用にサンプル作成時に気付いたのですが、モニターのサイズの影響の様です。
4Kモニター+FullHDモニターのPCで作成したものをFullHDモニターのPCで表示すると再現する事がわかりました。
右がFullHDモニターのPCで、下段はテキストボックスでフォントサイズ8、ラベルと幅を合わせたものです。
画像1

お手数おかけしました。

2

windows10/access365で作成したものをwindows11のパソコンで動かしたとき、
MSゴシックでフォントサイズによって、文字間隔が以前よりひろくなっています。

  • どのオブジェクト(フォーム/レポート)についての話をしているのか。

  • レポートについての話である場合、「印刷プレビュー(またはレポートビュー)で開いた際の表示内容」と「用紙への印刷結果」のどちらについての問題なのか。

フォントサイズ8でサイズ自動調整したテキストボックス

  • ここでの「サイズ自動調整」とは、そのテキストボックスのどのプロパティに対するどのような設定や操作を意味するのか(少なくともテキストボックスの[フォントサイズ]プロパティ自体には、フォントのサイズを自動調整する機能はない)。もしそれが VBA による操作である場合、どのイベントの発生時にどのようなコードを実行しているのか。

とりあえず、以上の点について具体的に明記されることをお奨めします。
もし可能であれば、その状態が一目で判るようなスクリーンショットを添付されるとよいでしょう。

1
りんご 2025/07/16 (水) 21:17:55 935bc@0e907

 回答者が不具合を再現できるように、もう少し詳しく状況を説明するのはどうでしょう?
 とりあえず、Windows11でテキストボックスの設定を調整し直すのはどうでしょう?

12
かーか 2025/07/16 (水) 18:02:14 58908@63c3a

エラー行を全て削除し、更新クエリを実行したら、きちんと行えました。
誠にありがとうございました。

10
かーか 2025/07/16 (水) 17:46:47 58908@63c3a

再びのご指摘ありがとうございます。
全てのレコードについて見直しましたら、ありました、ありました。
ご指摘の2番目、11文字目以降に"-"が含まれていない注文番号のデータがありました。
私の式が適切ではなく、条件に合致しないものがありました。
sk様、今回はご丁寧な解説ありがとうございました。
大変勉強になりました。
また、よろしくお願いいたします。

8
sk 2025/07/16 (水) 09:24:20 修正 88328@64ac3 >> 6

確かに "-" が見つからなかった場合の扱いは設定されておらず、結果演算フィールドは空のままです。

演算フィールド[発注番号]が Null を返している場合については問題ないはずです。

IIf(Left([機種],1)<>"○",IIf(Left([注文番号],1)="B",Mid([注文番号],2,InStr(12,[注文番号],"-",0)-2),Left([注文番号],InStr(11,[注文番号],"-",0)-1)),[注文番号])

hiroton さんと私が指摘しているのは、[発注番号]が以下のような結果を返しているレコードが
[Q_手配内訳2]に 1 件以上含まれていないか、ということです。

画像1

  • [機種]の値が "○" でも Null でもなく、かつ次に示すいずれかの条件に該当する。
  1. [注文番号]の値が Null である(結果、Left 関数の第 2 引数に Null が渡されてエラーが発生する)。

  2. [注文番号]の値の最初の 1 文字が "B" ではなく、かつ 11 文字目以降に "-" が含まれていない(結果、Left 関数の第 2 引数に -1 が渡されてエラーが発生する)。

  3. [注文番号]の値の最初の 1 文字が "B" であり、かつ 12 文字目以降に "-" が含まれていない(結果、Mid 関数の第 3 引数に -2 が渡されてエラーが発生する)。

上記のケースに該当する場合に、エラー値が返されないように[発注番号]の式を組み直すか、[注文番号]の値を適切なものに書き換えるか、もしくは該当するレコード自体が[Q_手配内訳2]の結果に含まれないようになされば、[Q_手配内訳2]と[T_指定日インポート]を[発注番号]同士で結合できるようになるでしょう。