Microsoft Access 掲示板

6,616 件中 2,921 から 2,960 までを表示しています。
2
onigiri 2022/05/02 (月) 06:21:24 6b95a@b56e4

hatena様

返信ありがとうございます。また、遅くなりすみません。
>>仕様
ありがとうございます。
またアイデアありがとうございました。検討してみます!

7

hatena 様

>まずは公式のヘルプで確認しましょう。
これによると引数はすべて文字列で指定することが分かります。

ありがとうございます。
文字列式とありました。
今後は公式のヘルプを何度も読み直し、しっかりと確認いたします。

>どこで調べたか分かりませんが、それはあきらかに間違いですね。

今回のエラーに関して様々な質問板等を見ているときに、DLookup (Expr, Domain, Criteria)ではExprの部分は""で囲まなくてOKです!と書いてあったので、お恥ずかしくも鵜吞みにしておりました。。。

また、きめ細やかなご解説本当に有難うございます。
リンクまで貼って下さり有難うございます。
拝見しました。
素人のわたくしにも理解できるように、詳しくご解説してくださっているので、
とても分かりやすく、勉強になりました。

重ね重ね御礼申し上げます。

6

まずは公式のヘルプで確認しましょう。

Application.DLookup メソッド (Access) | Microsoft Docs

これによると引数はすべて文字列で指定することが分かります。

>「"入数"」については「"」を付けなくてもよいという記述もあり、まだ理解できておりません。

どこで調べたか分かりませんが、それはあきらかに間違いですね。

第3引数は、抽出条件式を文字列として指定します。
具体的にはクエリのSQL文のWhere句に設定する条件式になります。
例えば 仕入先IDが 1、仕入商品IDが 2 のものを抽出するとき、SQLでは下記のようになります。
(SQLが分からなければ、デザインビューで条件を設定してからSQLビューにすれば確認できます。)

SELECT 入数 FROM UQ仕入商品一覧
WHERE 仕入先ID = 1 And 仕入商品ID = 2;

これをDLookupに変換すると、下記のようになります。

DLookup("入数", "UQ仕入商品一覧", "仕入先ID = 1 And 仕入商品ID = 2")

1 と 2 の部分は固定値ではなく、フォームのテキストボックスの値を参照することになるので、文字列の外に出して、

DLookup("入数", "UQ仕入商品一覧", "仕入先ID = " & 1 & " And 仕入商品ID = " & 2)

この固定値の部分をコントロール参照式に変更します。

DLookup("入数", "UQ仕入商品一覧", "仕入先ID = " & Forms![F仕入入力]![仕入先ID] & " And 仕入商品ID = " & [仕入商品ID])

ここで注意することは、DLookup関数の第3引数に設定するのはSQLの条件式ということです。
SQLとVBAは似ていますが、まったく別のものだということを意識してください。

VBAとSQLでも文字列の扱いの違いは、下記で詳しく解説していますので、ご参考に。

Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips

5
AFA 2022/04/29 (金) 15:46:11 修正 9c318@fac4f >> 3

hatena 様

お忙しい中大変ご丁寧にありがとうございました。

お教え下さった通りに変更しましたところ、
無事、成功しました。
お教えくださった内容をもとに、何が間違えていたのかを調べました。
正解か分かりかねますが、変数を扱いたいにもかかわらず、お教え下さった下記のように
入数 = DLookup("入数", "UQ仕入商品一覧", "仕入先ID = " & Forms![F仕入入力]![仕入先ID] & " And 仕入商品ID = " & [仕入商品ID])

「"入数"」と「" & Forms![F仕入入力]![仕入先ID] & " 」としていなかったことについて調べました。

「"入数"」については「"」を付けなくてもよいという記述もあり、まだ理解できておりません。
継続して調べてまいります。
「" & Forms![F仕入入力]![仕入先ID] & " 」については、変数を扱うにおいては「"&変数&"」としなければならないとの結論に至りました。(正解か不明ですが…)

色々と調べていたものの、一週間ほど悩んでおりましたので、解決して一安心しております。
本当に有難うございました。

4

りんご 様

お忙しい中大変ご丁寧にありがとうございました。

>抽出条件無しでの動作確認、単独条件での動作確認、パラメータの代わりに適当な値を入れて動作確認はどうでしたか?

抽出条件無での動作確認は問題ございませんでした。
また、単独条件での動作確認ですが、仕入商品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様から教えていただきました通りに変更したところ、入数には正しい数値が代入されました。

3

とりあえずエラーの行を下記のように変更してみてください。

入数 = DLookup("入数", "UQ仕入商品一覧", "仕入先ID = " & Forms![F仕入入力]![仕入先ID] & " And 仕入商品ID = " & [仕入商品ID])
1

「パススルークエリまたは非固定列のクロス集計クエリを、サブフォームまたはサブレポートのレコードソースとして使うことはできません。」

これはAccessの仕様なのでどうすることもできません。
これ以外の方法を考えることになると思います。

詳細は不明なのでアイデアだけになりますが、

列固定のクロス集計クエリならサブレポートに使えるので、VBAでクエリのSQLを修正するようにするとか。

サブレポートは使わずに、レポートのグループ化の機能でなんとかするとか。

など。

1
りんご 2022/04/29 (金) 01:50:28 c564b@0e907

 団体コードに戻してみたり、団体コード2に変更してみたりするとどうなりますか?

2
りんご 2022/04/29 (金) 01:44:26 c564b@0e907

 DLookup、正直苦手なのでしっかり回答出来ないのですが、追加情報があればいいかもと。
 抽出条件無しでの動作確認、単独条件での動作確認、パラメータの代わりに適当な値を入れて動作確認はどうでしたか?パラメータの参照は想定通り?(仕入商品IDが何処を参照する事になるのか誰か解説して欲しい。)
 念の為、コンボボックスについても確認です。仕入先IDや仕入商品IDですが、1列目ならば連結列は1、2列目ならば連結列は2となっていますか?
 念の為、仕入先IDや仕入商品IDについても確認です。オートナンバー型との事ですか、0001、0002、0003みたいな感じではないですよね?実はNULLもあったり、なんてことはないですよね?

1

投稿者です。
あまりにも拙い説明で、非常に分かりにくいかと存じます。
明日改めて、各種画像を添付致しますので、何卒、ご教授のほど、よろしくお願い申し上げます。

1

テキストボックスの高さをフォントに合わせたいということでしょうか。
デザインビューでテキストボックスを右クリックで[サイズ変更]→[自動調整]でどうでしょう。

1

良く見たらUTF-8(BOMなし)のASCIIのみのファイルでした。お騒がせしましてすみません。

3
MM 2022/04/20 (水) 18:35:10 a09a0@fd03f

零細寄りの中小だと取引先がOffice2010以前とかザラなので365の新関数とか使う気が起きないしPowerQueryのファイル集計すら使えないことがある
EmotetみたいなこともあるのでExcelはVBA一切使わずデータ加工を段階ごとに山盛りの非表示シート連鎖させてPivotテーブルまでの機能で似非アプリ化しても元々のデータモデルの認識が間違ってなければ何とかなってしまう
Accessはランタイムでちゃんと動くようエラー処理すれば非常にコスパの良いローコード開発環境(ただしDXとは真逆)

6
asanoha 2022/04/19 (火) 11:10:30 7b80f@a8759 >> 5

教えていただいた方法を試したところ、hatena様の方法で解決できました。
お二人ともありがとうございました。

2
RYU 2022/04/18 (月) 21:51:31 7ec02@7404d

回答有り難う御座います。なるほど改行コードでもsplitで分割出来るのですね。試みてみます。。

2
tarou 2022/04/18 (月) 16:39:29 40166@7cc49

hatena 様

ありがとうございます。
やはりおっしゃるようなテーブルである必要がありますか。
提示していただいたテーブルでなら進めれそうだったのですが、入力時に横方向に入力したいなと思っており悩んでました。

フォームの設計もしくはvbaでのコピペか、悩んでみます。
お忙しいところ相談乗っていただき、ありがとうございました。

1

まずテーブルがデータベース的な設計になってません。
「正規化」すべきです。具体的には下記のようなテーブル設計にします。

T_予定表

行程日付
作業12022/4/1
作業12022/4/2
作業12022/4/3
作業12022/4/4
作業12022/4/5
作業12022/4/6
作業22022/4/1
作業32022/4/3
作業42022/4/5

このようなテーブルならクロス集計クエリでご希望の形に簡単に変換できます。クロス集計ウィザードでやってみてください。

このようなテーブルでは入力しにくいという場合は、フォームの設計を工夫して入力しやすいようにします。
メインサブフォーム形式にする場合が多いですね。

あるいは入力用に提示のテーブルを作成しておいて、それでフォームを作成し入力してVBAで上記の正規化されたテーブルに転記するという設計にしてもいいでしょう。

1
あん 2022/04/18 (月) 15:40:11 15cfb@8fdd6

VBAコードをLibreOffice・Writerに貼り付け、文字の置換でできました。ありがとうございました。

18
りんご 2022/04/18 (月) 13:24:13 c564b@0e907

>> 13
>> 16
>> 17

T1からT2, T3に外部結合する際、氏名、出向元、出向先フィールで結合をするように修正し、
 
 出向元フィールドが結合条件に必要か否か気になってしまい、エラー判定が上手く出来ない場合があるかもと思っていました。

演算フィールドのDMin条件には、氏名、出向元、出向先が一対するものと修正いたしました。

 しかし、よくよく見れば、DMinで対応出来ているのでそんな事にはならなかった。

 すみません、視野が狭くなって勘違いしてました。

5
asanoha 2022/04/18 (月) 12:18:45 7b80f@dc688

りんご様、hatena様、
ありがとうございます。今日はできないので、後で双方のやり方で試してみてまた結果をご報告します。

17
もっちー 2022/04/18 (月) 09:23:02 d73a2@c8d31

同姓同名の問題か、転籍等により出向元が変わる場合のことを仰られているのでしょうか。
転籍の場合、手続き上、退職をして入社をするので、氏名が同じでも社員コードが変わり別人格となります。
運用上は、同姓同名の問題もありますので、氏名ではく社員コードで管理をしますので、SQLは読み替えています。
ですので、上記フラグは0で良いです。

4

レポートの方で「グループ化、並べ替え」の設定をしているとクエリの並べ替えは無視されます。
現状、Numフィールドでグループ化されていますので、その下に「時間」フィールドでの並べ替えを追加してみてください。

画像1

上記の「並べ替えの追加」をクリックして「時間」フィールドを選択すればOKです。

1

データのテキストボックス txtData
4つのテキストボックス txt1, txt2, txt3. txt4
として、

Dim aryData
aryData = Split(Me.txtDXata.Value, Chr(13))
Me.txt1.Value = aryData(0)
Me.txt2.Value = aryData(1)
Me.txt3.Value = aryData(2)
Me.txt4.Value = aryData(3)

Split 関数 (Visual Basic for Applications) | Microsoft Docs

3
りんご 2022/04/17 (日) 15:51:07 c564b@0e907

 試していませんが、誤魔化せるかもしれません。

詳細(非表示)に時間1、時間2、予定内容のテキストボックスを配置
 フッターにtxt_日付、txt_予定のテキストボックスを配置

 時間1のテキストボックスをフッターに移動すると成功したりしませんか?運が良ければたまたま希望通りになるかも。
 根本的な対応は表示順みたいなフィールドが必要になりそうですが、そこまでするのもあまり好きではないんですよねぇ。

2
asanoha 2022/04/17 (日) 12:26:59 f6d42@a8759 >> 1

りんご様
ありがとうございます。コメントを受けて再確認したところ、レコードソースは間違いなくクエリになっています。
そして今気づいた点ですが、クエリを直接実行すると同日付の中で時間できちんとソートになっています。これがレポートになると時間がバラバラになってしまっています。

16
りんご 2022/04/16 (土) 03:26:31 c564b@0e907

>> 14

細かいチェックがまだできていませんが、こちらで恐らく大丈夫なような気がします。

氏名出向元出向先開始日終了日開始フラグ終了フラグ
りんごAAA店舗12019/4/12020/3/3100
りんごAAA店舗12020/4/12021/3/310?
りんごBBB店舗12021/4/12022/3/31?0
15
りんご 2022/04/16 (土) 03:15:30 c564b@0e907

>> 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」が必要。

1
りんご 2022/04/15 (金) 22:18:41 c564b@0e907

この時に、時間1の早いものを先に、遅いものを後に配置したいのですが、レポートのレコードソースとなるクエリで時間でソートをかけても、時間順になりません。

 念の為に確認ですが、クエリを開いて時間でソートをかけると時間順になるけど、レポートのレコードソースに設定して、記事のように組んで横並びにするとソートなしのレコード順になる、という事でしょうか?うっかり、テーブルをレポートのレコードソースに設定していたりしませんか?

14
もっちー 2022/04/15 (金) 16:08:18 d73a2@c8d31

すみません、クエリをデザインで開くと(T1.開始日-1=T2.終了日) この部分が消えてしまう?んですかね。
上記のあやまったフラグは出なくなりました。

細かいチェックがまだできていませんが、こちらで恐らく大丈夫なような気がします。

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

13
もっちー 2022/04/15 (金) 12:57:04 9a1c9@94ff5

厳密なチェックを要するものではありませんので、
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行目の重複レコードが生じ、開始日非連続にフラグが立ちます。

原因がよく分からず、よろしくお願いいたします。

4
maimai 2022/04/15 (金) 11:42:56

ご回答いただきありがとうございました。
他のシステムに入れるため、うまく連携できそうな方でやってみます。

3

レポートでの出力でいいのなら、下記で紹介している方法もいいでしょう。

グループ化したレコードを横に展開する
下記のテーブルを、 Tbl1 IDフィールド1フィールド2 1 あ A 2 あ B 3 あ C 4 あ D 5 い E 6 い F 下記のように表示したい。 というような質問がありました。フィールド1でグループ化して、詳細を横3列で改段する、という仕様になりますね。 難易度:...
fc2

2

下記のようにグループ内連番の列を追加すればクロス集計クエリでできます。

名前担当連番
太郎a1
太郎b2
三郎b1
三郎c2

連番は下記で紹介している方法をどれかを使えばいいでしょう。

グループ毎連番を自動入力する関数
クエリで連番を表示する場合、DCount関数やサブクエリを利用する方法はあちこちで紹介されています。 しかし、この方法は自分より前のレコード件数をカウントするというロジックなのでレコード件数が多くなると幾何級数的に重くなります。また、グループ毎に連番を振るという仕様になると、条件式も複雑になってきます。 クエリは使わずにテーブルに連番フィールドを持たせて、そこに VBA で連番を書きこむようにすると高速...
fc2

11
もっちー 2022/04/14 (木) 21:55:18 2acb4@c8d31

みなさま

申し訳ございません。忙殺されていまして、確認が遅くなりました。
アドバイスを試してみて、後程フィードバックさせていただきます。

ひとまずご連絡まで。

1
名前なし 2022/04/14 (木) 18:09:37 97624@b7503

そういう表ってできましたっけ…?
クロス集計なら、たとえば

名前abc
太郎
三郎

のような表はできますが、それだとダメでしょうか?

2
ポンタ 2022/04/12 (火) 16:14:30 61d91@7c0be >> 1

バッチリうまくいきました。大変助かりました。
似たようなコードで一度実行していたのですが、(?)
引数のエラーが出ていました。
「Cancel = True」というのが必要だったのですよね。
ありがとうございました。

1

①「一部のデータが表示されません。」←プリンタからの警告?通常は無視してOKしています。

レポートの幅が印刷範囲幅より大きいのではないでしょうか。
デザインビューでレポートの幅を、[用紙幅]-[左右余白]より小さくしてみてください。

⇒ここで、キャンセルを押すと「実行時エラー2501 OpenReportアクションの実行は取り消されました」と表示されます。

    DoCmd.OpenReport "R_ラベル印刷", acViewPreview
の前に、
    On Error Resume Next
を挿入するといいでしょう。

②「印刷開始位置を入力してください…」
⇒ここでキャンセルを押しても、OKを押したときと同様レポート画面に進んでしまいます。

①②でキャンセルボタンを押した際、キャンセルできるようにするにはどうすればよいでしょうか。

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
1
hiroton 2022/04/12 (火) 08:11:27 14b27@f966d

タブコントロールは見た目は入れ子になってますが、オブジェクトの構造には何も影響ありません。フォームの関係性だけ気を付けてコードを組めばいいです

「ボタン」がメインフォーム側にある場合

Me!メインフォームのテキストボックス = Me!サブフォーム.Form!サブフォームのテキストボックス

「ボタン」がサブフォーム側にある場合

Me.Parent!メインフォームのテキストボックス = Me!サブフォームのテキストボックス
2
lllll 2022/04/11 (月) 19:57:13 2bcc3@46510

お返事ありがとうございます。

私個人としては Access, Excel, VBA でたいていのことはできると思っていますが、
ローコード、ノーコードの流行の中でITに明るい事務員から質問されて困ったり、
ITに明るい事務員がささっと作ったもののほうが丁寧に開発した Access に優ったり
ということが起こらないか気になり聞かせてもらいました。

私も「マスターするほど勉強しな」さそうですが、
しかし可能性を把握できるところまで掘り下げたいとは思っています。

キャリアプランの件おっしゃるとおりですね。
身の振り方は悩ましいところですが……