>> 9
SQLは苦手です。メモさせて下さい。
原本と原本コピーがあり、原本の開始日をマイナス1、原本コピーの終了日と突合してみたり、原本の終了日をプラス1、原本コピーの開始日と突合してみたり。最終的に左外部結合。原本は一致レコードと不一致レコード、原本コピーは一致レコードとNullレコード。
そして「T2.終了日 Is Null」と「T3.開始日 Is Null」の部分で不一致クエリ。空欄、先頭の開始日、最後の終了日もひっくるめて判定。
氏名あああの場合、空欄の不一致判定を除外する為に、「And Not (T1.開始日 Is Null」と「And Not (T2.終了日 Is Null」が必要。
氏名いいいの場合、先頭の開始日と最後の終了日の不一致判定を除外する為に、「And Not (…T1.開始日 = DMin」と「And Not (…T2.終了日 = DMax」が必要。
Private Sub Report_Open(Cancel As Integer)
'開始位置入力 全角OK 漢字等は0になるが結果的に最初の位置から印刷
' [キャンセル]ボタンをクリック、または空欄の時は印刷しない
Dim res As String
res = InputBox("印刷開始位置を入力してください(1~)", , 1)
If res = "" Then
Cancel = True
Else
s_position = Val(StrConv(res, vbNarrow))
End If
End Sub
hatena様
返信ありがとうございます。また、遅くなりすみません。
>>仕様
ありがとうございます。
またアイデアありがとうございました。検討してみます!
hatena 様
>まずは公式のヘルプで確認しましょう。
これによると引数はすべて文字列で指定することが分かります。
ありがとうございます。
文字列式とありました。
今後は公式のヘルプを何度も読み直し、しっかりと確認いたします。
>どこで調べたか分かりませんが、それはあきらかに間違いですね。
今回のエラーに関して様々な質問板等を見ているときに、DLookup (Expr, Domain, Criteria)ではExprの部分は""で囲まなくてOKです!と書いてあったので、お恥ずかしくも鵜吞みにしておりました。。。
また、きめ細やかなご解説本当に有難うございます。
リンクまで貼って下さり有難うございます。
拝見しました。
素人のわたくしにも理解できるように、詳しくご解説してくださっているので、
とても分かりやすく、勉強になりました。
重ね重ね御礼申し上げます。
まずは公式のヘルプで確認しましょう。
Application.DLookup メソッド (Access) | Microsoft Docs
これによると引数はすべて文字列で指定することが分かります。
>「"入数"」については「"」を付けなくてもよいという記述もあり、まだ理解できておりません。
どこで調べたか分かりませんが、それはあきらかに間違いですね。
第3引数は、抽出条件式を文字列として指定します。
具体的にはクエリのSQL文のWhere句に設定する条件式になります。
例えば 仕入先IDが 1、仕入商品IDが 2 のものを抽出するとき、SQLでは下記のようになります。
(SQLが分からなければ、デザインビューで条件を設定してからSQLビューにすれば確認できます。)
これをDLookupに変換すると、下記のようになります。
1 と 2 の部分は固定値ではなく、フォームのテキストボックスの値を参照することになるので、文字列の外に出して、
この固定値の部分をコントロール参照式に変更します。
ここで注意することは、DLookup関数の第3引数に設定するのはSQLの条件式ということです。
SQLとVBAは似ていますが、まったく別のものだということを意識してください。
VBAとSQLでも文字列の扱いの違いは、下記で詳しく解説していますので、ご参考に。
Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips
hatena 様
お忙しい中大変ご丁寧にありがとうございました。
お教え下さった通りに変更しましたところ、
無事、成功しました。
お教えくださった内容をもとに、何が間違えていたのかを調べました。
正解か分かりかねますが、変数を扱いたいにもかかわらず、お教え下さった下記のように
入数 = DLookup("入数", "UQ仕入商品一覧", "仕入先ID = " & Forms![F仕入入力]![仕入先ID] & " And 仕入商品ID = " & [仕入商品ID])
「"入数"」と「" & Forms![F仕入入力]![仕入先ID] & " 」としていなかったことについて調べました。
「"入数"」については「"」を付けなくてもよいという記述もあり、まだ理解できておりません。
継続して調べてまいります。
「" & Forms![F仕入入力]![仕入先ID] & " 」については、変数を扱うにおいては「"&変数&"」としなければならないとの結論に至りました。(正解か不明ですが…)
色々と調べていたものの、一週間ほど悩んでおりましたので、解決して一安心しております。
本当に有難うございました。
りんご 様
お忙しい中大変ご丁寧にありがとうございました。
>抽出条件無しでの動作確認、単独条件での動作確認、パラメータの代わりに適当な値を入れて動作確認はどうでしたか?
抽出条件無での動作確認は問題ございませんでした。
また、単独条件での動作確認ですが、仕入商品ID(オートナンバー型)を単独条件としたところ、本来導き出したい数値とは異なるものが代入されました。
わたくしの勝手な推測なのですが、仕入商品ID(オートナンバー型)は仕入先ID各社の仕入商品テーブルがあり、仕入商品ID(オートナンバー型)が重複するため、別のものを代入しているのではないかと考えます。
パラメータの代わりにダイレクトに仕入先IDを3仕入商品IDを3として動作してみたところ、
いずれも「エラー13 型が一致しません」となりました。
わたくしの式の書き方が悪いことが原因と思います。(恥ずかしながら、調べながら利用している素人です)
下記3通り試しました。
入数 = DLookup(入数, "UQ仕入商品一覧", "仕入先ID = 3" And "[仕入商品ID] = 3")
入数 = DLookup(入数, "UQ仕入商品一覧", "[仕入先ID] = 3" And "[仕入商品ID] = 3")
入数 = DLookup(入数, "UQ仕入商品一覧", "Forms![F仕入入力]!仕入先ID = 3" And "[仕入商品ID] = 3")
>念の為、コンボボックスについても確認です。仕入先IDや仕入商品IDですが、1列目ならば連結列は1、2列目ならば連結列は2となっていますか?
プロパティシートにて連結列確認いたしました。
連結列はコンボボックスすべてにおいて「1」でした。
>念の為、仕入先IDや仕入商品IDについても確認です。オートナンバー型との事ですか、0001、0002、0003みたいな感じではないですよね?実はNULLもあったり、なんてことはないですよね?
仕入先IDと仕入商品IDは頭に0等は入らず全て整数の「1.2.3…」となっております。
またNULLはございません。
全てのIDには必ず整数が入るようにしております。
hatena様から教えていただきました通りに変更したところ、入数には正しい数値が代入されました。
とりあえずエラーの行を下記のように変更してみてください。
これはAccessの仕様なのでどうすることもできません。
これ以外の方法を考えることになると思います。
詳細は不明なのでアイデアだけになりますが、
列固定のクロス集計クエリならサブレポートに使えるので、VBAでクエリのSQLを修正するようにするとか。
サブレポートは使わずに、レポートのグループ化の機能でなんとかするとか。
など。
団体コードに戻してみたり、団体コード2に変更してみたりするとどうなりますか?
DLookup、正直苦手なのでしっかり回答出来ないのですが、追加情報があればいいかもと。
抽出条件無しでの動作確認、単独条件での動作確認、パラメータの代わりに適当な値を入れて動作確認はどうでしたか?パラメータの参照は想定通り?(仕入商品IDが何処を参照する事になるのか誰か解説して欲しい。)
念の為、コンボボックスについても確認です。仕入先IDや仕入商品IDですが、1列目ならば連結列は1、2列目ならば連結列は2となっていますか?
念の為、仕入先IDや仕入商品IDについても確認です。オートナンバー型との事ですか、0001、0002、0003みたいな感じではないですよね?実はNULLもあったり、なんてことはないですよね?
投稿者です。
あまりにも拙い説明で、非常に分かりにくいかと存じます。
明日改めて、各種画像を添付致しますので、何卒、ご教授のほど、よろしくお願い申し上げます。
テキストボックスの高さをフォントに合わせたいということでしょうか。
デザインビューでテキストボックスを右クリックで[サイズ変更]→[自動調整]でどうでしょう。
良く見たらUTF-8(BOMなし)のASCIIのみのファイルでした。お騒がせしましてすみません。
零細寄りの中小だと取引先がOffice2010以前とかザラなので365の新関数とか使う気が起きないしPowerQueryのファイル集計すら使えないことがある
EmotetみたいなこともあるのでExcelはVBA一切使わずデータ加工を段階ごとに山盛りの非表示シート連鎖させてPivotテーブルまでの機能で似非アプリ化しても元々のデータモデルの認識が間違ってなければ何とかなってしまう
Accessはランタイムでちゃんと動くようエラー処理すれば非常にコスパの良いローコード開発環境(ただしDXとは真逆)
「販売管理システムで学ぶモデリング講座」の目次
教えていただいた方法を試したところ、hatena様の方法で解決できました。
お二人ともありがとうございました。
回答有り難う御座います。なるほど改行コードでもsplitで分割出来るのですね。試みてみます。。
hatena 様
ありがとうございます。
やはりおっしゃるようなテーブルである必要がありますか。
提示していただいたテーブルでなら進めれそうだったのですが、入力時に横方向に入力したいなと思っており悩んでました。
フォームの設計もしくはvbaでのコピペか、悩んでみます。
お忙しいところ相談乗っていただき、ありがとうございました。
まずテーブルがデータベース的な設計になってません。
「正規化」すべきです。具体的には下記のようなテーブル設計にします。
T_予定表
このようなテーブルならクロス集計クエリでご希望の形に簡単に変換できます。クロス集計ウィザードでやってみてください。
このようなテーブルでは入力しにくいという場合は、フォームの設計を工夫して入力しやすいようにします。
メインサブフォーム形式にする場合が多いですね。
あるいは入力用に提示のテーブルを作成しておいて、それでフォームを作成し入力してVBAで上記の正規化されたテーブルに転記するという設計にしてもいいでしょう。
VBAコードをLibreOffice・Writerに貼り付け、文字の置換でできました。ありがとうございました。
>> 13
>> 16
>> 17
しかし、よくよく見れば、DMinで対応出来ているのでそんな事にはならなかった。
すみません、視野が狭くなって勘違いしてました。
りんご様、hatena様、
ありがとうございます。今日はできないので、後で双方のやり方で試してみてまた結果をご報告します。
同姓同名の問題か、転籍等により出向元が変わる場合のことを仰られているのでしょうか。
転籍の場合、手続き上、退職をして入社をするので、氏名が同じでも社員コードが変わり別人格となります。
運用上は、同姓同名の問題もありますので、氏名ではく社員コードで管理をしますので、SQLは読み替えています。
ですので、上記フラグは0で良いです。
レポートの方で「グループ化、並べ替え」の設定をしているとクエリの並べ替えは無視されます。
現状、Numフィールドでグループ化されていますので、その下に「時間」フィールドでの並べ替えを追加してみてください。
上記の「並べ替えの追加」をクリックして「時間」フィールドを選択すればOKです。
データのテキストボックス txtData
4つのテキストボックス txt1, txt2, txt3. txt4
として、
Split 関数 (Visual Basic for Applications) | Microsoft Docs
試していませんが、誤魔化せるかもしれません。
時間1のテキストボックスをフッターに移動すると成功したりしませんか?運が良ければたまたま希望通りになるかも。
根本的な対応は表示順みたいなフィールドが必要になりそうですが、そこまでするのもあまり好きではないんですよねぇ。
りんご様
ありがとうございます。コメントを受けて再確認したところ、レコードソースは間違いなくクエリになっています。
そして今気づいた点ですが、クエリを直接実行すると同日付の中で時間できちんとソートになっています。これがレポートになると時間がバラバラになってしまっています。
>> 14
>> 9
SQLは苦手です。メモさせて下さい。
原本と原本コピーがあり、原本の開始日をマイナス1、原本コピーの終了日と突合してみたり、原本の終了日をプラス1、原本コピーの開始日と突合してみたり。最終的に左外部結合。原本は一致レコードと不一致レコード、原本コピーは一致レコードとNullレコード。
そして「T2.終了日 Is Null」と「T3.開始日 Is Null」の部分で不一致クエリ。空欄、先頭の開始日、最後の終了日もひっくるめて判定。
氏名あああの場合、空欄の不一致判定を除外する為に、「And Not (T1.開始日 Is Null」と「And Not (T2.終了日 Is Null」が必要。
氏名いいいの場合、先頭の開始日と最後の終了日の不一致判定を除外する為に、「And Not (…T1.開始日 = DMin」と「And Not (…T2.終了日 = DMax」が必要。
念の為に確認ですが、クエリを開いて時間でソートをかけると時間順になるけど、レポートのレコードソースに設定して、記事のように組んで横並びにするとソートなしのレコード順になる、という事でしょうか?うっかり、テーブルをレポートのレコードソースに設定していたりしませんか?
すみません、クエリをデザインで開くと(T1.開始日-1=T2.終了日) この部分が消えてしまう?んですかね。
上記のあやまったフラグは出なくなりました。
細かいチェックがまだできていませんが、こちらで恐らく大丈夫なような気がします。
どうもありがとうございました。
厳密なチェックを要するものではありませんので、
hatenaさまのSQLを利用させていただいております。
1点だけ要件を加えさせていただいております。
T1からT2, T3に外部結合する際、氏名、出向元、出向先フィールで結合をするように修正し、
重複レコードが作られるので、Distinctをしております。
演算フィールドのDMin条件には、氏名、出向元、出向先が一対するものと修正いたしました。
データシートは表示できるのですが、あいまいな外部結合が含まれるため、SQLが表示されません。
元データ
| 氏名 | 出向元 |出向先 | 兼務率 |開始日 | 終了日 |
| -------- | -------- | -------- | -------- | -------- | -------- |
| サンプル | AAA | あああ | 50% | 2017/1/1 | 2022/3/31|
| サンプル | AAA | ううう | 50% | 2017/1/1 | 2022/3/31|
| サンプル | AAA | いいい | 0% | 2021/12/1| 2022/3/31|
| サンプル | AAA | ううう | 100% | 2022/4/1 | |
| サンプル | AAA | あああ | 0% | 2022/4/1 | |
SQL実行結果
| 氏名 | 出向元 |出向先 | 兼務率 |開始日 |終了日 | 開始フラグ |終了フラグ|
| -------- | -------- | --------| ---- | -------- | -------- | -------- | -------- |
| サンプル | AAA | あああ | 50% | 2017/1/1 | 2022/3/31 | 0 | 0 |
| サンプル | AAA | ううう | 50% | 2017/1/1 | 2022/3/31 | 0 | 0 |
| サンプル | AAA | いいい | 0% | 2021/12/1| 2022/3/31 | 0 | 0 |
| サンプル | AAA | ううう | 100% | 2022/4/1 | | 0 | 0 |
| サンプル | AAA | ううう | 100% | 2022/4/1 | | -1 | 0 |
| サンプル | AAA | あああ | 0% | 2022/4/1 | | 0 | 0 |
本来、エラーがでないはずなのですが、下から、2行目の重複レコードが生じ、開始日非連続にフラグが立ちます。
原因がよく分からず、よろしくお願いいたします。
ご回答いただきありがとうございました。
他のシステムに入れるため、うまく連携できそうな方でやってみます。
レポートでの出力でいいのなら、下記で紹介している方法もいいでしょう。
下記のようにグループ内連番の列を追加すればクロス集計クエリでできます。
連番は下記で紹介している方法をどれかを使えばいいでしょう。
みなさま
申し訳ございません。忙殺されていまして、確認が遅くなりました。
アドバイスを試してみて、後程フィードバックさせていただきます。
ひとまずご連絡まで。
そういう表ってできましたっけ…?
クロス集計なら、たとえば
のような表はできますが、それだとダメでしょうか?
バッチリうまくいきました。大変助かりました。
似たようなコードで一度実行していたのですが、(?)
引数のエラーが出ていました。
「Cancel = True」というのが必要だったのですよね。
ありがとうございました。
レポートの幅が印刷範囲幅より大きいのではないでしょうか。
デザインビューでレポートの幅を、[用紙幅]-[左右余白]より小さくしてみてください。
DoCmd.OpenReport "R_ラベル印刷", acViewPreview
の前に、
On Error Resume Next
を挿入するといいでしょう。
タブコントロールは見た目は入れ子になってますが、オブジェクトの構造には何も影響ありません。フォームの関係性だけ気を付けてコードを組めばいいです
「ボタン」がメインフォーム側にある場合
「ボタン」がサブフォーム側にある場合
お返事ありがとうございます。
私個人としては Access, Excel, VBA でたいていのことはできると思っていますが、
ローコード、ノーコードの流行の中でITに明るい事務員から質問されて困ったり、
ITに明るい事務員がささっと作ったもののほうが丁寧に開発した Access に優ったり
ということが起こらないか気になり聞かせてもらいました。
私も「マスターするほど勉強しな」さそうですが、
しかし可能性を把握できるところまで掘り下げたいとは思っています。
キャリアプランの件おっしゃるとおりですね。
身の振り方は悩ましいところですが……