Microsoft Access 掲示板

views
4 フォロー
6,297 件中 1 から 40 までを表示しています。
6
beginner 2024/12/20 (金) 12:38:48 61dd6@2d033

hatenaさん ありがとうございます。
頂いたコードで上手く出来ました。確かにそうですね、サブクエリでしたらいいのですね。
Parentの事も初めて知りました。親フォーム参照時に便利ですね。毎回こういった事も大変勉強になります。
お世話になりました。

3
しおこんぶ 2024/12/20 (金) 09:44:51 a6738@80964 >> 1

ご解答ありがとうございます。
ACCESSは聞ける人がいなく独学でやっているもので、まず私の拙い文章をくみ取っていただいたことが嬉しいです。

A,Bどちらの方法でもうまくいきました。ありがとうございます。
IIf関数を使用すればよかったのですね。クエリで違う関数でやってみたのですが、作業員すべてを表示したいのに対象の値しかでないので(←あたりまえですね)作業員すべて出すにはレポートで条件付き書式でしか不可能かと思いこんでいました。
おっしゃる通り一つのテキストボックスに3パターンを入れ込もうとしてました...
A,Bの提案のおかげで円滑にレポートが作成できました。ありがとうございます。

初めての質問で不安でしたがhiroton様の説明とても分かりやすく、本当に助かりました。
入社日と退職日は別列で表示してるので、ダブっていても問題はありません。ご配慮ありがとうございます。
お陰様でより良いレポートが完成しました。素晴らしい解答を本当にありがとうございます。

1
hiroton 2024/12/20 (金) 09:01:20 a3a5a@f966d

今年度表示のために「"m"-3」をどこに入れればいいか分からず困っています。

これがどこから出てきたのかわからないけど、年を年度に変えたい=月をずらしたいならDateAdd 関数を使うとよいでしょう

Year(DateAdd("m", -3, Date()))=Year(DateAdd("m", -3, [入社日]))の比較を行えばいいですね


また、可能であれば、今年度以外は「白」の条件付き書式にしたいです。

「印刷したくない」のが目的であれば、そもそも印字データを出力しないようにするほうがわかりやすいと思います。上記条件を使って、

A.クエリでデータ表示用フィールドを作る

入社日表示: IIf(Year(DateAdd("m",-3,Date()))=Year(DateAdd("m",-3,[入社日])),[入社日])

B.レポート上の非連結テキストボックスで計算する(非連結のテキストボックスを配置してコントロールソースに計算式を設定する)

=IIf(Year(DateAdd("m",-3,Date()))=Year(DateAdd("m",-3,[入社日])),[入社日])

※レポート上に「入社日」テキストボックスが必要(可視プロパティを「いいえ」にして非表示にする)


入社日(青色)、退職日(赤色)、今年度以外は(白色=表示しない)の条件付き書式を考えています。

一つのテキストボックスで3パターンの表示を考えてるんでしょうか?1年以内に退職した場合(入社日と退職日が両方表示される場合)はどうするんでしょう?

「入社日を表示する/しない」であれば、上記のように計算式でデータの出力を制御すれば、条件付き書式を使わず表現できます

5

メインフォームに表示されている部材を持っている会社がサブフォームに表示されている。
この会社を削除したり追加したりする。
追加するときに、コンボボックスで選択するが、そのときに既に入力済みの会社はリストから除外する。

上記の仕様なら、下記のようなSQLでどうでしょうか。

  strSQL =
         "SELECT [会社ID], [会社名] " & _
      "FROM T3 " & _
         "WHERE 会社ID Not In " & _
            "(SELECT 会社ID FROM T2 WHERE 部材ID=" & Me.Parent!部材ID & ")" & _
       "ORDER BY [会社ID] ;"
4
beginner 2024/12/18 (水) 08:49:05 61dd6@2d033

hatenaさん ありがとうございます。
会社テーブルはT3:会社ID(数値型), 会社名(テキスト型)の構成です。

3

必用によって部材の在庫を持っている会社を追加、あるいは削除する事はあります。

この作業用のフォームということでしょうか。つまり、T1、T2、それぞれのマスターテーブルのメンテナンス用ということでしょうか。

メインフォームに表示されている部材を持っている会社がサブフォームに表示されている。
この会社を削除したり追加したりする。
追加するときに、コンボボックスで選択するが、そのときに既に入力済みの会社はリストから除外する。

上記の仕様でいいですか。
だとすると、別に会社マスターテーブルが必要だと思いますが、そのテーブルの情報も提示してください。

2
beginner 2024/12/17 (火) 12:19:11 61dd6@2d033

hatenaさん ありがとうございます。
仕様としては部材毎にどの会社に預けているを設定しており、別の棚卸し入力フォームで部材選択を絞り込む時に便利なのです。同じ部材の対象がA社、B社等複数あったり、棚卸外の分は未設定もあります。
なので部材登録フォーム(T1が基)にサブフォーム(T2が基)を設定してます。部材が大量にあるので在庫対象会社に対して部材IDを設定する方が大変だと思い、そうしてます。必用によって部材の在庫を持っている会社を追加、あるいは削除する事はあります。

1

ちょっと仕様が不明瞭ですが、
メインフォームのレコードソースがT1(部材テーブル)
サブフォームのレコードソースがT2(在庫対象会社テーブル)
ということでしょうか。

このフォームの目的はなんでしょうか。

T2(在庫対象会社テーブル)のメンテナンス用で、
部材の在庫を持っている会社を追加、あるいは削除するということでしょうか。

4
maxwanta 2024/12/16 (月) 09:20:09 a6fab@afdb1

hatenaさん

》フォーマット時では印刷時拡張したときの高さは取得できません。

よくわかりました。詳しくご教示いただきありがとうございました。

3

実は、フォーマット時 と 印刷時の違いを知らなかったのです。

フォーマット時で印刷時拡張を考慮して位置やサイズを計算してレイアウトを決定します。
フォーマット時では印刷時拡張したときの高さは取得できません。

印刷時にフォーマット時で決定されたレイアウトで出力します。
この時点で印刷時拡張されたときの高さを取得できます。
印刷時では直線コントロールの位置やサイズは変更できないので、Lineメソッドで直線を描画します。

2
maxwanta 2024/12/14 (土) 00:27:20 f81c2@2919c

hatena さん
早速 ご回答ありがとうございました。成功しました。

》「印刷時」イベントに記述してますか。    

私は、「フォーマット時」に上記 vbaを記載していました。
「印刷時」に記載すると、狙い通りの結果を得られました。
実は、フォーマット時 と 印刷時の違いを知らなかったのです。

》「立体表示」プロパティに「下線付き」

こんな設定があるのも知りませんでした。これを指定すると、VBAを記載するまでもなく、目的を達成できました。

ありがとうございました。

1

Office2010とはずいぶん古いバージョンですが間違いないですか。
それだけ古いと下記の回答では対応してないかもしれませんので、その場合はご容赦ください。

標記のとおり、印刷時拡張を設定してテキストボックスの下端にあわせて横線を引きたいとおもっています。

テキストボックスの「立体表示」プロパティに「下線付き」という設定があります。その設定にすればVBAを使うまでもなく下線が表示できますし、印刷時拡張しても追従します。

上記ではうまくできないという場合は、質問のコードでいいと思いますが、このコードはどこに記述してますか。
テキストボックスを配置しているセクションの「印刷時」イベントに記述してますか。
テキストボックスが詳細セクションにあるのなら、下記のようになるはずです。

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
    ' As Integerは変数毎につける必要がある  省略するとVariant型になる
    Dim p1 As Integer, p2 As Integer, p3 As Integer, p4 As Integer
    Dim ht1 As Integer

    p1 = Me.直線21.Left
    p2 = Me.直線20.Left
    p4 = Me.s_koment.Top
    ht1 = Me.s_koment.Height
    Me.Line (p1, p4 + ht1)-(p2, p4 + ht1)
End Sub
3
すぅ 2024/12/09 (月) 18:04:09 f862c@b9210

返信ありがとうございます。
非表示のほうで組み込んだところ画面もすっきりして思い通りの動作になりました。
ありがとうございました。

2

ポップアップフォーム名を F_Popup とすれば下記のようなコードになります。

    Forms!F_Popup.SetFocus
    DoCmd.Minimize

ただ、Microsoft365だと最小化したポップアップフォームをユーザーが操作するのが難しいので、非表示にするほうがいいと思います。非表示でもポップアップフォームの抽出条件などは取得できます。

    Forms!F_Popup.Visible = False

ちなみに、最小化または非表示にしたフォームを元に戻すor再表示させるのは、下記でOKです。

    DoCmd.OpenForm "F_Popup"
5
しん 2024/11/22 (金) 18:01:04 f87c1@9fff4

>>VBAですることになりますが、イベントはKeyDownではなくKeyUpが適切です。

hatena様ありがとうございました

4
hatena 2024/11/22 (金) 13:43:08 修正

ちなみに、Enterキーを入力したときのみ次のレコードへ移動したいということなら、
VBAですることになりますが、イベントはKeyDownではなくKeyUpが適切です。

Private Sub fld1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyReturn Then  ' Enterキーが押された場合
        On Error Resume Next       ' エラー防止(最終レコード時など)
        DoCmd.GoToRecord , , acNext  ' 次のレコードに移動
        KeyCode = 0                ' Enterキーの既定動作を無効化
    End If
End Sub
3

仕入を入力したときに、同じ列の売上にカーソルが移動するのではなく
その下の仕入にカーソルが移動するように設定したいのです。

「仕入」以降のテキストボックス(売上、利益)の「タブストップ」プロパティを「いいえ」にすればどうですか。
ただし、売上、利益 へはキー操作では移動できなくなりますので、マウスクリックする必要があります。

2
しん 2024/11/22 (金) 11:05:09 f87c1@9fff4

画像1
フォームの形は、アップロードしたものです。

1
しん 2024/11/22 (金) 11:04:38 f87c1@9fff4

フォームの形は、アップロードしたものです。

2
しん 2024/11/11 (月) 09:58:09 f87c1@9fff4

hatena様

返信遅れて申し訳ありません。

仰る通り、下記のSQL文で解決しました。

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


INSERT INTO MT_検索テーブル
(
 親番, 
 売上先, 
 子番, 
 支店_営業所, 
 孫番, 
 現場名, 
 府県, 
 締日, 
 直近3ヶ月, 
 油種, 
 仕入, 
 売上, 
 利益, 
 仕入コード, 
 仕入先, 
 単価_ランク_コード, 
 単価_ランク, 
 [開始(復活)], 
 終了, 
 備考1, 
 備考2, 
 担当, 
 車番①, 
 車番②, 
 車番③, 
 車番④, 
 車番⑤, 
 車番⑥, 
 車番⑦, 
 車番⑧, 
 車番⑨, 
 売上先カナ, 
 支店_営業所カナ, 
 現場名カナ, 
 フラグ, 
 日付コード, 
 油種コード, 
 合成キー, 
 納入先業者名カナ, 
 親グループカナ, 
 更新用フラグ, 
 締め日, 
 更新合成キー, 
 最終編集日, 
 終了日, 
 終了チェック 
)
SELECT 
親番, 
売上先,
子番,
支店_営業所, 
孫番,
現場名,
府県, 
締日, DateAdd("m",1,[直近3ヶ月]) AS 日時,
油種, 
Null AS 仕入C, 
Null AS 売上C, 
Null AS 利益C, 
仕入コード,
仕入先,
単価_ランク_コード, 
単価_ランク,
[開始(復活)],
終了, 
備考1,
備考2,
担当,
車番①,
車番②,
車番③,
車番④,
車番⑤,
車番⑥,
車番⑦,
車番⑧,
車番⑨,
売上先カナ,
支店_営業所カナ,
現場名カナ,
[フラグ],
日付コード,
油種コード, 
[親番] & "-" & [子番] & "-" & [孫番] & "-" & [油種コード] & "-" & [仕入コード] & "-" & Format([日時],"yyyymmdd") AS 合成キー2, 
納入先業者名カナ,
親グループカナ, 
Year(Date()) & "年" & Month(Date()) & "月" & "レイアウト" AS 更新用,
 IIf(Day([日時])=1,DateSerial(Year([日時]),Month([日時])+1,0),DateAdd("m",1,[日時])+1) AS 締め日,
更新合成キー, 
最終編集日,
終了日, 
終了チェック
FROM MT_検索テーブル
WHERE (((MT_検索テーブル.終了チェック)=False) AND ((MT_検索テーブル.直近3ヶ月) Between DateSerial(Year(Date()),Month(Date())-1,1) And DateSerial(Year(Date()),Month(Date()),0)));

1

確認ですが、

主キーは、合成キーで、重複はしてません。
IDも主キーで、オートナンバー型です。

複数フィールドに主キーを設定しているのですか。
オートナンバーは重複しないので意味がないのでは?

ID(オートナンバー型)を主キーにして、合成キーはインデックス(重複なし)を設定するのが通常の設計だと思います。

また、追加クエリーにはオートナンバー型フィールドは含めないようにすべきだと思います。

2
beginner 2024/11/06 (水) 11:59:10 61dd6@72e67

hatenaさん ありがとうございます(連絡遅くなり失礼しました)。
フォーム再作しても状況変わらずでしたので、リレーションを見直しました。メインテーブルの顧客IDに色々設定しているのが間違えてました。顧客テーブルにするのが正解でした。メインフォームの入力用コンボボックスに対してリレーションしてしまってました。リレーションとルックアップを同じ様に考えてました。
正しく設定すると普通にレコード削除できました。
お世話になりました。

21
しん 2024/11/04 (月) 20:08:19 f87c1@9fff4

sk様 
図まで添付していただきありがとうございます。
テーブルに関しては、その通りです。
クエリで00-0000-00-202410な文字列をExcelでもACCESSでも作成しています。

返信遅くなりまして申し訳ありません

3
かーか 2024/11/02 (土) 19:58:50 a1528@b5300

ご丁寧な対応ありがとうございました。
わたくしのスキルでは1行ずつ解析する必要がありますので、これから取り組んでみます。

2

下記のサンプルコードでうまくいくことを確認しました。

Public Sub Sample()
    Const ExcelFileName = "C:\test\Tbl1.xlsx"
    DoCmd.TransferSpreadsheet acExport, 10, "Tbl1", ExcelFileName, True
    
    Dim objExcel As Object, objWb As Object, objWs As Object
    Set objExcel = CreateObject("Excel.Application")
    Set objWb = objExcel.Workbooks.Open(ExcelFileName)
    Set objWs = objWb.Worksheets(1)
    objWs.cells.Font.Size = 10
    objWb.Save
    objWb.Close
    objExcel.Quit
    Set objExcel = Nothing
End Sub
1

エクスポートしたブックを、VBAで開いてフォントを変更するしかないような気がします。

Accessからエクセルを開いて操作する方法は下記あたりを参考に。

【Access VBA】AccessからExcelを操作する方法 #ポートフォリオ - Qiita

20

[MT_検索テーブル]のフィールド[直近3ヶ月]のデータ型

日付/時刻型です。

Cells(i, "A")⇒仕入コード
Cells(i, "E")⇒油種コード
Cells(i, "G")⇒単価ランクコード
Cells(i, "J")⇒日付コード

.Range(.Cells(2, "J"), .Cells(maxR, "J")) = Format(ActiveCell.Value, "yyyymm")

つまり、

画像1

Access 側の[MT_検索テーブル]の各レコードの更新前の状態がこうであるのに対し、

画像2

Excel 側の[転送用シート](恐らく実際は別のワークシート)の状態がこうだとして、

画像3

そのブックのいずれかのワークシートの「任意の日付が入力されているセル」が
選択されている(アクティブセルになっている)状態でマクロを実行したら

画像4

Access 側の[MT_検索テーブル]の各レコードがこうなればよい、ということですか。

2
タークン 2024/10/31 (木) 16:15:35 7aa2b@2705a

言われてみれば、exit sub(function)がなければ終了していないので、
下部のerrTrapの処理が行われてしまいますね。

変数を多用するケースではないので、
いちいちfunctionに飛ばすのも面倒だと思って飛ばさないようにしていたのですが、
途中で終了させるわけにはいかないので、
目障りではありますが、飛ばして処理する事に致します。
ありがとうございました。

1

他のファイルのフォームにも同様のコードがあり、それはこうならないのです。この分だけがこうなるので不思議でなりません。

そのフォームが破損しているのかもしれません。
一からメインフォームとサブフォームを作り直してみたらどうでなりますか。

19
しん 2024/10/31 (木) 11:09:44 f87c1@9fff4

hiroton様

貴重なご意見ありがとうございました。

>>問題解決のために何が必要か?複数のアプローチを検討・実施することが問題解決の近道になります

その通りだと思います。
今後に向けて精進します。

1
ssassakki 2024/10/31 (木) 10:34:27 27741@c61b7

回答し辛い質問ですが・・・
プログラムは上から下に順番に実行されていきますので、
正常にレコードが更新されてからerrTrap:に飛んでいるのではなく、
更新後にerrTrap:移行の処理が順番に実行されています。

試してませんが、errTrap:の前でexit sub(function)で処理を抜けるようにすればいいはずです。

18
hiroton 2024/10/31 (木) 09:59:51 573a8@f966d

hirotonの回答は「実際に実行されたSQLを表示する」だけです
続く条件判定により「『更新されない』時だけSQLが表示される」ことを期待しています

結果を見てできることを質問者さんが考えてもいいですし、そのまま結果を提示してもらえれば問題解決に一歩近づくだろうという検証をするための情報を生み出すコードです

このコードの実行結果はいくつか想定されます。たとえば

  • 特に変化が見られず、処理が終了した
  • Stop行が実行され(処理が中断し)、SQLが表示された

大きく分ければこの二つしかありませんが、SQLが表示されれば

  • SQLが表示されたが、EXCELの内容から期待したSQLになっていなかった
  • SQLが表示され、EXCELの内容から期待したSQLが表示された

のように、内容を深堀することもできます。当然、「SQLが表示されることなく処理が終了した」の結果ならその先の想定も無意味なものになるので、hirotonの最初のアプローチとしては「実際に実行されたSQLを確認してみては?」で止まっているわけです
回答で想定されているパターンを網羅するのは質問に対して不要な情報であふれることになりトピックの質が落ちますし、1つの正解以外は徒労というのもhirotonはやりたくありません


自己解決した内容をみるに、実行されるSQLは期待した文字列だったものと思われます。SQLが正しく実行されるかどうかのほうに問題があり、つまり、EXCELからの読み込み部分は問題ないのだと確認が取れるでしょう

ならば、EXCELのデータやその取り込み部分をいくら深堀したところで問題は解決しません

問題解決のために何が必要か?複数のアプローチを検討・実施することが問題解決の近道になります

17
しん 2024/10/30 (水) 22:56:24 f87c1@9fff4

クエリでは、更新できませんでしたが、テーブルに変更すると、更新ができました。
理由は不明です。

sk様 いつもありがとうございます。私の不手際で、気分を害されたら、お詫びします。
また、検証用のコードありがとうございました。
このようなコードで、検証できるように、精進します。

hiroton様

いつも回答ありがとうございます。
hiroton様の検証用のコードも理解できませんでしたので、理解できるように精進します。

お騒がせして申し訳ありません。

ありがとうございました。

4
fukusan113 2024/10/30 (水) 15:12:24

hirotonさん
出来ました!
ありがとうございます、本当に助かりました!!

16
しん 2024/10/30 (水) 12:07:52 f87c1@9fff4

sk様返信ありがとうございます。

>>Access側のテーブル[MT_検索テーブル]のフィールド[直近3ヶ月]のデータ型は日付/時刻型なのでしょうか。

日付/時刻型です。

>>Excel 側のワークシート[転送用シート]において、K 列の各セルは J 列を含む他の列のセルを参照する数式セルなのでしょうか。

.Cells(i, "K") = .Cells(i, "A") & "-" & .Cells(i, "E") & "-" & .Cells(i, "G") & "-" & .Cells(i, "J")

>>
また、[仕入コード]、[油種コード]および[単価_ランク_コード]に相当する列は、Excel 側のワークシート[転送用シート]に存在していないのでしょうか。

存在しています。
Cells(i, "A")⇒仕入コード
Cells(i, "E")⇒油種コード
Cells(i, "G")⇒単価ランクコード
Cells(i, "J")⇒日付コード

です

15
Left(Format([直近3ヶ月],"yyyymmdd"),6) AS 日付コード

Access側のテーブル[MT_検索テーブル]のフィールド[直近3ヶ月]のデータ型は日付/時刻型なのでしょうか。

.Range(.Cells(2, "J"), .Cells(maxR, "J")) = Format(ActiveCell.Value, "yyyymm")

Excel 側のワークシート[転送用シート]において、K 列の各セルは J 列を含む他の列のセルを参照する数式セルなのでしょうか。

[仕入コード] & "-" & [油種コード] & "-" & [単価_ランク_コード]& "-" &[日付コード] AS 更新合成キー

また、[仕入コード]、[油種コード]および[単価_ランク_コード]に相当する列は、Excel 側のワークシート[転送用シート]に存在していないのでしょうか。

14

単価転送とは別のデバッグ用マクロとして示したものですので、そっくりそのままコピーして実行していただかないとむしろ困ります。

ならば、そのように実行できるように手順を示すべきでしょう
自分の思うとおりに動いてくれなかったことの責任を相手に求めるのは良くないですよ
これは質問者であるとか回答者であるとかに関係することではありません

続く文に関しては特にhirotonが指摘している件とは無関係なのでノーコメントです

13
しん 2024/10/30 (水) 10:59:50 f87c1@9fff4

更新を実行したいクエリのSQL文は、下記の通りです。

SELECT ID, 
仕入コード,
仕入先,
油種コード,
単価_ランク, 
単価_ランク_コード, 
直近3ヶ月, 
仕入, 
Left(Format([直近3ヶ月],"yyyymmdd"),6) AS 日付コード,
 [仕入コード] & "-" & [油種コード] & "-" & [単価_ランク_コード]& "-" &[日付コード] AS 更新合成キー,
FROM MT_検索テーブル;

仕入のフィールドの型は、
単精度浮動小数点型です。

昨日からのアドヴァイスをいただき、検証しました。

実際に利用している単価更新キーは

00-0000-00-202410

このような文字列です。

SQL文に記載のある

Left(Format([直近3ヶ月],"yyyymmdd"),6)

この値をつけると更新できませんが、この値をつけなければ更新できます。

00-0000-00 ⇒更新できます。

sk様のコードでも確認して、更新件数は合致します。

Excel上のマクロは下記の通りです。

.Range(.Cells(2, "J"), .Cells(maxR, "J")) = Format(ActiveCell.Value, "yyyymm")

疑問なのですが、

Left(Format([直近3ヶ月],"yyyymmdd"),6)
.Range(.Cells(2, "J"), .Cells(maxR, "J")) = Format(ActiveCell.Value, "yyyymm")

このコードを実行すると、202410になりますが、ExcelとACCESSでは、異なる値と判断されるのでしょうか?

12

単価転送とは別のデバッグ用マクロとして示したものですので、そっくりそのままコピーして実行していただかないとむしろ困ります。

少なくとも、実際に更新されたレコード件数が本当に 3 件であるならば、イミディエイトウィンドウにもそのように示されるはずであり、挙動としてあまりに不自然です。

11
hiroton 2024/10/30 (水) 10:43:56 1ba09@f966d >> 9

もともと「Sub 単価転送()」とプロシージャを設定しているのにそっくりそのままコピーして実行したのではないからだというのはちょっと酷だと思いますよ