エラーメッセージが謎すぎますよねぇ
元(英語)のエラーメッセージはタブン「You tried to execute a query that does not include the specified expression <name> as part of an aggregate function.」で、Google翻訳かけてさらに意訳すると、「集計関数に<name>が存在しないため、クエリを実行できません」といったところでしょう
Public Function GetVal(s) As Currency
If Nz(s) = "" Then Exit Function
Dim i As Long
For i = 1 To Len(s)
If IsNumeric(Mid(s, i, 1)) Then
GetVal = Val(Mid(s, i))
Exit For
End If
Next
End Function
クエリのデザインビューで目的のクエリを作成して、SQLビューに切り替えて確認してみるといいですよ
エラーメッセージが謎すぎますよねぇ
元(英語)のエラーメッセージはタブン「You tried to execute a query that does not include the specified expression
<name>
as part of an aggregate function.」で、Google翻訳かけてさらに意訳すると、「集計関数に<name>
が存在しないため、クエリを実行できません」といったところでしょうクエリで集計を行う場合、出力する全てのフィールドで何らかの集計の指定、またはグループ化の指定が必要になります
問題のクエリはグループ化の指定がないため、「氏名」を何らかの集計方法だとして処理しようとして「『氏名』という集計方法はないですよ」とエラーを出しているわけです
これです、これです。
どうもありがとうございました。
BuildCriteriaメソッドのことでしょうか。
Application.BuildCriteria メソッド (Access) | Microsoft Learn
hatenaさん、返信ありがとうございます。
クエリの条件式をVBAで作成したいのですが、条件式を生成する関数(?)があったような薄い記憶があるのですが、思い出せません。
ぼんやりしすぎです。
もう少し具体的に説明してもらえませんか。
どこでどのように使いたいのか。
VBAなのか、コントロールソースなのか、クエリなのか、、、、
hatenaさん hirotonさん ありがとうございます。
どうしてもエラーになってしまうので、今回は出力までの期間が短い為、そもそもの時間表示を90分、120分等とすることにしました。
ただ、コントロールソースでの関数で表記の変更が可能ということがわかったので、
次回の更新時に向けてゆっくり勉強していってみようと思います。
ありがとうございました。
00分
を消すだけならでいいんじゃないかな
Replace 関数
ありがとうございます。データ型はテキストです。
テキストのまま
=Format([休憩時間],IIf([休憩時間]=0,"h時間","h時間nn分")
のようにしたら、#Type!と出てしまいました。。
ご対応ありがとうございます。
とても参考になりました。実際に設定してみます。
休憩時間フィールドのデータ型は、日付/時刻型でしょうか。
だとしたら、レポート上のテキストボックスのコントロールソースを下記のように設定すればいいでしょう。
※コードに間違いがあったので修正しました。
コンボボックスの値集合ソースをクエリにして、抽出条件で他のコンボボックスの値を除去するようにすればいいでしょう。
さらに、VBAかマクロでコンボボックスのフォーカス取得時に自身を再クエリするようにします。
例えば、コンボ1、コンボ2、コンボ3 とあって、
リストに、テーブル1 の フィールド1 のデータが表示されているとして、
コンボ1の値集合ソースを下記のように設定します。
フォーカス取得時のイベントプロシージャに下記のコードを記述
コンボ2、コンボ3 も同様に設定します。
hiroton様
なるほど「数字」に限定して抽出するように関数を考えれば、私でも関数でできそうな気がします。
VBA一つずつ勉強してみます。いろいろ、考えて下さりありがとうございました。
そもそも「数字」を見つけたいのだから「間違ってヒットしてしまわないような単語(
{}
)を用意する必要はなく、ヒットさせる文字自体も変換する必要ないのだからもっと短くなるねまだまだ頭が固い証拠
文字列操作はパターンが膨大になりがちで、ちょっと込み入ったことををやろうとすると考えなければならないことが数多く出てきます。「数多く」に対応しようとすれば当然計算式も長くなってしまいますね
このような目的を達成するにはプログラミング的思考が重要になってくるので、そうなれば、その思考をそのまま表現できる手法(VBA)を用いたほうがシンプルにはできるでしょう
どこまでの内容ならVBAにすべきか?というのは難しいところですけどね
もうちょっと頭を柔らかくしてみる
無理やり短くする
hiroton様
Accessの関数を考えて下さり、ありがとうございます。
ものすごく長い計算式になってしまうのですね。
データが少なければExcelでも良いのですが、Volumeがあるので、Accessで出来ればと思い、色々試行錯誤しております。
hatena様
YouTubeもあるのですね。
サンプルを実際に作成→動作確認 やってみます。
的確なアドバイスありがとうございました。
人にもよると思いますが、独学は十分可能だと思います。
まずは入門サイトを検索してみてわかりやすそうなサイトで学習してみてはどうてしょう。
あるいは、本屋さんで入門書をみてわかりやすそうなものを一冊購入して読んでみてもいいでしょう。
最近なら、YouTubeでもいろいろありそうです。
どちらにしても、読むだけではなく、そこにあるサンプルを実際に作成してみて、動作を確認しながら進めていかないと、身にはつきません。ですので、自分が将来使いそうなサンプルがあるサイトや書籍から取り組むのかいいでしょう。
ACCESSの関数を使ってやるなら
その1
その2
既存データの整形をしたいってだけならExcelでごりごりやるのが簡単だと思うけどね
hatena様
VBAは全く分からないのですが、仰る通りにしたら、抽出したいものが返りました。
ありがとうございます。助かりました。
自分でもう少しできるようしたいのですが、VBAは独学では難しいでしょうか。
標準の関数だけでやるのは難しいので、VBAでユーザー定義関数を作成してそれを利用することになりますね。
標準モジュールに下記の関数をコピーして貼り付けてください。
クエリのフィールド欄に下記の式を設定します。
以上です。
データに数値が含まれない場合は、0 を返すようになってます。
言葉足らずで申し訳ありません。
そのフィールドにしか外注単価(1.50とか2.0とか)がないので、数値のみ抽出したいです。
AR→1.50
なら、AR→ という文字列データと 1.5 という数値データに分割ということですか。
TS→全 は数値はないですが、どうしますか。
ありがとうございます。
売上データの中に 規格・型番フィールドがあります。その規格・型番フィールドのデータの中に外注単価が含まれています。
以下のようなデータがあります。空白データもあります。微妙に文字列にブランクが入っているものもあります。
AR→1.50、AR→1.5、AR2.0、N 2.0、N 1.50、TS→全、ニレジ→全、中尾ー>全、フジワラ→全
処理したいデータ例を提示してもらえませんか。
業者名はもちろん仮名でいいので。
Access データベースの並び順序(照合順序)はファイルごとに異なり、
Windows システムやその環境下で実行される他のアプリケーションのそれとは
必ずしも一致しません。
関係あるか分かりませんが
クエリの抽出条件で環境依存の丸数字(㉑~㊿)を含む曖昧検索ができない
「外字置換内字」とは何でしょうか。
「外字Unicode」と「内字Unicode」という用語も初めて見ました。
それらについて解説してもらえますか。
同感です。見た目が同じなのに結果が異なるのはトラブルの元です。
具体的には、テーブルのデザインビューで、フィールドプロパティを下記のように設定すれば、Nullになることはないので空文字列("")かどうかのみ考慮すればOKになります。
質問の式も下記ですみます。
式1: IIf([フィールド2]="","9999","")
Like "*"
でデータが抜け落ちることもなくなります。お二方ともありがとうございました。
式を書き換え、なんとか今回の目的は解決できました。
このサイトはいつも皆様に助けて頂き、非常に感謝しております。
日々勉強になります。
Nullについて(もう一度学ぶMS-Accessさん)
""(空文字列(長さ0の文字列))とNullは画面上で見たときの見た目が同じだけでデータとしては別物です
異なるデータなので、並び替えをすれば、それぞれがひとまとまりになって並び変わります(どちらが先になるかは若干複雑でACCESSならNULLが先となります)
NULLは非常に厄介な問題(比較は
Is Null
としなければならない、「全て」を抽出したつもり(Like "*"
)でデータが抜け落ちる等々多数)を持っています。できることならテーブルのプロパティで制限がかけられると良いですねおっしゃる通り、テキスト型です。
ご指摘の式1の形に書き換え、[フィールド2]の並べ替え設定を削除し、式1を昇順に設定すると期待通りの並びになりました。
ということは、空白でも""とNullで並び替えの分別対象になる、ということになるという認識であっていますでしょうか?
[フィールド2]のデータ型はなんでしょうか?
テキスト型(短いテキスト)なら、
式1: IIf([フィールド2]="" Or [フィールド2] Is Null,"9999","")
です。NullはイコールではなくIs演算子で判定します。
数値型なら、
式1: IIf([フィールド2] Is Null,9999,Null)
となります。
""
はテキストなので数値型との比較には使えません。ご連絡ありがとございます。
自身でもいろいろと調べていたのですが、クエリのフィールド名【フィールド2】の隣に
【式1: IIf([フィールド2]="" Or [フィールド2]=Null,"9999","")】をいれてクエリを実行すると、
【フィールド2】がすべて空白にもかかわらず、式1のフィールドに【空白】が返ってくるものと、【9999】が返ってくるものが存在しました。
これが並べ替えできない原因な気がするのですが、式1のフィールドに【空白】が返ってくるものは、【フィールド2】に
何が入っていると認識されているのでしょうか?スペースが入っているのかと確認しましたが、入っていません。
【症状の再現できる現状のSQLとデータ例】ですが、多数のフィールドがありレコードも多いので提示できる状態にするには少し時間が掛かりそうです。申し訳ございません。上記の情報でなにかコメント頂けると幸いです。
「レコードの値が空白」ということはNull値ということですか。
当方で作成したサンプルで確認しましたが、そのような症状は確認できませんでした。
症状の再現できる現状のSQLとデータ例を提示してもらえますか。
原因が判明しましたので報告いたします。(現在モニターを2台接続している)
過去に、アクセスを2画面(1,2)で運用していました。今回はメイン(1)のモニターのみ起動していましたので、もしやと思いもう一つのモニターを立ち上げてアクセスを起動したところ(2)の画面に表示され運用できることが判明しました。(2)のモニターケーブルを切断すると(1)の画面に表示できるようになりました。
ただ、2つのモニターを接続した状態で片方のモニターの電源を切断しているのに(ACCESS)のみ運用できないのかわかりません。このような状況を経験され解消(?)されたならご指導いただけると助かります。
この件は、半分解消されましたので「解決」といたします。
原因が判明しましたので報告いたします。(現在モニターを2台接続している)
過去に、アクセスを2画面(1,2)で運用していました。今回はメイン(1)のモニターのみ起動していましたので、もしやと思いもう一つのモニターを立ち上げてアクセスを起動したところ(2)の画面に表示され運用できることが判明しました。(2)のモニターケーブルを切断すると(1)の画面に表示できるようになりました。
ただ、2つのモニターを接続した状態で片方のモニターの電源を切断しているのに(ACCESS)のみデータと取得できないのかわかりません。このような状況を経験され解消(?)されたならご指導いただけると助かります。
この件は、半分解消されましたので「解決」といたします。
11のところで抜粋したものについてはCesllになぜかなっていましたが、
抜粋前の本コードのほうはCellsであっていましたが、hiroton様指摘の通り、entirerowの後にスペースがあることによってエラーが出たことがわかりました。
いずれにせよ、当方の非常に初歩的なミス、プラスおっちょこちょいでした。
お二方には改めてお礼を申し上げます。
今後は、このようなことがないように、利用させていただきます。
失礼しました
Cesllになってました。
直したら、動きました。
こんなくだらないことに、たくさん回答いただき、大変申し訳ないです。
Hiroton様もありがとうございました。
ほかに問題がないか後で検証します。
ありがとうございます。
コメントアウトなどの処置をして、検証しました。
のところで、「実行時エラー‘438‘: オブジェクトは、このプロパティまたはメソッドをサポートしていません。」が出ます。
その前までは、望んでいるような結果が出ています。