Microsoft Access 掲示板

views
4 フォロー
6,281 件中 1,481 から 1,520 までを表示しています。
1
hiroton 2023/08/18 (金) 14:43:35 a430d@f966d

クエリのデザインビューで目的のクエリを作成して、SQLビューに切り替えて確認してみるといいですよ


エラーメッセージが謎すぎますよねぇ
元(英語)のエラーメッセージはタブン「You tried to execute a query that does not include the specified expression <name> as part of an aggregate function.」で、Google翻訳かけてさらに意訳すると、「集計関数に<name>が存在しないため、クエリを実行できません」といったところでしょう

クエリで集計を行う場合、出力する全てのフィールドで何らかの集計の指定、またはグループ化の指定が必要になります
問題のクエリはグループ化の指定がないため、「氏名」を何らかの集計方法だとして処理しようとして「『氏名』という集計方法はないですよ」とエラーを出しているわけです

4
kitasue 2023/08/16 (水) 17:51:45 5eced@95fbc

これです、これです。
どうもありがとうございました。

2
kitasue 2023/08/16 (水) 10:24:06 5eced@95fbc

hatenaさん、返信ありがとうございます。
クエリの条件式をVBAで作成したいのですが、条件式を生成する関数(?)があったような薄い記憶があるのですが、思い出せません。

1

ぼんやりしすぎです。
もう少し具体的に説明してもらえませんか。

どこでどのように使いたいのか。
VBAなのか、コントロールソースなのか、クエリなのか、、、、

4
みみ 2023/08/14 (月) 09:40:48 1df5a@7f7ac

hatenaさん hirotonさん ありがとうございます。
どうしてもエラーになってしまうので、今回は出力までの期間が短い為、そもそもの時間表示を90分、120分等とすることにしました。
ただ、コントロールソースでの関数で表記の変更が可能ということがわかったので、
次回の更新時に向けてゆっくり勉強していってみようと思います。

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

3
hiroton 2023/08/13 (日) 07:15:27 4f92a@2ee8f

00分を消すだけなら

=Replace( [休憩時間], "00分", "")

でいいんじゃないかな

Replace 関数

2

ありがとうございます。データ型はテキストです。
テキストのまま
=Format([休憩時間],IIf([休憩時間]=0,"h時間","h時間nn分")
のようにしたら、#Type!と出てしまいました。。

2
ベベネコ 2023/08/10 (木) 15:09:08 ad10d@5908c >> 1

ご対応ありがとうございます。
とても参考になりました。実際に設定してみます。

1
hatena 2023/08/09 (水) 18:08:09 修正

休憩時間フィールドのデータ型は、日付/時刻型でしょうか。

だとしたら、レポート上のテキストボックスのコントロールソースを下記のように設定すればいいでしょう。

=Format([休憩時間],IIf(Minute([休憩時間])=0,"h時間","h時間nn分")

※コードに間違いがあったので修正しました。

1
hatena 2023/08/09 (水) 15:50:38 修正

コンボボックスの値集合ソースをクエリにして、抽出条件で他のコンボボックスの値を除去するようにすればいいでしょう。
さらに、VBAかマクロでコンボボックスのフォーカス取得時に自身を再クエリするようにします。

例えば、コンボ1、コンボ2、コンボ3 とあって、
リストに、テーブル1 の フィールド1 のデータが表示されているとして、

コンボ1の値集合ソースを下記のように設定します。

SELECT フィールド1 FROM テーブル1 WHERE フィールド1<>[コンボ2] AND フィールド1<>[コンボ3]; 

フォーカス取得時のイベントプロシージャに下記のコードを記述

Private Sub コンボ1_Enter()
    Me.コンボ1.Requery
End Sub

コンボ2、コンボ3 も同様に設定します。

14
猫好き 2023/08/08 (火) 16:26:21 c198b@a465a

hiroton様

なるほど「数字」に限定して抽出するように関数を考えれば、私でも関数でできそうな気がします。

VBA一つずつ勉強してみます。いろいろ、考えて下さりありがとうございました。

13

そもそも「数字」を見つけたいのだから「間違ってヒットしてしまわないような単語({})を用意する必要はなく、ヒットさせる文字自体も変換する必要ないのだからもっと短くなるね

式1: Val("0" & Mid([フィールド],InStr(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace([フィールド] & "0","1","0"),"2","0"),"3","0"),"4","0"),"5","0"),"6","0"),"7","0"),"8","0"),"9","0"),"0")))

まだまだ頭が固い証拠

12
hiroton 2023/08/04 (金) 15:56:22 d10a0@f966d

文字列操作はパターンが膨大になりがちで、ちょっと込み入ったことををやろうとすると考えなければならないことが数多く出てきます。「数多く」に対応しようとすれば当然計算式も長くなってしまいますね

このような目的を達成するにはプログラミング的思考が重要になってくるので、そうなれば、その思考をそのまま表現できる手法(VBA)を用いたほうがシンプルにはできるでしょう

どこまでの内容ならVBAにすべきか?というのは難しいところですけどね

11
hiroton 2023/08/04 (金) 14:30:03 d10a0@f966d >> 7

もうちょっと頭を柔らかくしてみる

式1: Val("0" & Mid([フィールド],InStr(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace([フィールド] & "{}","0","{}"),"1","{}"),"2","{}"),"3","{}"),"4","{}"),"5","{}"),"6","{}"),"7","{}"),"8","{}"),"9","{}"),"{}")))

無理やり短くする

式2: Val("0" & Mid([フィールド],Eval("InStr(" & Replace("//////////","/","Replace(") & """" & [フィールド] & "{}"", " & Replace("""0/1/2/3/4/5/6/7/8/9/","/",""", ""{}""), """) & "{}"")")))

※Evalは~(略)
10
猫好き 2023/08/04 (金) 11:51:42 c198b@a465a

hiroton様

Accessの関数を考えて下さり、ありがとうございます。
ものすごく長い計算式になってしまうのですね。

データが少なければExcelでも良いのですが、Volumeがあるので、Accessで出来ればと思い、色々試行錯誤しております。

9
猫好き 2023/08/04 (金) 11:44:56 c198b@a465a

hatena様

YouTubeもあるのですね。

サンプルを実際に作成→動作確認 やってみます。

的確なアドバイスありがとうございました。

8

人にもよると思いますが、独学は十分可能だと思います。

まずは入門サイトを検索してみてわかりやすそうなサイトで学習してみてはどうてしょう。
あるいは、本屋さんで入門書をみてわかりやすそうなものを一冊購入して読んでみてもいいでしょう。
最近なら、YouTubeでもいろいろありそうです。

どちらにしても、読むだけではなく、そこにあるサンプルを実際に作成してみて、動作を確認しながら進めていかないと、身にはつきません。ですので、自分が将来使いそうなサンプルがあるサイトや書籍から取り組むのかいいでしょう。

7
hiroton 2023/08/04 (金) 10:49:57 d10a0@f966d

ACCESSの関数を使ってやるなら
その1

式1: Val("0" & Mid([フィールド],Len(Left(Left(Left(Left(Left(Left(Left(Left(Left(Left([フィールド],InStr([フィールド] & "0","0")),InStr([フィールド] & "1","1")),InStr([フィールド] & "2","2")),InStr([フィールド] & "3","3")),InStr([フィールド] & "4","4")),InStr([フィールド] & "5","5")),InStr([フィールド] & "6","6")),InStr([フィールド] & "7","7")),InStr([フィールド] & "8","8")),InStr([フィールド] & "9","9")))))

その2

式2: Val("0" & Mid([フィールド],InStr(Eval("IsNumeric(""" & Replace(Format([フィールド],Replace(String(Len([フィールド]),"&"),"&","&}{") & "&"),"}{",""")+0 & IsNumeric(""") & """)+0") & "-","-")-1))

※Eval関数が入力できないようなのでEvalを全角で記入しています

既存データの整形をしたいってだけならExcelでごりごりやるのが簡単だと思うけどね

6
猫好き 2023/08/04 (金) 08:23:08 c198b@a465a

hatena様

VBAは全く分からないのですが、仰る通りにしたら、抽出したいものが返りました。
ありがとうございます。助かりました。

自分でもう少しできるようしたいのですが、VBAは独学では難しいでしょうか。

5

標準の関数だけでやるのは難しいので、VBAでユーザー定義関数を作成してそれを利用することになりますね。

標準モジュールに下記の関数をコピーして貼り付けてください。

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

クエリのフィールド欄に下記の式を設定します。

外注単価: GetVal([規格・型番])

以上です。
データに数値が含まれない場合は、0 を返すようになってます。

4
猫好き 2023/08/03 (木) 16:17:58 c198b@a465a

言葉足らずで申し訳ありません。

そのフィールドにしか外注単価(1.50とか2.0とか)がないので、数値のみ抽出したいです。

3

AR→1.50
なら、AR→ という文字列データと 1.5 という数値データに分割ということですか。

TS→全 は数値はないですが、どうしますか。

2
猫好き 2023/08/03 (木) 16:08:49 c198b@a465a

ありがとうございます。

売上データの中に 規格・型番フィールドがあります。その規格・型番フィールドのデータの中に外注単価が含まれています。

以下のようなデータがあります。空白データもあります。微妙に文字列にブランクが入っているものもあります。
AR→1.50、AR→1.5、AR2.0、N 2.0、N 1.50、TS→全、ニレジ→全、中尾ー>全、フジワラ→全

1

処理したいデータ例を提示してもらえませんか。
業者名はもちろん仮名でいいので。

3

なぜだか、Excelでは正しく識別される外字がAccessだと同一と識別されてしまいます。
Queryのグループ化やテーブルのインデックス(重複を許可しない)で確認。

Access データベースの並び順序(照合順序)はファイルごとに異なり、
Windows システムやその環境下で実行される他のアプリケーションのそれとは
必ずしも一致しません。

1

「外字置換内字」とは何でしょうか。
「外字Unicode」と「内字Unicode」という用語も初めて見ました。

それらについて解説してもらえますか。

7

できることならテーブルのプロパティで制限がかけられると良いですね

同感です。見た目が同じなのに結果が異なるのはトラブルの元です。

具体的には、テーブルのデザインビューで、フィールドプロパティを下記のように設定すれば、Nullになることはないので空文字列("")かどうかのみ考慮すればOKになります。

プロパティ設定値
空文字列の許可はい
値要求はい

質問の式も下記ですみます。

式1: IIf([フィールド2]="","9999","")

Like "*" でデータが抜け落ちることもなくなります。

6
nanana 2023/07/26 (水) 08:38:01 e48ae@9a838

お二方ともありがとうございました。
式を書き換え、なんとか今回の目的は解決できました。
このサイトはいつも皆様に助けて頂き、非常に感謝しております。
日々勉強になります。

5
hiroton 2023/07/25 (火) 18:22:53 c0930@f966d

Nullについて(もう一度学ぶMS-Accessさん)

""(空文字列(長さ0の文字列))とNullは画面上で見たときの見た目が同じだけでデータとしては別物です

異なるデータなので、並び替えをすれば、それぞれがひとまとまりになって並び変わります(どちらが先になるかは若干複雑でACCESSならNULLが先となります)

NULLは非常に厄介な問題(比較はIs Nullとしなければならない、「全て」を抽出したつもり(Like "*")でデータが抜け落ちる等々多数)を持っています。できることならテーブルのプロパティで制限がかけられると良いですね

4
nanana 2023/07/25 (火) 17:36:58 e48ae@9a838

おっしゃる通り、テキスト型です。
ご指摘の式1の形に書き換え、[フィールド2]の並べ替え設定を削除し、式1を昇順に設定すると期待通りの並びになりました。

ということは、空白でも""とNullで並び替えの分別対象になる、ということになるという認識であっていますでしょうか?

3

[フィールド2]のデータ型はなんでしょうか?

テキスト型(短いテキスト)なら、

式1: IIf([フィールド2]="" Or [フィールド2] Is Null,"9999","")

です。NullはイコールではなくIs演算子で判定します。

数値型なら、
式1: IIf([フィールド2] Is Null,9999,Null)
となります。
""はテキストなので数値型との比較には使えません。

2
nanana 2023/07/25 (火) 13:39:51 e48ae@9a838

ご連絡ありがとございます。

自身でもいろいろと調べていたのですが、クエリのフィールド名【フィールド2】の隣に
【式1: IIf([フィールド2]="" Or [フィールド2]=Null,"9999","")】をいれてクエリを実行すると、
【フィールド2】がすべて空白にもかかわらず、式1のフィールドに【空白】が返ってくるものと、【9999】が返ってくるものが存在しました。

これが並べ替えできない原因な気がするのですが、式1のフィールドに【空白】が返ってくるものは、【フィールド2】に
何が入っていると認識されているのでしょうか?スペースが入っているのかと確認しましたが、入っていません。

【症状の再現できる現状のSQLとデータ例】ですが、多数のフィールドがありレコードも多いので提示できる状態にするには少し時間が掛かりそうです。申し訳ございません。上記の情報でなにかコメント頂けると幸いです。

1

同じフィールドにおけるすべてのレコードの値が空白だった場合

「レコードの値が空白」ということはNull値ということですか。
当方で作成したサンプルで確認しましたが、そのような症状は確認できませんでした。

症状の再現できる現状のSQLとデータ例を提示してもらえますか。

10
初老の人 2023/07/22 (土) 05:52:30 cfdf6@5b06d

原因が判明しましたので報告いたします。(現在モニターを2台接続している)
過去に、アクセスを2画面(1,2)で運用していました。今回はメイン(1)のモニターのみ起動していましたので、もしやと思いもう一つのモニターを立ち上げてアクセスを起動したところ(2)の画面に表示され運用できることが判明しました。(2)のモニターケーブルを切断すると(1)の画面に表示できるようになりました。
ただ、2つのモニターを接続した状態で片方のモニターの電源を切断しているのに(ACCESS)のみ運用できないのかわかりません。このような状況を経験され解消(?)されたならご指導いただけると助かります。
この件は、半分解消されましたので「解決」といたします。

9
初老の人 2023/07/22 (土) 05:48:39 cfdf6@5b06d >> 4

原因が判明しましたので報告いたします。(現在モニターを2台接続している)
過去に、アクセスを2画面(1,2)で運用していました。今回はメイン(1)のモニターのみ起動していましたので、もしやと思いもう一つのモニターを立ち上げてアクセスを起動したところ(2)の画面に表示され運用できることが判明しました。(2)のモニターケーブルを切断すると(1)の画面に表示できるようになりました。
ただ、2つのモニターを接続した状態で片方のモニターの電源を切断しているのに(ACCESS)のみデータと取得できないのかわかりません。このような状況を経験され解消(?)されたならご指導いただけると助かります。
この件は、半分解消されましたので「解決」といたします。

17
nokonoko 2023/07/21 (金) 11:36:52 3e2e6@54883

11のところで抜粋したものについてはCesllになぜかなっていましたが、
抜粋前の本コードのほうはCellsであっていましたが、hiroton様指摘の通り、entirerowの後にスペースがあることによってエラーが出たことがわかりました。

いずれにせよ、当方の非常に初歩的なミス、プラスおっちょこちょいでした。

お二方には改めてお礼を申し上げます。
今後は、このようなことがないように、利用させていただきます。

16
nokonoko 2023/07/21 (金) 11:07:09 3e2e6@54883

失礼しました
Cesllになってました。
直したら、動きました。

こんなくだらないことに、たくさん回答いただき、大変申し訳ないです。
Hiroton様もありがとうございました。

ほかに問題がないか後で検証します。

15
nokonoko 2023/07/21 (金) 11:04:14 3e2e6@54883

ありがとうございます。

コメントアウトなどの処置をして、検証しました。

xls.Range(xls.cesll(21 + intNumRow, 1), xls.cells(21 + intNumRow + intGNumRow, 1)).entirerow.Insert

のところで、「実行時エラー‘438‘: オブジェクトは、このプロパティまたはメソッドをサポートしていません。」が出ます。

その前までは、望んでいるような結果が出ています。