Microsoft Access 掲示板

views
4 フォロー
6,283 件中 2,601 から 2,640 までを表示しています。
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 に優ったり
ということが起こらないか気になり聞かせてもらいました。

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

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

2
nanana 2022/04/11 (月) 16:03:13 e48ae@6eb0c

お世話になります。
別業務が多忙となり随分時間がたってしまいました。申し訳ございません。

りんご様、ありがとうございます!
やりたいことが完璧にできました!
こちらのサイトには非常にお世話になっています。
いつも的確なご回答非常に感謝致します。

10

hirotonさんが厳密なエラー例を出してますが、
上記のクエリは、このなかの、2. 3. 6. 7. はエラーになりません。

すべてのエラーに対応するなら、hirotonさん同様VBAを検討しますね。

9

とりあえず下記でどうでしょう。

SELECT T1.*,
 T2.終了日 Is Null And
 Not (T1.開始日 Is Null OR T1.開始日=DMin("開始日","テーブル1","氏名='" & T1.氏名 & "'")) AS 開始日非連続,
 T3.開始日 Is Null And
 Not (T1.終了日 Is Null OR T1.終了日=DMin("終了日","テーブル1","氏名='" & T1.氏名 & "'")) AS 終了日非連続
FROM
 (テーブル1 AS T1 LEFT JOIN テーブル1 AS T2 ON (T1.開始日-1=T2.終了日) AND (T1.氏名=T2.氏名))
 LEFT JOIN テーブル1 AS T3 ON (T1.終了日+1=T3.開始日) AND (T1.氏名=T3.氏名);

出力結果例

ID氏名会社所属開始日終了日開始日非連続終了日非連続
1あああxxxxx経理2000/12/3100
2あああzzzzz人事2001/01/012010/03/310-1
3あああttttt総務2010/04/022018/08/31-10
4あああxxxxx経理2018/09/012020/03/3100
5あああxxxxx人事2020/04/0100
6いいいxxxxx営業2010/04/012019/01/3100
7いいいxxxxx経理2019/02/012022/03/3100
8いいいxxxxx人事2022/04/012022/05/3100

ただし上記のクエリは更新不可になりますので、
この結果を見ながらテーブルを修正することになります。

8
hiroton 2022/04/11 (月) 15:01:56 2eeb4@f966d

「氏名」だけのチェックでいいのであれば AND T1.会社=T2.会社を削除すればいいです。そもそも「氏名」「会社」の判定部分は本題とはずれた話ですね。同姓同名問題があるので破綻します。「個人」を特定するためにユニークなキーを設定しましょう


日付で起こりうるエラー

  1. 開始日・終了日共に未入力のデータがある(同一人物すべてのレコードが正しいとは言えなくなる
  2. 開始日が、未入力、かつ、それ以前のデータがある
  3. 終了日が、未入力、かつ、それ以降のデータがある
  4. 最初でないレコードで開始日の前日の終了日がない
  5. 最後でないレコードで終了日の翌日の終了日がない
  6. 開始日が、別なレコードの開始日から終了日(未入力含む)の間にある
  7. 終了日が、別なレコードの開始日(未入力含む)から終了日の間にある

エラーとはどのようなデータのことなのか明確にしてhatenaさんが提示したようなSQLを作ってつなげればいいと思いますよ

SQLでやると起こりうるエラー毎にテーブルの参照が必要になるんでhirotonならVBAでエラーレコードの拾い出しにしそうですけどね

7
もっちー 2022/04/11 (月) 11:32:06 d73a2@c8d31

アドレスありがとうございます。

サンプルはエラーの発生が無い想定でおだししています。

実データが、終了日4/10日、次の開始日4/12日だった場合、どらのレコードもエラーとしたいです。
正しいデータはいくつかの可能性がありますが、そこは気にせず、単につながりがないレコードを抽出し、
人間が確認をして、正しいデータに修正をすることで、結果、エラーが回避されれば良いと考えています。

運用面で、9999/12/31を使うとか、複合キーの設定も検討はしてみたいと思います。

1
りんご 2022/04/10 (日) 10:38:42 c564b@0e907

趣味で遊んでいるだけなのであれですが。

Excel の Power Query, M言語, Power Pivot はマスターしてらっしゃるでしょうか。

リレーションシップなんやらでExcelの加工・整形をやりたいわけではないので、マスターするほど勉強しないと思います。

MS はもう VB(A) を進化させる気が無いそうですが、Python や M 言語などをやらないとおしまいなのでしょうか。

キャリアプランに沿って、必要なものを取り入れていくだけではないでしょうか。

6
りんご 2022/04/10 (日) 04:25:26 c564b@0e907

日付がつながっていないようなエラー

 終了したら翌日には開始、空白が生じたらエラーという事でしょうか。例えば、終了日4/10日、次の開始日4/12日の場合、どちらをエラーと判定するのでしょう。正しくは、終了日4/11日、次の開始日4/12日、それとも、終了日4/10日、次の開始日4/11。あるいは、終了日と開始日、どちらもエラーなんてことも。

現在継続している場合は、終了日がない

 9999/12/31で登録しておくとか。

サンプルでは、人ごとに会社ごとに日付がつながっている状態ですが、

 氏名と開始日に複合主キーを設定して、登録の仕組みを整えるといいかも。

5
りんご 2022/04/10 (日) 03:33:08 c564b@0e907 >> 4

試していませんが、氏名と開始日で外部結合すれば、会社違いのエラー判定を回避できるのかも。

4
もっちー 2022/04/08 (金) 17:56:53 d73a2@c8d31

| 氏名    | 会社    | 所属 | 開始日   | 終了日   |
| ううう  |   ZZZZZ  | 法務 | 2020/4/1 | 2021/3/31 |
| ううう  |   TTTTT  | 法務 | 2021/4/1 | 2022/3/31 |
| ううう  |   EEEEE  | 法務 | 2022/4/1 |   NULL   |

試したところ、なかなかうまく判定ができていません。
例えば、こんなケースもありまして、これはエラーではないと判断したいです。
出向等をして、1レコードで完結している場合など。

よろしくお願いいたします。

2
もっちー 2022/04/07 (木) 22:45:27 2acb4@c8d31

hatena様

なるほど、開始日の1日前の終了日が存在しないという条件で判定をするのですか。

どうもありがとうございます。明日、早速試してみます。

1

下記のSQLで 開始日の1日前の終了日が存在しない場合、チェックが True になります。

SELECT T1.*, T2.終了日 IS NULL AS チェック
FROM テーブル1 AS T1 LEFT JOIN テーブル1 AS T2
 ON T1.氏名=T2.氏名 AND T1.会社=T2.会社 AND T1.開始日-1=T2.終了日;
1

コマンド自体をDim***で変数宣言してそれを使うことは可能でしょうか?

コマンドを変数にすることはできません。プロシージャとして宣言しておいて、そのプロシージャを呼び出すようにします。

Sub Main()
    If 条件 Then
        Command1
    End If
End Sub

Sub Command1()
    'コマンドを記述
    MsgBox "Command1"
End Sub

またフルパスの記述も変数にして使うことは可能でしょうか?

可能です。
というかなぜ、変数にできないと思ったのか自体が不思議です。

具体的なコードを提示してどのように困っているかの説明をお願いします。

6
ピース 2022/04/06 (水) 16:15:38 ddfe5@b32f8

色々とアドバイスありがとうございました。大変参考になりました。
まずShell関数でexcel.exe のところをフルパスにして動作させると”実行時エラー53”となりました。指定ファイルも記述せずExel起動だけでも同様でした。試しにnotepad.exe(ファイル指定せずに)だとメモ帳は起動しました。不思議です。
それでShellを諦めて下記の1でExcelを起動させて 2で指定ファイルを開くと、上手くいきました。
 1:『 Dim oApp As Object
    Set oApp = CreateObject("Excel.Application")
    oApp.Visible = True
    'Only XL 97 supports UserControl Property
    On Error Resume Next
    oApp.UserControl = True』

 2:『oApp.Workbooks.Open Filename:="C:○○△△.xls"』

Shellで起動が出来ないのは不明ですが、何とかこれで取りあえずの対処でします。

WIN10/Office2016(ACCESS2016入り)環境の別PCがありまして、それで現行のmdbファイルを試した事があるのです。そうするとVbaコードが無反応となるコマンドが多くあったので(mbd形式、accdb形式に変換後も)、それに移行するのが億劫で古いバージョンを使い続けている次第です。でも先々考えると行き詰まってしまいますね。今後何とかそれを新しいもので使える様にしなくてはと今回感じました。

色々と丁寧にアドバイス頂き、大変ありがとうございました。