Public Function SampleA(ByVal argStr As String _
, ByVal argSrc As String _
, ByVal argDst As String) As String
If Len(argStr) < 2 Then
SampleA = argStr
Exit Function
End If
With CreateObject("VBScript.RegExp")
.Global = True
.IgnoreCase = True
.Pattern = "([a-z])(" & argSrc & ")([a-z])"
If .Test(argStr) Then
SampleA = .Replace(argStr, "$1" & argDst & "$3")
Else
SampleA = argStr
End If
End With
End Function
■InStr関数+ループ版
Public Function SampleB(ByVal argStr As String _
, ByVal argSrc As String _
, ByVal argDst As String) As String
If Len(argStr) < 2 Then
SampleB = argStr
Exit Function
End If
Dim pos As Long
Dim front As String
Dim back As String
Dim target As String
pos = 1
target = argStr
While pos > 0
pos = InStr(pos + 1, target, argSrc, vbBinaryCompare)
If pos > 0 And pos < Len(argStr) Then
back = Mid$(target, pos - 1, 1)
front = Mid$(target, pos + 1, 1)
If StrConv(front & back, vbLowerCase) Like "[a-z][a-z]" Then
Mid(target, pos, 1) = argDst
End If
End If
Wend
SampleB = target
End Function
■SQL
SELECT
SampleA(
'株式会社zawaーZawa worldーrescue株式会社トーキョー'
, 'ー'
, '▼'
) as a
, SampleB(
'株式会社zawaーZawa worldーrescue株式会社トーキョー'
, 'ー'
, '▲'
) as b
;
Public Sub SequenceCheck4(Optional MinId As Long = 0, Optional MaxID As Long = 0)
If MinId = 0 Then MinId = DMin("ID", "T1")
If MaxID = 0 Then MinId = DMax("ID", "T1")
Dim StepNum As Long, SeqNum As Long, stOrder As String
If DLookup("数値", "T1", "ID=" & MinId) < DLookup("数値", "T1", "ID=" & MaxID) Then
StepNum = 1 '昇順
SeqNum = MinId
stOrder = "昇順"
Else
StepNum = -1 '降順
SeqNum = MaxID
stOrder = "降順"
End If
' CurrentDb.Execute "UPDATE T1 SET 連番チェック = Null WHERE Not 連番チェック Is Null;"
Dim sSQL As String
sSQL = "SELECT * FROM T1 Where ID>=" & MinId & " And ID<=" & MaxID & " ORDER BY 数値, ID"
If stOrder = "降順" Then sSQL = sSQL & " DESC"
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset(sSQL)
Do Until rs.EOF
rs.Edit
If rs!ID <> SeqNum Then
rs!連番チェック = stOrder & "×"
Else
rs!連番チェック = Null
End If
rs.Update
SeqNum = SeqNum + StepNum
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
End Sub
確かに、出荷数クエリは同じテーブルの都道府県フィールドに抽出条件を加えて集計したもので、出荷数合計クエリは出荷数クエリをさらに集計したものです。
出荷数クエリの都道府県フィールドの抽出条件を外したクエリを作成してレポートを作成したところ、思い通りのレポートを作ることができました。また、サンプルでレコード数を増やしてみたところ、きちんと2列で表示させることも出来ました。
ありがとうございます!!
サブレポートを用いる方法でも同じようなレポートを作れましたが、こちらの方がクエリ・レポートのオブジェクト数が1つずつで済むので大変良いですね、助かりました。
現状のクエリの Q_東京出荷数、Q_北海道出荷数 というのは同じテーブルから作成したもので、抽出条件(東京、北海道など)がそれぞれ異なるものだと思います。
このクエリの抽出条件を削除したクエリを作成して、それを元にレポートウィザードで作成してください。
そちらの詳細な状況が不明なので一例で説明します。
必要なフィールド(例 都道府県コード、都道府県名、出荷日、出荷数)を選択する
↓
グループレベルの指定、都道府県コード(都道府県名)を選択する
↓
並べ替え、集計方法、出荷日(昇順)
集計のオプション 合計
↓
レイアウト ブロック
↓
レポート名を入力して完了
上記のような感じで希望のレイアウトに近いものができると思いますので、
デザインビューで微調整してください。
ウィザードからやってみましたがうまく作成できませんでした。
各クエリのフィールドを全て項目に追加しようとするとエラーが出ます。
替えたところ入力出来るようになりました。
㉗が文字として認識されず、IDと同一とみなされてしまったのですかね?
いくつか方法はありますが、「都道府県」が単一の都道府県の文字データであるならば、今やっている、「『都道府県』フィールドに『テキストボックス向け先』の文字が入っているか?」の逆をやればいいです
提示のレイアウトなら、サブレポートを使わずとも、レポートのグループ化の機能で実現できます。
ウィザードで作成する方法
グループ化レポートまたはサマリー レポートを作成する - Microsoft サポート
表形式のレポートに見出しや合計を追加する方法
Accessのレポートでフィールドごとにグループ化して印刷する方法 | できるネット
上記の方法でレポートを作成すれば下記の方法が使えます。
Accessのレポートで表を2列に印刷する方法 | できるネット
サブフォームの合計をメインフォームに表示したいのなら、
サブフォームのフォームヘッダーかフォームフッターにテキストボックスを配置して、下記のように設定して、
名前 合計
コントロールソース =Sum([受注金額])
メインフォーム上のテキストボックスのコントロールソースに下記の式を設定すればいいでしょう。
hatenaさんに頂いた式、無事できました!
また一つ勉強になりました。ありがとうございます。
すずやんさん、ありがとうございます。
保持されるのはおっしゃる通りなのですが、NativeClient接続では日付として扱えていたものが
テキストとして認識されることで、”-”で区切られた日付風の文字列は書式設定の通り表示さない様で困っています。
ちょっと良くわからないですが、どういう状態になったら解決なのでしょうか。
”yyyy-mm-dd”を”yyyy/mm/dd”にしたら解決だとした場合、SQL ServerのDate型は「2024-02-27」で保持されるので、そういうものです。
Accessで表示する際に変換する、などの対処方法で良いと思います。
※的外れだとすみません
ご丁寧にありがとうございます。
hatenaさんにご教授頂いたこともやってみましたがパラメータが出てしまい断念しました。
そうですよね、なにがしたいかを言葉足らずでした。
社内の受注管理システムを構築しようとしています。
社員数名で操作するのでフォームはできるだけ分かりやすくしようと思っており2歩進んでは3歩下がっている状況です。
1つの受注案件(メインフォーム)に対し、2つの工事(サブフォーム)がある事あるので今回の相談と成りました。
受注金額=工事金額+工事金額
本当は受注メインフォーム上で工事サブフォームの工事金額の合計を参照したいのですが工事が2つある場合レコードでマウスでクリックしなければ次ページが見れないので次ページを見なくとも、メイン上で合計が見れればと思いました。
やっていて、クエリではなくメインフォーム上でテキストボックスも作成してみましたが上手く行きませんでした。
hatenaさん。。。。。。。。。^^
会社でメインフォームのチェックボックスから
サブフォームのチェックボックスへのデータのやりとり うまくいきました。。。。^^
ホントにホントにありがとうございます^^
メッセージ通り、クエリ内に[工事番号]が複数あるのでどちらのテーブルを参照したらいいか分からないということです。
どちらのテーブルのものかを指定してあげればいいです。
受注番号が数値型の場合
工事番号がテキスト型の場合
※テーブルの説明とメッセージのフィールド名が異なりますが、テーブルの方(受注番号)が正しいと仮定してます。
ただし、DSum関数は重い処理になりますので、集計クエリと連結した方が処理速度は速くなります。
クエリが増えるのがいやならサブクエリを使うという方法もあります。調べてみてください。
ただ、クエリで集計値と個別の値を同時表示するという要件はあまりないように思いますが、どういう状況でしょうか。
もし、レポート内で集計値を表示したいのなら、レポートのグループフッターのテキストボックスに =Sum([受注金額]) と設定することでグループ別の集計を表示させることはできます。
新しく総合計のみのクエリを作り、集計で合計金額は出せるようになりました。
クエリが増えて行くのがややこやしいですが、とりあえずこれでやってみます。
私の質問に明確に回答していただけないようなので、
こちらで勝手に推測して回答します。
メインフォームは非連結(「レコードソース」プロパティが空欄)
メインフォーム上のチェックボックスの名前
Chk北海道、Chk秋田、・・・Chk沖縄 (48個)
サブフォームコントロールの名前
SubMST実査実績一覧
サブフォームのレコードソースの設定値 MST実査実績一覧
サブフォーム上のチェックボックス
名前とコントロールソースの設定値は同じでそれぞれ下記のように設定されている。
北海道、秋田、・・・沖縄 (48個)
やりたいことは、
メインフォーム上のコマンドボタン「新規登録」のクリックで、
メインフォームの各チェックボックスの値を、
サブフォームの新規レコードのYes/No型のフィールドに転記する。
以上の推測での回答です。
解説
サブフォームのレコードセットは、フォームが開いたときにすでに生成されているので
ADOでRs.Openする必要はない。
Me.埋め込み1.Form.Recordset でレコードセットを取得できるのでそれに対して転記処理を実施すればよい。
以上です。
これでこの件に関しては私からのアドバイスは終わりとさせていだきます。
これのことです。。。。。。。。。;;
⇃
ID 数値型 主キー
年月日 日付時刻型
担当者 テキスト型(短いテキスト)
都道府県 整数型
北海道 Yes/No型
秋田 Yes/No型
・
・
・
沖縄 Yes/No型
もちろんhatenaさんの指示通りにせっていました。。。
メインフォームのチェックボックスのレコードが
サブフォームに、、、レコード移行できないのって。。。
いろいろバタバタしちゃって。。。遅くなっちゃいました。。。;;
ごめんなさい
あたしいろいろ考えてたんですけど
Me.SugMST実査実績一覧.Form.Filter=""
Me.SubMST実査実績一覧.Form.FilterOn=False
があるとこが、、、おかしいのかな???って思いました。。。;;
メインフォームとサブフォーム それぞれに設定するのかな???
お二人ともありがとうございます!
そういう引当ての方法は知りませんでした。参考になります!
Access-SQLの構文で抽出条件を記述するなら
になります
ただし、Access-SQLには以下のような問題があるようなので
参照先のコンテンツに掲載されているラッパー関数を用いて
以下のように記述すればいいでしょう
typoでした。㉗IDをです。
機種依存文字を変えてみるとどうでしょうか?
例えば ㉗UD を No27ID とか。
hatenaさん。。。。。。。。;;ありがとうございます。。。^^
明日またがんばります。。。。^^
ホントにありがとうございます
アルファベットに囲まれた"ー"を含むレコードを抽出するだけであれば可能でしょうか?という意味です!
抽出したレコードのどの"ー"を置換するかは、フォームか選択クエリ上で目視・手動で行おうと思います。
ですので抽出条件のみ書き方が分かればOKかなと思います。
コード提示ありがとうございます。
確認してみます。
その場合も「前後がアルファベットに挟まれた「ー」の場合は置換する」という判断をクエリで行うのがとても難しいと思います。
不可能では無いかもしれませんが、クエリにこだわらないほうが良いかと。
mayuさんが下記に例を記載されていますが、このようなVBAを使用する方法が良いのではないかと思います。
上記の様に変更して、
引数を省略したは全レコードをチェック、引数が指定してあればその引数間のレコードを対象に...
()の中で使い分けができるなんて!!とても助かります。
これで細かいチェックもできます!ありがとうございました
■正規表現版
■InStr関数+ループ版
■SQL
■結果
なるほどです。
であれば、前後がアルファベット(大文字・小文字問わず)だけであれば抽出は可能でしょうか?
以前も同じような質問がありましたが、プログラムでは「zawaーzawa」→変換対象、「トーキョー」→問題ないので変換しない、という判断が難しいと思います。
「半角文字に囲まれている場合は変換対象」等では判断できるかもしれませんが、そういった複雑な判断はクエリにあまり向きません。
私が提示した書式で、
すべて実際のフォームのデザインビューで設定値を確認したものを提示したください。
下記の書式でお願いします。
メインフォームのデザインビューで確認
フォーム名 実際の設定値
レコードソース 実際の設定値
メインフォーム上の1番目のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値
メインフォーム上の2番目のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値
メインフォーム上の最後のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値
メインフォーム上のサブフォームコントロール
名前 実際の設定値
サブフォームのデザインビューで確認
レコードソース 実際の設定値
既定のビュー 実際の設定値
サブフォーム上の1番目のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値
サブフォーム上の2番目のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値
サブフォーム上の最後のチェックボックス
コントロールソース 実際の設定値
名前 実際の設定値
テーブル MST実査実績一覧
フィールド名とデータ型を列挙してください。
下記のような書式でお願いします。
ID 数値型 主キー
年月日 日付時刻型
担当者 テキスト型(短いテキスト)
都道府県 整数型
北海道 Yes/No型
秋田 Yes/No型
・
・
・
沖縄 Yes/No型
サブフォームのソースコードとはなんでしょうか。
サブフォームのレコードソースのこと?
それともサブフォームのチェックボックスのコントロールソースのこと?
????
もし、コントロールソースのことなら、空欄にしないでください。
現状のままにしておいてください。
正確な用語を使ってください。不正確な用語を使っていては状況が伝わりません。
用語の意味を理解するようにしてください。
分からない用語があったら検索して調べてください。
分からない場合は、質問してもらっていいです。
勝手に解釈しないでください。
まだ、解決策を提示していません。というかできません。
まずは、そちらの状況を正確に確認する作業が必要です。
hatenaさん。。。。。。。。ごめんなさい。。。。。;;
サブフォームのソースコード空欄じゃなかったです。。。。。。。。。。;;
設定したつもりないのに それぞれに値がはいってました。。。
すべて空欄にして挑戦してます。。。^^
むずかしいよぉぉぉ。。。。。。;;
色々とありがとうございます。だからMe.FilterOn = (strFilter <> "")もいけたのですね。
厳密にしようとすると細かい事が一杯ありますね。全然知らないのと少しでも知っているのでは意図しない動作の時に違うなと思いました。これも奥の深いことですね。さらっと出来る方々がすごいです。
NULL
は比較演算子による演算ができません詳しいことはかなり複雑なので、一通り情報に目を通してみてください
https://www.google.com/search?q=VBA NULL 比較
本来、
Null
の可能性がある場合の比較は、特別な処理・特別な判定をする必要がありますが、「VBAにおいてはNull
を比較演算に使うと全てFalse
として扱われる」という特徴があります。(コードの実装としてこれを活かすのは本来よろしくありません)つまり、
とすると、コンボボックスの値に関わらず常に
False
の処理が為されるため、意図しない動作をします逆に、
<>""
の判定においてコンボボックスの値がNull
の場合はFalse
を返して欲しいときにはFalse
だった場合の処理がされるので表面上は問題なく動作しているというわけです今回のような場合であれば、コンボボックスの値をチェックして
Null
比較をしないようにするのが正解で、事前にコンボボックスの値をチェックしてコンボボックスの値がNull
だったら""
とみなすようにします。たとえばNz関数を使ってNz 関数
蛇足
Null
なら空文字とみなしたいなら「"" & Me!cb1 <> ""
」くらいの手抜きで済ませちゃうんですけどね何度もすみません、最後に一つだけ質問があります。hatenaさんから最初に頂いた回答の下記を使いプロシージャを作成しました(setFilter1として)。
If Me.[cb1].Value <> "" Then
strFilter = strFilter & " AND フィールド1=" & Me.[cb1].Value
End If
***
****
strFilter = Mid(strFilter, 6) '先頭の" AND "を削除
Me.Filter = strFilter
***
そしてコンボ更新後イベントにCall setFilter1で実行しました⇒上手くいきました。(これはすごく便利です!)
質問はIf Me.[cb1].Value <> "" Thenの右辺です。ここを<>Nullにすると条件に引っかかりません。もう少し様子みるとこのフォームにはフィルター解除ボタンがあり Me.[cb1] = Null *** Me.FilterOn = False
で解除しており、その実行直後なら<>Nullでもいけますが、コンボ値を他の値に選択では<> ""でないと駄目です。
これで機能しているので問題ないのですが、それが不思議で。””とNullの違いはネットで確認しました。
この場合は<>””が妥当なのでしょうか?
チェックしたい範囲を引数で渡すようにすればいいでしょう。
ただし、指定した範囲だけチェックしたいのなら、その範囲のレコードを抽出して並び替える必要があります。
引数を省略できる設定があります。引数の前に Optional をつけます。
VBA 省略可能な引数 Optional と名前付き引数
引数を省略したは全レコードをチェック、引数が指定してあればその引数間のレコードを対象にするというふうにすればいいでしょう。
上記を考慮すると下記のようなコードになります。
使用例
DMin関数とDmax関数を使用して、テーブルに保存されているIDの最小値から最大値の中でチェックできました。本当にありがとうございます。うまくいかなかったというよりは
最小値や最大値だけでなく、IDが34まで増えたときに19から22の間だけ、27から34の間だけで数値を並び替えて同じようにIDの連番をチェックするときは、どうすればいいんだろうと疑問に思ったからです。
MinId = DMin("ID", "T1"): MaxID = DMax("ID", "T1")の部分を、MinId =19 や MinId =27 MaxID =22 や MaxID=34と書き換えてSub を2つ作れば、私でもできるけど...
同じ処理をするのなら、きっともっと良い方法があるんだろうと邪推しました。お願いできますか?