Microsoft Access 掲示板

views
4 フォロー
6,349 件中 4,161 から 4,200 までを表示しています。
1
hatena 2021/01/28 (木) 19:42:45 修正

情報が不足しています。もう少し具体的に、どこでどのようにしたときに、エラーがでるのか説明してください。

社員情報登録フォームで新規レコードを入力したときにエラーがでるのでしょうか。
もし、そうなら、そのフォームのレコードソースのクエリのSQL文を提示してください。

1
hatena 2021/01/28 (木) 19:38:51 修正

まずは、
「F_リスト」「F_メンバー」のレコードソースは同じものですか。
また、メンバー、部署のデータを登録するテーブルなど関連するテーブルの、テーブル名、フィールド名、主キー設定を提示してください。

また、「F_リスト」は帳票フォームでしょうか。データシートフォームでしょうか。

1

下記でどうでしょうか。

Private Sub btn新規登録_Click()
    DoCmd.OpenForm "F_テスト", , , , acFormAdd, acDialog
    Me.プルダウン項目.Requery
End Sub

acDialogでダイアログモードで開くと、フォームを閉じるまで、次のコードが実行されないので、
F_テストで入力後、閉じると、プルダウン項目.Requery が実行されます。

3
おもち 2021/01/27 (水) 23:35:47 0029a@1c915 >> 1

>String型にNullは代入できないようになっています。

そういうことだったんですね!とても参考になりました。ありがとうございます。

2
true_grow 2021/01/27 (水) 09:02:41 2f66f@538fa

ありがとうございました。解決いたしました。
Switch関数について調べてみようと思います。

1
hatena 2021/01/26 (火) 13:50:48 修正
IIf([請求日]>#4/1/2014# And [請求日]<#10/1/2019#,0.08,0.1) AS 消費税率

の部分ですね。Switch関数を使うといいでしょう。

Switch([請求日]>=#10/1/2019#,0.1,[請求日]>=#4/1/2014#,0.08,[請求日]>=#4/1/1997#,0.05,[請求日]>=#4/1/1989#,0.03,True,0) AS 消費税率

軽減税率は考慮してません。

Switch 関数 - Access

3
chocotan 2021/01/25 (月) 21:18:35

本日、解決したのでご報告です。
私は、Left([氏名],Instr([氏名]," ")-1) 部分が問題なのかと思っておりましたが、saku様のおっしゃる通り、姓:"No." & [顧客ID]の連結を試してみたところ、「指定されたフィールドSQLステートメントのFROM句にある複数のテーブルを参照しました。」というエラーで[顧客ID]がまずダメだと分かりました。

そこで
[顧客ID] →  [テーブル名].[顧客ID] としたところ、このエラーは回避できました。

さらにもう一つ、問題があったようで、
Left([氏名],Instr([氏名]," ")-1)  →   Left([氏名],InStr([氏名] & " "," ")-1)
と修正したところ、思い通りの文字列が取得できました。

一人で考えていたらまず考えつかなかったので本当に助かりました。
ありがとうございました。

5
keepit 2021/01/25 (月) 14:59:03

hiroton様

早速ご返答いただき誠にありがとうございます。

cmb年度_AfterUpdate()

を入れたところ、うまく動きました。

すでに入力済のデータで年度をいじることはほぼないと思いますので、
大丈夫かと思います。
本当にありがとうございます。

4
hiroton 2021/01/25 (月) 11:57:09 7a1b5@f966d >> 3

ついでに、
新規・修正が同じフォームということなので、このコードだけだと、修正モードの時でも[cmb年度]を修正すると連番が変わります(処理が働きます)

年度(データ)は修正するけど一度取得した番号は変えたくないとかだと仕様に合わせてもうひと手間必要になりますね

3
hiroton 2021/01/25 (月) 11:44:41 7a1b5@f966d

思われている通りであっています

テキストボックスの使いまわしをするのであればコントロールソースは非連結にしてVBAで処理することにしましょう。タイミングは

1.新規登録の際、ユーザーが[cmb年度]で年度を選択した後に、

ということなので[cmb年度]の更新後処理で

Private Sub cmb年度_AfterUpdate()
    Dim new年度連番 As Long
    new年度連番 = Nz(DMax("年度別連番", "T統合", "年度='" & Me!cmb年度 & "'"), 0) + 1
    Me!Tx年度別連番 = new年度連番
    Me!Tx管理番号 = "t_" & Me!cmb年度 & Format(new年度連番, "000")
End Sub
2
keepit 2021/01/25 (月) 11:17:27

hiroton様

ご回答いただき誠にありがとうございます。

2つのコントロールソースに、頂いた式を挿入し、
新規登録時(サンプルコードの1,2の処理)の際は、
やりたいことが実現できました。

しかし、1点問題が出てきてしまい、
申し訳ございませんが、
再度質問させて頂きたいと思います。

もともと2018.2019等過去データには値が入っており、

別途用意してある検索フォームから
「詳細/修正」ボタンを押すと
今回のフォームが開き、
検索フォームで選択された「ID」に連動した値が、
該当の登録フォームの、各レコードの値が挿入される仕様になっています。
(サンプルコードの「4.検索フォームから選択したデータの値取り込み」の部分。)

新規登録モードと修正モードが同じフォームで出来るような形になっています。

今回の修正後、
検索フォームで「詳細/修正」ボタンを押すと、

実行時エラー '2448'
このオブジェクトに値を代入することはできません。

'===============================================================================
'  4.検索フォームから選択したデータの値取り込み

           .Tx年度別連番.Value = oRS("年度別連番").Value
           .Tx管理番号.Value = oRS("管理番号").Value

の部分がデバックで表示され、該当フォームを開くことができなくなってしまいました。

もともとは、「詳細/修正」モードの場合、
非連結のテキストボックスで、
IDに連動したレコードを表示させていただので、
コントロールソースにあらたな数値を設定してしまったので、
エラーがでてしまったのでしょうか?
VBAでの処理が必要なのかどうか、
「新規登録」とは別に「詳細修正フォーム」を新たに作ったほうが良いのか、
質問ばかりで申し訳ありませんが、よろしくおねがいします。

1
hiroton 2021/01/25 (月) 08:53:23 7a1b5@f966d

軽く見た感じVBAでどうこうしたいということではないのかな

DMax関数は第三引数に条件を指定できます

1.新規登録の際、ユーザーが[cmb年度]で年度を選択した後に、
[Tx年度別連番]の値が、
選択したテーブルの(年度)グループに紐付いた(年度別連番)で
最大値に+1した値(値がない場合は1~の連番)
が自動で入るようにしたい

Tx年度別連番のコントロールソース

=Nz(DMax("年度別連番","T統合","年度='" & [cmb年度] & "'"),0)+1

2.(1.)で年度を選択した後、[Tx管理番号]に、
テキスト形式で、「t_yyyy_000」という形式で自動で値が入るようにしたい
⇒yyyy:[cmb年度]で選択した値
⇒000:[年度別連番]を000形式にした値

Tx管理番号のコントロールソース

="t_" & [cmb年度] & Format([Tx年度別連番],"000")
2
chocotan 2021/01/24 (日) 09:30:10

saku様、早速ご教示いただいてありがとうございます。
姓:"No." & [顧客ID] & " " & Left([氏名],Instr([氏名]," ")-1) のコード問題ないのですね。
姓:"No." & [顧客ID]と、姓:"No." & cstr([顧客ID])ができるかどうか、すぐに試したいところなのですが、職場でしかできないため、明日、早速試してみたいと思います。
 

1

私の環境(Access2019)では、姓:"No." & [顧客ID] & " " & Left([氏名],Instr([氏名]," ")-1) のコード問題なく表示されました。環境が違うからかなぁ・・

顧客IDはオートナンバーと思いますが、まずは、姓:"No." & [顧客ID]で連結できるか試してみては?
姓:"No." & cstr([顧客ID]) として連結してみても出来ませんか?

2

コード記述はそれぞれあると思いますが以下のようにしてみてはどうでしょうか?

Dim infoPath As String

'infoPath変数に代入するのであれば先に判定した方が良いと思います。
'コントロールの値が、空白("")またはNULL値かによって条件処理
if len(nz(trim(Me!txt客パス)))<>0 then
    infoPath = trim(Me!txt客パス)
else
    MsgBox "客パスが入力されていません。",vbOKOnly + vbExclamation
    exit sub
end if

'txt情報は、コントロール名かな?
'上記と同じように空白("")またはNULL値かによって条件処理
if len(nz(trim(Me!txt情報)))<>0 then
    'AcDirは自作の関数でしょうか? そのままカキカキ..
    If AcDir(infoPath, vbDirectory) <> "" Then
        Shell "Explorer.exe " & Me!txt客パス, vbNormalFocus
    else
        MsgBox "保存しているパスが存在しません。パスを確認してください。",vbOKOnly + vbExclamation
        exit sub
    end if
else
    MsgBox "先に情報を入力してください。",vbOKOnly + vbExclamation
    exit sub
end if

ポイントは、空白(""=vbnullstring)または、NULL値どちらでも入力文字数が0(ゼロ)であれば未入力としています。
参考になれば幸いです。

1
ゲッキョク駐車場 2021/01/22 (金) 17:29:06 cb55f@f6500

Me!txt客パス の値がNullになっていませんか?

String型にNullは代入できないようになっています。
Variant型にするか、
代入時に If (IsNull(n) = False) Then 等でNullを代入しないようにしたらどうでしょうか…。

それ以降のif節内については素人なのでわかりかねますが……申し訳ないです。

4
hideki 2021/01/17 (日) 17:29:29 592ec@58077

出ませんでした。
ありがとうございました。
これで、業務を早くすることができます。

3

パスワードがかかっていても普通にインポートはできます。
一度、手動でインポートしてみてください。パスワード無しにインポートできると思います。

下記のコードのみで実行してもエラーが出ますか。

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "MTtest", "C:\Users\Desktop\aaaa.xlsx", True, "Sheet1!W4:AF200"
2
hideki 2021/01/17 (日) 13:36:05 592ec@58077

strDocName = "C:\Users\Desktop\aaaa.xlsx"です。
失礼しました。
エラーの箇所は、
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "MTtest",
"C:\Users\Desktop\aaaa.xlsx", True, "Sheet1!W4:AF200"

です。

元ファイルのExcelにはPWがかかってまして、

   With oApp
        .Visible = True
        .Workbooks.Open FileName:=strDocName, _
         Password:="abcd"

        .ActiveWorkbook.Close False
        .Quit
    End With
    Set oApp = Nothing

これが必要かなと思いまいした。

お手数かとおもいますが、よろしくお願いします。

1

どのコードがエラーが出てますか。

strDocName = "C:\Users\Desktop\aaaa"
これは拡張子がないですが、実際のものかちゃんと拡張子ついてますか。

あと、エクセルブックをインポートするだけなら、
「Excelファイルオープン」のコードは不要です。

3
acaplco 2021/01/15 (金) 14:29:38 c8dbb@0bb19

hatenaさん、申し訳ありませんでした。リンクテーブルを削除してから再リンクの方法をテーブルのインポートで行ったらパスワード入力画面が出て、入力後うまくいったようです。なにせ、アクセスを使いだして20年以上になりますが、当方70歳でいろいろ苦慮しています。アドヴァイス有難うございました。

2
acaplco 2021/01/15 (金) 14:11:15 c8dbb@0bb19

hatenaさん、有難うございました。リンクテーブルを削除してから再リンクしましたが、、「パスワードが間違っています」と表示されて、パスワードの入力画面が出ないのでテーブルリンクができませんでした。

1

リンクマネージャーを使わずに、リンクテーブルを削除してからリンクしなおしたらどうなりますか。

2

hiroton様
失礼しました、学生マスタとは学生テーブルの打ち間違いです*本文を修正いたしました。

SQLについて確認いたしました、想定していた挙動どおりです。
迅速にご教示いただき誠にありがとうございました。

1
hiroton 2021/01/14 (木) 15:38:29 957cc@f966d

1.学生テーブル

SELECT 学生マスタ., "★" AS 取得済成績
FROM 学生マスタ;

学生マスタとは何者でしょう?


学生の情報が抜け落ちてしまっているクエリ1をつかって計算させるのはめんどくさいです。専用にクエリを作り直してしまったほうがいいでしょう

SELECT 学生テーブル.学生番号, 学生テーブル.氏名, Nz(Sum(IIf([修得年度]="2019",1)),0) AS 取得済成績
FROM 学生テーブル LEFT JOIN 成績テーブル ON 学生テーブル.学生番号 = 成績テーブル.学生番号
GROUP BY 学生テーブル.学生番号, 学生テーブル.氏名;

これは、ACCESSのデザインビューで作成したクエリをそのままSQLビューで表示したものです。SQLビューに張り付けてデザインビューに切り替えれば「クエリのデザインビュー例」が確認できます

6
hiroton 2021/01/13 (水) 10:31:20 修正 6cdb2@f966d

修正版

コントロールソース|='<font style="BACKGROUND-COLOR:#' & Right("00" & Hex([カラーコード]),2) & Mid(Hex([カラーコード]+16777216),4,2) & Mid(Hex([カラーコード]+16777216),2,2) & '">     </font>'

RGB並び順を修正
HTMLのカラーコード指定は6桁(3桁でもいいけど)必要なので10進数→16進数変換で特定の場合に上位桁がなくなってしまうのを修正
divタグは不要っぽかったので削除


RGBは確かに逆順にしないとダメでした。いい感じの技術資料が見つけられなかったんですが、実装次第で異なる場合もあるようですRGBのHex並びが逆(AddinBox/VBAユーザーの為のOpenOffice.org 備忘録さん)
これはもう、VBAではそう、としか言いようがなさそうです

カラーコード表記は例えば「#FF0000」で、最初の#を除いて先頭2文字が1つ目のグループで「R」の量を表す、3~4文字目が・・・
となっていて、「桁」自体は存在しません。これを数値にする場合、「桁」を与える必要があります

数値で同様のことを考えると、1つ目のグループは一の位で2つ目のグループは十の位で・・・と考えることができます。そして、これを文字であらわすときは一番大きいグループから表記します。

一の位が3
十の位が2
百の位が1
ならば3×1+2×10+1×100 → 123

これをRGBに当てはめ、
1つ目のグループ(R)がFF
2つ目のグループ(G)が00
3つ目のグループ(B)が00
ならば、FF×1+00×256+00×256×256 → &H0000FF

このように考えると
カラーコード表示のRGB(255,0,0)→#FF0000
16進数表示のRGB(255,0,0)→&H0000FF

のように、文字の並び順だけ見れば逆になるという表現方法も間違いとは言えないことがわかると思います

4
よし 2021/01/13 (水) 00:58:22 d9508@7e9fa

hiroton様の投稿内容でも試してみましたが、うまく動作しませんでした。
HTMLでのカラーコードはRGBの順ですが、VBAでの10進数のカラーコードをhex関数で16進数に変換すると、
何となくですがBGRの順で出てきます。
VBAは内部的に色をBGRの順で計算しているのでしょうか。
考えていると頭が混乱してきました。

参考画像を貼っておきます。アドバイスを頂いたお二方、本当にありがとうございました。

3
よし 2021/01/13 (水) 00:02:09 d9508@7e9fa

年末年始の繁忙期のため、お礼が遅くなり申し訳ございません。

以前投稿されていた、詳細_paintイベントを使う方法でうまいこと動いてくれました。
お教え頂いた方に感謝申し上げます。

カラーコードのテキストボックスを txt_ColorCode、
色を表示したいラベルを Lbl_info とします。

Private Sub 詳細_Paint()
    If Nz(Trim(txt_ColorCode), vbNullString) <> vbNullString Then
        Me.Lbl_info.BackStyle = 1
        Me.Lbl_info.BackColor = txt_ColorCode
    Else
        Me.Lbl_info.BackStyle = 0
    End If
End Sub

これで色を表示させることが出来ました。ありがとうございました。

6

集計結果を表示出来ない原因が参照先のクエリが開けなくなっていだ事が原因だと分かりました。社内SEが式に合わせる為、フィールド名を変更していた様で何処かでバグが起きて開けなくなっていました。開けるクエリと置き換え式のフィールド名を変えた所表示できました。今までと違い違うパソコンからそのクエリを開こうとするとodbc接続に失敗しましたというエラーがでたり色々分からない事が多いですが取り敢えず集計ボックス表示はできたので助かりますました。有難う御座いました。

2
nokonoko 2021/01/12 (火) 18:21:54 653a6@54883

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

ご回答をもとに組み立てることができました。
MT_年月を前もって作成しておくのは、長期運用しにくいので、
自力で解決策を考えてみます。
(困ったら、また質問させていただきます

2
おもち 2021/01/12 (火) 10:21:17 0029a@1c915

Accessの問題ではなかったんですね。権限の問題で、表示スケールがいじれないのですが、Accessのせいではないということがわかって助かりました。ありがとうございます。

1

また、かなり可能性が低いですが、生産が止まった月があった場合、列も表示されません。
これは対処できるのでしょうか?

これに対応するには、出力したいすべての年月を格納するテーブルが必要になりますね。
下記のようなテーブルを作成してください。

テーブル名 MT_年月

年月
2020年01月
2020年02月
2020年03月
2020年04月


一つのクエリでは難しいので、複数のクエリを組み合わせて目的に出力になるようにしていきます。

Q_商品_年月

SELECT MT_商品.商品ID, MT_年月.年月
FROM MT_商品, MT_年月;

このクエリですべての商品IDと年月の組み合わせが出力できます。


Q_商品年月別計

SSELECT
 T_生産.商品ID,
 Format([生産日],"yyyy\年mm\月") AS 年月,
 Sum(T_生産.生産量) AS 生産量計
FROM T_生産
GROUP BY T_生産.商品ID, Format([生産日],"yyyy\年mm\月");

このクエリで、商品別年月別の生産量の合計が出力できます。


上記の2つのクエリから下記のようなクロス集計クエリを作成します。
CQ_商品年月別

TRANSFORM Nz(First([生産量計]),0) AS 値
SELECT Q_商品_年月.商品ID
FROM
 Q_商品_年月 LEFT JOIN Q_商品年月別計
 ON (Q_商品_年月.年月 = Q_商品年月別計.年月) AND (Q_商品_年月.商品ID = Q_商品年月別計.商品ID)
GROUP BY Q_商品_年月.商品ID
PIVOT Q_商品_年月.年月;

これでご希望の結果になると思います。

1

OSのディスプレイの表示スケールの設定を標準から変更してないでしょうか。
もし、しているなら 100% に戻したらどうなりますか。

Windows 10でディスプレイの表示スケールの設定を変更して見やすくする:Tech TIPS - @IT

2
どんぐり 2021/01/05 (火) 14:16:42 ef15c@e2de4 >> 1

なるほど…簡単なことが思いつかずお手数をおかけしてしまいました。申し訳ありません。
ご回答ありがとうございました!

1

現在の仕様だと、企業テーブルにデータが存在していないものも
企業IDが空欄として問題なく処理されてしまいます。

更新クエリの抽出条件で企業テーブルにデータが存在していないものを除外するようにすればいいのでは。

これで分からなければ、現状の更新クエリのSQLと各テーブルの主キーフィールドを提示してください。

3
hiroton 2021/01/05 (火) 12:00:47 dfd95@f966d

締日は普通、情報は日付のみでは?

請求日 支払い条件1(20日締め翌月末) 支払い条件2(締め翌月末)
締日 支払日 締日 支払日
2021/1/20 2021/1/20 2021/2/28 2021/1/31 2021/2/28
2021/1/21 2021/2/20 2021/3/31 2021/1/31 2021/2/28

支払条件には月の区切りとする日(締日)と、支払いに関する日付(担当者が入金処理をする日)の2つの日付の情報が含まれるものです(支払いの方法(現金、手形等)も記述されるものですが今回は省略)

例外としては
前払い(初回取引のためだったり)
請求後30日(「締日」を定めない。日本の企業ではまずない)
なんかもありますね

さておき、「1か月後末日」では何を計算したいのかわかりません。「締日」の月が変わるのは「請求日」と「締日」の関係からであって、「1か月」という情報は関係ありません。記述の仕方からすると「締日」に関する情報が不足のようにみえます
支払日を求めたいのであっても、上記のように「締日」の条件で月が変わるため情報不足です


いずれにせよhatenaさん指摘のようにデータベース上では計算しやすい数値としてフィールドに分けて保存するのが基本で、
締日日(末締めは0)
支払月間
支払日日(末日は0)
の3つのフィールドを持つといいでしょう

締日: DateSerial(Year([請求日]),Month([請求日])+IIf(Day([請求日])>[締日日],1,0),[締日日])
支払日: DateSerial(Year([締日]),Month([締日])+[支払月間]+IIf([支払日日]=0,1,0),[支払日日])

Trueの扱いについて
hatenaさんの式の-([締日日]=0)は面白いなぁと思います。hirotonの式では+IIf([支払日日]=0,1,0)と記述しました。どちらも同じ結果になるのでどちらでもいいです。ただし、ACCESSなら

こんぴゅうたぁのはなし になるのですが、ACCESSで適当なフォームを作り、テキストボックスを配置してコントロールソースを=Date()+Trueとします。つぎに、Excelを立ち上げて適当なセルに=TODAY()+TRUEとしてみます。結果はご覧あれ

テクニックとしてどこまで許容するかという話になるんですが、真偽値をそのまま計算に使うのは上記のようにそれなりの知識が必要になるのでオススメしません

2
トマト 2021/01/05 (火) 09:47:58 ef15c@e2de4 >> 1

大変参考になりました!ありがとうございます。

>蛇足ですが、こういう並び順はユーザーフレンドリーでないので

おっしゃる通りで、並び順自体スッキリしないなと、ずっと感じています。。
どなたか並び順のアイデアがあれば、ご教示いただけると非常に助かります。

1
hiroton 2021/01/05 (火) 08:50:08 dfd95@f966d

優先順のグループ分けを3通りにする

式: IIf([契約更新日]<DateAdd("m",2,Date()),1,IIf([契約状況]<>"契約中",2,3))

IIfのネストは見づらくなるのでSwitch 関数でもいいですね

式: Switch([契約更新日]<DateAdd("m",2,Date()),1,[契約状況]<>"契約中",2,True,3)

蛇足ですが、こういう並び順はユーザーフレンドリーでないので、フォーム上に並び順に関する注釈が欲しくなります

2
おもち 2021/01/04 (月) 10:08:19 9f0f1@e2de4

なるほど…!イメージがわきました。
作ってみて、またわからなければ質問させていただきます。
ありがとうございました!