Microsoft Access 掲示板

views
4 フォロー
6,283 件中 6,201 から 6,240 までを表示しています。
2
タコ 2019/04/11 (木) 16:58:50 93f9f@5e4f9

早速の回答ありがとうございます。
参考の記事を確認させて頂きました。
記事の内容としては
新規にexcelブックを作成するというものでした。
新規ではなく、既存のexcelシートに書き込む方法は無いでしょうか?

15

エラーがでるのはそこでしたか。先にそれを確認すべきでした。

stFilter = "・・・・" の部分はまったく関係ないですね。

Str = Nz(Ctr.Value,"")
か原因というのは特定できましたが、なぜそうなるかはわからないですね。
コントロールの値が Null だとしても、Nz関数で "" に変換しているだけなので、エラーになるはずがないのてすが。

その前後10行分のコードを張り付けてもらえますか。

14
tokinaito 2019/04/11 (木) 15:03:05 bb5c2@2f12b

お世話になります。
イミディエイトウィンドウにでるのは次です。
本部 In(2) And ([不備]=true Or [申請日]=#2019/04/10#)
デバッグは次です
オートフォントサイズプログラムの8行目です。
Str = Nz(Ctr.Value, "") 'ここでエラーが出る場合は、Str = Nz(Ctr.Value,"")
ちなみに当該レポートでオートフォントサイズを使わなければうまくいくようです。
オートフォントサイズプログラムここでも重宝しています。
こういう調べ方もあるんですね。勉強になります。

13

エラーが出たあと、イミディエイトウィンドウに出力されている条件式をコピーしてここに貼り付けてもらえますか。

あと、エラーだ出た時に、エラーダイアログの[デバッグ]ボタンをクリックしたときに反転表示されるコードはどこですか。

12
tokinaito 2019/04/11 (木) 11:47:56 bb5c2@2f12b

すみません。修正です。
stFilter = "本部 In(" & Mid(stFilter, 2) & ") And [申請日無し]='" & "不備" & "'or ( [申請日]=#" & [TXT申請] & "#)"
やはり抽出条件でデータ型が一致しませんと出ます。

11
tokinaito 2019/04/11 (木) 10:18:50 bb5c2@2f12b

クエリーで申請日無しを設け 申請日無し: IIf([不備]=-1,"不備")
stFilter = "本部 In(" & Mid(stFilter, 2) & ") And ([申請日無し] ="不備" Or [申請日]=#" & [TXT申請] & "#)"
としましたが受け付けてくれません。

10
tokinaito 2019/04/11 (木) 10:03:59 bb5c2@2f12b

お世話になります。
3でお示しされたものと一緒ですね。
抽出条件でデータ型が一致しませんと出ます。
何ででしょうかね。
宜敷お願いします。

9
hatena 2019/04/11 (木) 09:41:15 修正

それでは、下記ではどうですか。

stFilter = "本部 In(" & Mid(stFilter, 2) & ") And ([申請日] Is Null Or [申請日]=#" & [TXT申請] & "#)"
8
tokinaito 2019/04/11 (木) 09:05:25 bb5c2@2f12b

お世話になります。
1では全申請日が表示されます。
2ではtxt申請日分だけ表示されます。
3では抽出条件でデータ型が一致しませんと出ます。
宜敷お願いします。

6
igachan 2019/04/10 (水) 23:40:43 fdd2e@d14a6

丁寧にご指導いただきありがとうございました。無事にできました。

3

前回の分を見ながら作成してみました。

作成できたということてすか。
解決ということでよろしいですか。

5

検診者一人が複数のカルテNoを持つことがないのなら、
「検査データ台帳」には、「健診者ID」 を持たせて、
テーブル「健診者台帳」 と テーブル「検査データ台帳」を「健診者ID」でリレーションシップを設定することになります。

そうすれば、集計クエリで3つのテーブルを結合して、
団体ID、採取日 でグループ化して、健診者ID を「カウント」に設定すれば希望の結果が出ると思います。

3

主キーは
テーブル「団体台帳」は 団体ID テーブル「健診者台帳」は 健診者ID テーブル「検査データ台帳」は 検査データID に設定してあります。 

それでは、テーブル設計として間違ってますね。

その設計だと、
「健診者台帳」で健診者一人は、複数のカルテNoを持つことが可能、
「検査データ台帳」の検査データID一つにつき複数のカルテNoを持つことが可能、
ということで2つのテーブル関係が多対多の関係になってしまいます。
多対多の関係では結合することができません。(データが増幅されてしまう。)

テーブル同士を結合するときは、どちらかのフィールドが主キーであることが必須だと覚えておいてください。

実際上は、
検診者一人が複数のカルテNoを持つことはありますか。

2
igachan 2019/04/10 (水) 15:22:55 fdd2e@d14a6

前回の分を見ながら作成してみました。

2
igachan 2019/04/10 (水) 15:20:43 fdd2e@d14a6

主キーは
テーブル「団体台帳」は 団体ID テーブル「健診者台帳」は 健診者ID テーブル「検査データ台帳」は 検査データID に設定してあります。 

求めたいものは 団体Aは○月○日に△人受診しました。 がわかればいいのですが。

1

それぞれのテーブルの主キーはどのフィールドになってますか。

集計クエリで、団体名+採取日毎の検査人数を出したいということですか。

7

エラーの原因の特定のために下記の手順でコードを順に実行して試してみてください。

On Error の行はデバッグ中はコメントアウトします。
stFilter の条件式をシンプルなものから少しずつ足していく。
エラーが出た直前に足して条件式が原因と特定できる。
Debug.Print でイミディエイトウィンドにstFilterの内容を出力して
それが条件式として問題ないか確認する。
1.

        stFilter = "本部 In(" & Mid(stFilter, 2) & ")"
        Debug.Print stFilter
        'On Error Resume Next 
        DoCmd.OpenReport "販社連絡", acViewPreview, , stFilter
        'On Error GoTo 0

2.

        stFilter = "本部 In(" & Mid(stFilter, 2) & ") And ([申請日]=#" & [TXT申請] & "#)"
        Debug.Print stFilter
        'On Error Resume Next 
        DoCmd.OpenReport "販社連絡", acViewPreview, , stFilter
        'On Error GoTo 0

3.

        stFilter = "本部 In(" & Mid(stFilter, 2) & ") And ([不備]=true Or [申請日]=#" & [TXT申請] & "#)"
        Debug.Print stFilter
        'On Error Resume Next 
        DoCmd.OpenReport "販社連絡", acViewPreview, , stFilter
        'On Error GoTo 0
6
tokinaito 2019/04/10 (水) 10:24:09 bb5c2@2f12b

早々に有り難うございました。
申請日の記入がないものは不備ということでコントロールに
自動的に記入になるようにしています。
今後はこういう形に持って行こうと思ってます。
宜敷お願いします。
Dim stFilter As String
Dim stFilter2 As String
Dim stFilter3 As String
Dim varItm As Variant
Dim varItm2 As Variant
Dim varItm3 As Variant
    With Me.listSupplier
        For Each varItm In .ItemsSelected
            stFilter = stFilter & "," & .ItemData(varItm)
        Next
    End With

    If stFilter = "" Then
        MsgBox "本店を選択してください。"
    Else
        stFilter = "本部 In(" & Mid(stFilter, 2) & ") And ([申請日] Is Null Or [申請日]=#" & Me.TXT申請 & "#)"

        On Error Resume Next
        DoCmd.OpenReport "販社連絡", acViewPreview, , stFilter
         On Error GoTo 0

    End If
DoCmd.Close acForm, "F車庫証明台帳"

End Sub

5

確認ですが、「申請日の記入がない」と「不備のもの」というのはイコールですか。

4
tokinaito 2019/04/10 (水) 09:51:28 bb5c2@2f12b

hatena様有り難うございます。
ご指摘のようにしましたが、抽出条件でデータ型が一致しませんと出ます。
宜敷お願いします。
>>申請中: Not [申請日] Is Null
レポートのグループ化の機能で、このフィールドでグループ化すればいいでしょう。
以上のように対応はしています。

7
美月 2019/04/10 (水) 07:50:30 a63a9@7b5ca

失礼いたしました。
手順のミスでした。

アドバイスいただいた通りに動作いたしました。

3

電話などで軽く依頼があり
そのときに下請けに発注することがあります

一対多の入力フォームは、メインフォーム(一側データ)にサブフォーム(多側データ)を埋め込む形にします。

軽く依頼があった場合は、
メインフォームで新規レコードへ移動して、主キー(受注番号など)と仮受注日、顧客コードは確定させて、金額など未確定のものは未入力(Null)にしておきます。そして、サブフォームで下請けへの発注データを入力します。

というような設計になると思います。

今日、複数の下請けのデータを入力したとします
月末に受注データを入力します
受注データを入力するときに、自動的に対応する下請けの
データを関連付けることは可能なのでしょうか?

下請けのデータを入力するときに、関連付けするべき一側のデータを決めておかないと、
どれとどれが対応するかは後から判断できないですよね。

テーブル設計の一例
(そちらの詳しい業務内容が分からないので想像ですので参考程度に)

受注テーブル
 受注番号 主キー
 仮受注日
 受注先顧客コード
 受注内容
 本受注日
 金額

下請発注テーブル
 下請発注ID 主キー オートナンバー型
 受注番号 受注テーブルとリンクする外部キーフィールド
 下請顧客コード
 下請発注日
 下請内容
 金額

下請けデータを入力する前に、受注テーブルの受注番号、仮受注日、受注先顧客コードは確定しておく必要があると思います。

2

電話などで軽く依頼があり
そのときに下請けに発注することがあります

下請けには先に払う(入力)することがあり
あとから取引先から正式な受注データがくることがある、といった感じです

また、受注データは1案件扱いで10万だったとして、それは月末などに確定します
それの案件を自社と下請けで分担してやるので
先に下請けのデータだけを入力する場合がでてしまいます
1案件に対して複数の下請けが存在します

例えば
今日、複数の下請けのデータを入力したとします
月末に受注データを入力します
受注データを入力するときに、自動的に対応する下請けの
データを関連付けることは可能なのでしょうか?
その月かつその取引先からの業務のすべての下請け金額の小計を差し引いて粗利を表示するといったものです

文章だとわけわかりませんよねえ

3

伝票テーブル
 伝票ID 伝票名
  1   請求書
  2   請求書(控)

ということなら、下記でどうでしょうか。

    DoCmd.OpenReport "請求書", acViewPreview, , "請求書NO =" & Me!請求書NO & " AND 伝票ID=1"
    DoCmd.OutputTo acOutputReport, "請求書", acFormatPDF, "請求書.pdf", True
3

やりたいことはレポートに中からTXT申請日に記入のある申請日と 申請日の記入がない申請日を
選びたいのですが。

stFilter に下記のような条件文が格納されるように考えましょう。

本部 In(1,2) And ([申請日] Is Null Or [申請日]=#2019/04/01#)

上記の意味は、(本部が1か2) かつ (申請日が未入力 または 申請日が2019/04/01)
ということです。() 内が優先順位が高いということを利用します。

ということで、下記でどうでしょう。

stFilter = "本部 In(" & Mid(stFilter, 2) & ") And ([申請日] Is Null Or [申請日]=#" & Me.TXT申請 & "#)"
2
truegrow 2019/04/09 (火) 15:40:39 30b16@a036a

早速の返信ありがとうございます。説明不足で申し訳ありません。
伝票テーブル
 伝票ID 伝票名
  1   請求書
  2   請求書(控)
クエリで材料、数量・金額などの明細の後に上記テーブルを入れ、交互に出すようにしてあるので請求書の内容は全く同じでテキストボックス(コントロールソース 伝票名)だけ名前が変わるようになっております。

それようのフォームを作り
DoCmd.PrintOut acPages, Me!txt開始ページ, Me!txt終了ページ
を挿入するぐらいしかわかりません。

正は1ページ目にでるので1ページ目だけ指定とかできるのでしょうか

2
tokinaito 2019/04/09 (火) 14:33:08 bb5c2@2f12b

hatena様早速のお返事ありがとうございます。おっしゃるとおりにしましたが
申請日がないものについて表示されません。
上記の式のなかで
stFilter = "本部 In(" & Mid(stFilter, 2) & ")And ([申請日]=#" & [TXT申請] & "#) )"

stFilter = "本部 In(" & Mid(stFilter, 2) & ")And ([申請日]=#" & [TXT申請] & "#) )
OR 本部 In(" & Mid(stFilter, 2) & ")And ([申請日]=" & IS NULL([TXT申請]) & ") )"
なんて素人考えでやってますがうまくいきません。

やりたいことはレポートに中からTXT申請日に記入のある申請日と 申請日の記入がない申請日を
選びたいのですが。宜しくご教示のほどお願いします。

1

請求書を作成するにあたり、印刷すると正と控えが2枚出てくるようになっています。
 (※テーブルで請求書と請求書(控)をつくり請求書明細のクエリに組み込みレポートのテキストボックスで正と控がでます)

この仕組みがどうなっているか不明ですので、推測での回答になりますが、

OpenReportの引数で抽出条件で"(正)"のみ抽出するようにはできませんか。

レコードソースのフィールド名が不明なので、推測ですが、

    DoCmd.OpenReport "請求書", acViewPreview, , "請求書NO =" & Me!請求書NO & " AND 種別='(正)'"
    DoCmd.OutputTo acOutputReport, "請求書", acFormatPDF, "請求書.pdf", True
6

どのようなエラーがでますか。エラーメッセージを提示してください。

また、同じデータ、同じ追加先テーブルで、手動で保存済みインポート定義を使ってインポートできるかも確認してください。

5
美月 2019/04/08 (月) 21:15:18 5ec36@d6973

すみません、追記です。
strTblNameのテーブル定義は、必要な10のフィールドに絞っものを使っています。

4
美月 2019/04/08 (月) 21:08:32 5ec36@d6973

すみません、業務が立て込んでおり確認とご報告が遅くなってしまいました。

一度だけ手動でインポート定義を作成して保存しました。
インポート定義の名前:"CSVインポート"

この定義を使って下記のようにインポートできるのでしょうか?
strTblName:ここは固定のテーブル
strCSVFilePath:インポートするファイル名は変数で与えるため可変です

DoCmd.TransferText acImportDelim, "CSVインポート", strTblName, strCSVFilePath, True

何度かトライしましたが、エラーが出てうまくインポートできませんでした。

1

さてこれらについて申請中のレポートに、不備欄を設け申請中のもの未申請のもの(申請日がnull)
として販社連絡レポートに一緒に印刷したいのですがご教示お願いします。

ひとつのレポートに 申請中 のものと 未申請 のものを表示したいということでしょうか。
2つのレポートが同じレイアウトなら、
レコードソースのクエリに、下記の演算フィールドを設けて、

申請中: Not [申請日] Is Null

レポートのグループ化の機能で、このフィールドでグループ化すればいいでしょう。

6
けんたろー 2019/04/05 (金) 19:55:05 a63a9@7b5ca

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

自分のやり方に自身がなかった、
あるいは、もしかしたら私の思いもつかないやり方があるのかも?と思って相談させていただきましたので、hatena様もそのようにされるというのをお聞きできて大変参考になりました。

5

なるほど、初めて入力する場合も考慮すると式は退避させておく必要はありますね。
ならば、自分がするとしてもそのような設計になると思います。

他に、計算列以外を1列ずつCopyFromRecordsetという方法も考えられますが、列数が多いと遅くなりそうです。

4
けんたろー 2019/04/05 (金) 18:15:09 a63a9@7b5ca

ありがとうございます。

最終行に追加する場合は、既存の関数列にデータが残っているので、それでもいいと思いますが、初期のデータ追加の場合も考慮すると、関数が、消えてしまうので、
統一的なロジックとして、そのように対応したつもりです。つまり、一番上の関数が消えてしまわないように、ワークに残しました。

2
はっち 2019/04/05 (金) 16:08:15 b6c0e@a6755 >> 1

hatena様

思い通りの仕組みになりました!
本当にありがとうございます。

1

下記のコードでどうでしょう。

Public Sub CloseAllForm()
    Dim i As Long
 
    For i = Forms.Count - 1 To 0 Step -1
        If Forms(i).Name <> "フォームA" And Forms(i).Name <> "フォームB" Then
            DoCmd.Close acForm, Forms(i).Name
        End If
    Next

End Sub

Forms(0から始まるインデックス) で開いているフォームを参照できます。
インデックスの最後から削除しているのは、前から削除すると削除したとき、インデックスが前にずれるので、
削除されずにのこるフォームが出てくるためです。

3

エクセルのカラム名と1行目に式があるかどうかをチェックしながらSQLが生成できたら、
それをレコードセットとして開いて、CopyFromRecordsetで貼り付ければいいですよね。
計算列はNullの演算フィールドにしておけばいいでしょう。

貼り付けた後、計算列はオートフィルで上から埋めるようにすればいいのでは。

ワークテーブルがなぜ必要なのでしょうか。