Public Sub SetRenban()
Dim rs As DAO.Recordset
Dim c As Long, d As Long
Dim pre氏名, pre組織名
Dim strSQL As String
strSQL = "SELECT 在籍期間No, 終了日, 発令日, 氏名, 組織名 FROM アクションテーブル " & _
"ORDER BY 氏名, 発令日;"
Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset, dbFailOnError)
Do Until rs.EOF
If pre氏名 = rs!氏名 Then
If pre組織名 <> rs!組織名 Then
c = c + 1
pre組織名 = rs!組織名
End If
d = Format(DateAdd("d", -1, Format(rs!発令日, "0000/00/00")), "yyyymmdd")
rs.MovePrevious
rs.Edit
rs!失効日 = d
rs.Update
rs.MoveNext
Else
c = 1
pre氏名 = rs!氏名
pre組織名 = rs!組織名
End If
rs.Edit
rs(0) = c
rs.Update
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
MsgBox "完了"
End Sub
SELECT t.氏名, t.組織名, Min(t.発令日) AS 開始日, Max(t.終了日) AS 終了日
FROM アクションテーブル As t
GROUP BY t.氏名, t.組織名, t.在籍期間No
ORDER BY t.氏名, t.在籍期間No;
SELECT x.氏名
, x.組織名
, Min( x.発令日 ) As 発令日
, Max( Nz( DateAdd( 'd', -1, y.発令日 ), #12/31/2099# ) ) As 失効日
FROM アクションテーブル x
LEFT JOIN アクションテーブル y
ON x.氏名 = y.氏名
AND x.GSeq日付 = y.GSeq日付 - 1
GROUP BY x.氏名
, x.組織名
, x.GSeq日付 - x.GSeq組織
ORDER BY x.氏名
, Min( x.発令日 )
;
UPDATE [T発注Sub] INNER JOIN [Q一括変更用チェックON分]
ON [T発注Sub].[発注明細ID] = [Q一括変更用チェックON分].[発注明細ID]
SET [T発注Sub].[備考・MEMO] = Left([T発注Sub].[備考・MEMO],InStr([T発注Sub].[備考・MEMO],'*')-1)
WHERE [T発注Sub].[備考・MEMO] Like '*[*]*';
UPDATE [T発注Sub] INNER JOIN [Q一括変更用チェックON分]
ON [T発注Sub].[発注明細ID] = [Q一括変更用チェックON分].[発注明細ID]
SET [T発注Sub].[備考・MEMO] = 'あいうえお'
WHERE [T発注Sub].[備考・MEMO] Like 'あいうえお*';
Const cSQL = ""SELECT * FROM Tbl1 WHERE 下限値<=[x] AND 上限値>[x];"
Dim rs As DAO.Recordset, x As Long
x = Val(InputBox("数値を入力"))
Set rs = CurrentDB.OpenRecordset(Replace(cSQL,"[x]",x))
If rs.EOF Then
MsgBox "該当するデータはありません。"
Else
MsgBox "gr1: " & rs!gr1 & vbCrLf & _
"std1: " & rs!std1 & vbCrLf & _
"gr2: " & rs!gr2 & vbCrLf & _
"std2: " & rs!std2
End If
For i = 0 To 48
gr = ""
y = Min(i)
z = mx(i)
If x >= Min(i) And x < mx(i) Then
gr = gr1(i)
std1 = std1(i)
gr2 = gr2(i)
std2 = std2(i)
Exit For
End If
Next
If gr = "" Then
gr = gr1(49)
std1 = std1(49)
gr2 = gr2(49)
std2 = std2(49)
End If
For i = 1 To 49
If x >= Min(i) And mx(i) Then
gr = gr1(i)
std1 = std1(i)
gr2 = gr2(i)
std2 = std2(i)
Exit For
Else
gr = gr1(50)
std1 = std1(50)
gr2 = gr2(50)
std2 = std2(50)
End If
Next
ちょっと試してみたけどDSum関数でも数値と認識してくれないんですねぇ
無理やり数値と認識させればいいだけなので「
+0」してやればよさそうでしたこれで
Null+0でNullのままとなりました
回答有難うございます。
Dlookupで引いてくる”金額”はテーブル上、”通貨”の設定なのですが、クエリに表示される数字は”通貨”の表示ではなくなり、Ccur関数で”¥”表示にしている次第です。
コレを踏まえて、対策があれば、ご教示いただけますと幸いです。
のなら、書式設定で表示を変えればいいと思いますが、Ccur関数を使う必要はありますか?
失礼しました。
カンマの位置等を変えた結果、無事空白が返されました↓
DLookUp("OP料金料金2","ALL OP料金","OP料金OPCD='" & [OP料金OPCD] & "'And OP料金Age='" & [OP料金Age] & "'")
コレを踏まえて、Ccur関数で、通貨表示をしようと思ったのです(↓の式)が、空白部分で、”#エラー”表示が出てしまい、
空白の場合、空白で返す式をご教示いただけますと幸いです。
Ccur(DLookUp("OP料金料金2","ALL OP料金","OP料金OPCD='" & [OP料金OPCD] & "'And OP料金Age='" & [OP料金Age] & "'"))
アクションテーブルに失効日のフィールドを追加しておいて、SetRenban関数のループ内で発行日の前日を前レコードの失効日に代入するという処理を追加すればどうでしょう。
(続き)
■DML
■結果
サンプルを載せておきます
最初に SetSequenceNumber関数 をデータベースにインポートして
利用可能な状態にしておきましょう
■DDL
■データ例 (連番付与前)
■グループ連番の付与
■データ例 (連番付与後)
新しい質問を立てるのはどうでしょう?
主キーと関連するテーブルを過不足なく提示したり、スクショを提示したりするのがおすすめです。
[在籍期間No]をひとつずらして結合させるところができずにいます。
こちらのスレッドでアドレスいただいた者です。
ベースになるデータの仕様が少し変わりまして、開始日・終了日を持たず、
発令日(=開始日)のみしか持たないデータソースを使うこととなりました。
SetRenban関数にて在籍期間Noをふり、開始日および終了日はSQLで在籍期間NoのMin、Max
にて計算するというものを実装しています。
今回、ご相談させていただきたいのは、開始日は在籍期間NoのMinで良いのですが、
終了日が、理論上は[在籍期間No] + 1のMinの前日となると思っていますが、
私ができる初歩的なレベルですと、もうひとつクエリを作って、両者を結合させるとかになります。
このあたりの実装でご相談させてください。
sk様
詳しい説明ありがとうございました。
条件付き書式でできました。
フォームのデータシートビューにおいては、そのフォームの DatasheetForeColor プロパティの設定が優先され、テキストボックスの ForeColor プロパティの設定は事実上無効となります。
データシートフォームにおいて、それぞれのレコードごとにテキストボックスの前景色を切り替えるようにしたければ、条件付き書式を用いる方法しかありません。
なるほど!
考え方・式の書き方ともに納得です。
ありがとうございました!
前月の末日は「当月1日の1日前」です。つまり、「今日」から「今日の日」を引くと前月の末日になります。
例)
2024/06/13 - 13 =>2024/05/31日付を特定の書式で表示したい場合はformat関数を使います
ありがとうございます!
分割フォームとサブフォームがこんがらがっていたようです…
私が求めていたのは分割フォームでした!失礼致しました。
以前はうまくできなかったのですが、
Microsoft「既存のフォームを分割フォームにする」
をみて解決しました。
また、教えていただいたので、過去の掲示板を検索し、
複数条件での抽出について、目を通しました。
VBAを使うものが多く見えたため、今の環境や自分では
導入が難しそうで、私なりに小さくまとめた結果として
トグルボタンにて進めたいと思います。
トグルで検索できない分は、各自、クエリで抽出条件を
組み合わせて対応してもらうつもりです。
ありがとうございました。
問題は出来る限り小さくまとめましょう
実装が不明ですが、それほど難しいようには思いません。フォームの内容を元に複数条件で抽出を行うのはこの掲示板でも頻度の高い質問ですし
とりあえず、分割フォームを試してみては?
データシートビュー部分であればサイズの変更ができます(行単位、列単位)
基本的に、フォームのデザインを動的に変更するような仕様はとても難しいです。レコードごとのデザインは共通になるので、「住所の長いレコードだけ高さを広げたい」という要望であれば、それは無理です。
また、実際に何かを導入しようとするのであれば、かなり具体的にフォームの作りを説明できる程度の知識は必要です
参考:フォームを2分割して境界線をドラッグしてリサイズ(hatena chipsさん)
返信に気付くの遅くなり申し訳ありません。
>>この部分を実際どのように実現しているかの説明が必要かと。
すみません、よくわからず使っていて、
過去のバックアップがあったので比較してみていたら、コンボボックスの更新後処理のところが間違っていたようで、
バックアップのものと同じように書き換えて解決しました。
お騒がせ致しましたm(__)m
hatenaさん ありがとうございます。
コード記述したら思い通りの結果になりました。Left関数とInStr関数の組合せはすごいアイデアです。
WHERE条件もこうすればいいのですね。
大変お世話になりました。
下記のSQLで。
注意点
SQLのLike演算子は、全角の
*と半角の*は区別しない*はワイルドカードの意味になるので、文字としての*と認識させるには[*]というようにカッコで囲むもし、全角の
*のみ対象としたいのなら、WHERE句を下記のように修正詳細は下記を参照してください。
【Access】クエリで大文字/小文字、全角/半角、ひらがな/カタカナを区別して文字列比較したい | hatena chips
hatenaさん ありがとうございます。
入力したと思ってたのですが抜けてました。例:”あいうえお*さしすせそ” の*(記号)以降の文字列を取り除きたい⇒”あいうえお”だけ残したい。不十分ですみませんでした。
「を含むそれ以降の文字列」の「を」の前には何が入りますか。(入力ミス?)
仕様が不明確です。
コーディングするには仕様を明確に言語化する必要があります。
この意味が、
[備考・MEMO]が"あいうえお"で始まっている場合、"あいうえお"を残してそれ以降を削除する(言い換えるなら"あいうえお"にする)
ということなら、SQLは下記になります。
hatenaさん ありがとうございます。
”田中”を変数のtyokusouに変更するだけで出来ました。
ややこしく考えすぎでした。とにかく変数の前に”で区切り & 変数 & で繋いでその後に”で記述始めたらいいのですね。
初歩的な事に丁寧な解説頂き、すみませんでした。
お世話になりました。
前回の回答と、リンク先を熟読して、一度自分でチャレンジしてみてください。
一度理解できれば、簡単なことだと思います。
どうしてもできないようでしたら、その旨返信してください。
ヒント
リンク先でも言ってますが、SQLとVBAは別物ですので、SQLの部分とVBAコードの部分を意識するようにしましょう。
文字列結合はSQLでもVBAでも &
引用符は SQLでは ' または " どちらでも可、VBAでは " のみ
hatenaさん ありがとうございます。
コード修正したら出来ました。あと変数の前に★等の記号入れたいのですがどう記述したらいいでしょうか?
= [T発注Sub].[備考・MEMO] & ' " & tyokusou & " さんへ直送';" の 変数tyokusouの前にです。
" ★田中さんに直送 ”としたいのです。頭がこんがらがってしまって・・・すみません。
SQL内の文字列リテラルは引用符("または')で囲む必要があります。
つまり、下記のようなSQLになります。
※tyokusou の中身が 田中 の場合
このSQLをVBA内に記述する場合は、VBAとしての文字列リテラルにする必要があるので、引用符(")で囲む必要があります。
変数部分は文字列リテラルの外に出す必要がありますので、下記のようになります。
下記を一読しておくと理解が深まると思います。
Access上のコード内で引用符(")と単引用符(')の使い分けについて - hatena chips
みなさま丁寧なご解説ありがとうございました。省略してうまくいく時と、そうでない時があり、少し困っていましたが、省略可能でもきちんと表現したいと思います。ありがとうございました。
原因がはっきりしているエラーなので、根本的に設計からやり直して解決するしかないでしょう。臭い物に蓋をしても遅かれ早かれ損切りするしかないですわー。
すでに解決済みかもしれませんが、最近この症状にはまって一応解決したのでコメントさせて頂きます
解決方法は、Accessを64bitで再インストールしたらエラーがなくなりました、根本的な解決ではないかもしれません
私の場合32bitだったのでもしやと思い64bitにしたというだけです、何らかの上限や制約があるかもしれないのでもしかするともっとクエリを複雑にすると64bitでも同じ症状が出るかもしれません
何かの参考になれば幸いです
リンク先の質問では、コンボボックスのリストをカナで制限する方法ですね。
そのコンボボックスで選択した値で該当の従業員データをフォームに表示する方法については一切触れられてません。
この部分を実際どのように実現しているかの説明が必要かと。
総合計のSUM関数の集計のレポートのレコードソースのクエリを作るしか手が無いようなので諦めます。有難う御座いました。
Access に限って言えば、参照されているテーブルが 1 つのみである場合については * を省略しても構いません。
例えば、1 対 1 または多対 1 の関係にある 2 つのテーブルを内部結合し、右テーブルのうち、ある条件に該当するレコードを抽出した上、左テーブルのレコードのみを削除する(右テーブルのレコードは削除しない)ような場合は、「削除対象となるレコードを含むテーブル」の指定が必要となります。
一般的な SQL の構文規則において、 ; は「複数のステートメントで構成されているクエリ( SQL Server でいうところのストアドプロシージャ等)内の個々のステートメントを区切る終端記号」として用いられます。
クエリ内で呼び出されるステートメントが 1 つのみである場合は ; を省略しても構いません。
ただ Access に関しては「 1 つのクエリにおいて呼び出せる命令は 1 つのみである」という仕様となっているため、上記のような複数のステートメントで構成されたクエリを作成、実行することは出来ません。
したがって、事実上はほとんどのケースにおいて ; を省略してもしなくても正常に実行されます。
唯一の例外は、PARAMETERS 句を記述してクエリパラメータを明示的に定義する場合です。
上記のようなパラメータクエリの場合、PARAMETERS 句と DELETE 文を ; で区切らなければ構文エラーが発生します。
つまり * にしろ ; にしろ「省略してもよいケース」と「省略してはいけないケース」があるということです。
そういえばそんな設定あったようなと思って、365で新規ファイルを作成して確認したらありました。
この数値を変更してみましたが、コンボボックスのリストに表示される件数には影響がありませんでした。100に設定しても100件に制限されるわけではない。
そこで、9万件のレコード数のテーブルを作成してコンボボックスに設定しましたら、リストに表示されたのは65536件まででした。
私の試した環境では上記の設定に関係なく、これが上限のようです。
古いmdbファイル眺めてたらこんな設定がありました

(新規作成したaccdbファイルでは表示されません)
別件でオプション眺めてたらこの質問を思い出しただけなので、質問の回答になるかはわかりません
フィールド指定の「
*」いらないです。たぶん、ACCESSの場合、クエリデザインでクエリを作成するときにフィールド出力が必要なのでしょう。(クエリ作成ツールの仕様)
その関係で自動整形で付与されたりします
DELETE ステートメント (Microsoft Access SQL)
「省略可能記述」なので、省略する/しないでどちらが正しいか?はありません。どちらも正しいです。これは一般的なSQLにおいても記述はないので、普段から記述しないで良いでしょう
構文終端の「
;(セミコロン)」技術資料が見つかりませんでした。現実的には省略可能です。これもACCESSにおいてはどちらが正しいというものでもないでしょう。これも、必要、不要、省略可能は様々なSQLの個性によるようです
ただし、システムによってはSQL構文を連続して記述したり、続けて何かの記述を許すようなモノもあります。そのような場合には、当然
;が必要になりますACCESSだけを扱っている場合は気にする必要はないが、SQL自体に興味がある場合は記述する癖をつけておいたほうが無難です
ここはAccessに関する質疑応答、技術的な情報交換の場です。
それを踏まえて、他の閲覧者や後から検索で訪問した人にとって、意味のある情報になるように、下記のような要件に対してAccessでどのように解決するかという観点で、回答をおいておきます。
PDFから表データを取り込む
WordでPDFファイルを開きます。
欲しい表部分をコピーしてエクセルのシートに貼り付けます。
これをAccessにインポートします。
これで、pdfの表データをAccessのテーブルとして取り込めます。
これは1回のみの作業なのでVBAにするまでもないでしょう。
VBAで自動化したい場合は、下記等を参考に。
【Excel/VBA】PDFやWordから表データだけを抽出するマクロ | hamalabo
キー値をもとに、下限値と上限値の範囲に合致するデータをとりだす。
取り込んだテーブル名はTbl1とする。
[条件値]と[下限値]フィールドにインデックスを設定する。
わずかな手抜きは止めて、2次配列に格納する事にしました。
PDFの表なら、もっといい方法はありそうですが、
後だしで、どんどん情報がかわっていくいつものパターンなので、
まあいいや。
このように修正したら、正常になりました。
ご指摘の通り、配列のままでは使えませんでした。
実際には、PDFの表を変換したデータを使います。
とりあえず、税額表等のデータは、寿限無コードを使わなくて済むようになったので、
無駄な労力を使わなくて済むようになりました。
Dim x As Long
Dim y As Long
Dim z As Long
Min = Split("0,63000,73000,83000,93000,101000,107000,114000,122000,130000,138000,146000,155000,165000,175000,185000,195000,210000,230000,250000,270000,290000,310000,330000,350000,370000,395000,425000,455000,485000,515000,545000,575000,605000,635000,665000,695000,730000,770000,810000,855000,905000,955000,1005000,1055000,1115000,1175000,1235000,1295000,1355000", ",")
mx = Split("63000,73000,83000,93000,101000,107000,114000,122000,130000,138000,146000,155000,165000,175000,185000,195000,210000,230000,250000,270000,290000,310000,330000,350000,370000,395000,425000,455000,485000,515000,545000,575000,605000,635000,665000,695000,730000,770000,810000,855.ooo,905000,955000,1005000,1055000,1115000,1175000,1235000,1295000,1355000,1355000", ",")
gr1 = Split("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50", ",")
std1 = Split("58000,68000,78000,88000,98000,104000,110000,118000,126000,134000,142000,150000,160000,170000,180000,190000,200000,220000,240000,260000,280000,300000,320000,340000,360000,380000,410000,440000,470000,500000,530000,560000,590000,620000,650000,680000,710000,750000,790000,830000,880000,930000,980000,1030000,1090000,1150000,1210000,1270000,1330000,1390000", ",")
gr2 = Split("1,1,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32", ",")
std2 = Split("88000,88000,88000,88000,98000,104000,110000,118000,126000,134000,142000,150000,160000,170000,180000,190000,200000,220000,240000,260000,280000,300000,320000,340000,360000,380000,410000,440000,470000,500000,530000,560000,590000,620000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000", ",")
x = 70000
For i = 0 To 48
gr = ""
y = Min(i)
z = mx(i)
If x >= Min(i) And x < mx(i) Then
gr = gr1(i)
std1 = std1(i)
gr2 = gr2(i)
std2 = std2(i)
Exit For
End If
Next
If gr = "" Then
gr = gr1(49)
std1 = std1(49)
gr2 = gr2(49)
std2 = std2(49)
End If
連想配列のキーは完全一致しか無理です。完全一致なので高速に検索できるのです。
このコードなら、xが10000間隔でgrが1増えていくという規則性があるので、下記のようなコードで可能です。
間隔が不規則であるなら、下記のようなテーブルを作成してそれを参照すればいいでしょう。
x_lowには範囲の下限値を入力しておきます。
また、インデックスを設定しておくと高速に検索できます。
下記のコードでgrを取得できます。
これの手がありました。
わずか、20行。
頭が悪いという事は、不幸です~~~~~。
Min = Split("0,63000,73000,83000,93000,101000,107000,114000,122000,130000,138000,146000,155000,165000,175000,185000,195000,210000,230000,250000,270000,290000,310000,330000,350000,370000,395000,425000,455000,485000,515000,545000,575000,605000,635000,665000,695000,730000,770000,810000,855000,905000,955000,1005000,1055000,1115000,1175000,1235000,1295000,1355000", ",")
mx = Split("63000,73000,83000,93000,101000,107000,114000,122000,130000,138000,146000,155000,165000,175000,185000,195000,210000,230000,250000,270000,290000,310000,330000,350000,370000,395000,425000,455000,485000,515000,545000,575000,605000,635000,665000,695000,730000,770000,810000,855.ooo,905000,955000,1005000,1055000,1115000,1175000,1235000,1295000,1355000,1355000", ",")
gr1 = Split("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50", ",")
std1 = Split("58000,68000,78000,88000,98000,104000,110000,118000,126000,134000,142000,150000,160000,170000,180000,190000,200000,220000,240000,260000,280000,300000,320000,340000,360000,380000,410000,440000,470000,500000,530000,560000,590000,620000,650000,680000,710000,750000,790000,830000,880000,930000,980000,1030000,1090000,1150000,1210000,1270000,1330000,1390000", ",")
gr2 = Split("1,1,1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32", ",")
std2 = Split("88000,88000,88000,88000,98000,104000,110000,118000,126000,134000,142000,150000,160000,170000,180000,190000,200000,220000,240000,260000,280000,300000,320000,340000,360000,380000,410000,440000,470000,500000,530000,560000,590000,620000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000,650000", ",")
For i = 1 To 49
If x >= Min(i) And mx(i) Then
gr = gr1(i)
std1 = std1(i)
gr2 = gr2(i)
std2 = std2(i)
Exit For
Else
gr = gr1(50)
std1 = std1(50)
gr2 = gr2(50)
std2 = std2(50)
End If
Next