http://oshiete.goo.ne.jp/qa/5536177.html
こちら↑でExcel版の回答をみつけましたが、
同じことをAccessでやる場合の関数や呼び出し方がわかりません。
※上記質問を一部改変して掲載させていただきます。
禁止文字ではなく許可文字の一覧を用意している点が異なります。
【Accessでやりたいこと】
「◆データ一覧」に、「◆許可文字一覧」が以外の文字が含まれているかをデータチェックしたい。
以下の場合だと、「◆データ一覧の3レコードめ」をエラーレコードとして表示したい。
------------------------------------------
◆データ一覧テーブル
名称
1レコードめ アイウ
2レコードめ A3
3レコードめ ア・A
◆許可文字一覧テーブル
文字
1レコードめ ア
2レコードめ イ
3レコードめ ウ
4レコードめ A
5レコードめ 1
6レコードめ 2
7レコードめ 3
------------------------------------------
以上、よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
#2です。
> Dim rs As New ADODB.Recordset 行で
> で「ユーザ定義型は定義されていません」が出てしまい、
VBE のメニュー「ツール」→「参照設定」で、
Microsoft ActiveX Data Objects X.Y Library を追加してみてください。
X.Y は、2.5 とか 2.8 とか。
2007 をメインで使ってますが、2000 形式にしたりするので、私は 2.5 を参照してますけど。
なお、DAO でする場合は以下のような感じに
Public Function DicMake() As Boolean
Dim rs As DAO.Recordset
If (dic Is Nothing) Then Set dic = CreateObject("Scripting.Dictionary")
dic.RemoveAll
Set rs = CurrentDb.OpenRecordset(sTable)
While (Not rs.EOF)
dic.Item(rs(sField).Value) = Null
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
DicMake = True
End Function
仕様がもう少し固まっていれば・・・記述も変わってきます。
#2では、
「名称」内に許可文字が複数回出現しても、それは許可しています。
(「名称」が "アイアイ" であっても許可)
また、「文字」が1文字長でなくても処理できるように冗長にしています。が、
許可の「文字」が、"アイ" "ア" であった場合、処理順を考える必要があります。
"アイアイ" を "アイ" "ア" の順で処理すると、全て削除され表示対象になりませんが、
"ア" "アイ" の順で処理すると、"イイ" が残ります。
許可の「文字」が、"イイ" "ア" であった場合、処理順を考える必要があります。
"アイアイ" を "ア" "イイ" の順で処理すると、全て削除され表示対象になりませんが、
"イイ" "ア" の順で処理すると、"イイ" が残ります。
レコードセットを得る時等で、順を考える必要があります。
テーブル名を指定する際に、SQL記述にして順を指定・・・とか
例えば、クエリで見た時の記述(文字列長が長い順で、昇順)
SELECT * FROM 許可文字一覧
ORDER BY Len(文字) DESC, 文字;
を指定するとか・・・
また、出現頻度が高い順に得られていると、少ないループで処理できると思います。
「文字」は1文字長しかない場合、以下の様な記述でも良いのかも・・・
(クエリに変更はありません)
Public Function DicCheck(vSrc As Variant) As Boolean
Dim sS As String
Dim i As Long
DicCheck = True
If (dic Is Nothing) Then Exit Function
If (dic.Count = 0) Then Exit Function
sS = vSrc & ""
For i = 1 To Len(sS)
If (Not dic.Exists(Mid(sS, i, 1))) Then Exit Function
Next
DicCheck = False
End Function
> キャッシュに展開せずに、DicCheck だけを実行する形に
> 変えようとしていますが、うまく修正できません。
#2での 削除する(Replace を使う)方法で毎回レコードセットを得るものにすると
(DAO での例になります)
Public Function DicCheck(vSrc As Variant) As Boolean
Dim rs As DAO.Recordset
Dim sS As String
DicCheck = True
sS = vSrc & ""
Set rs = CurrentDb.OpenRecordset("許可文字一覧")
Do While (Not rs.EOF)
sS = Replace(sS, rs("文字"), "")
If (Len(sS) = 0) Then Exit Do
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
' sS = Trim(sS)
If (Len(sS) = 0) Then DicCheck = False
End Function
の記述だけで、クエリは
SELECT * FROM データ一覧 WHERE DicCheck(名称);
でいけると思います。
「文字」が1文字長しかなかった場合は、FindFirst で検索し、
NoMatch で判断する等いろいろ考えられると思います。
> 許可文字数が150字程度と少ないので
> キャッシュに展開しない方法をご教授いただけないでしょうか。
おそらく、
処理スピードは許可文字の件数ではなく、「名称」の件数に大きく左右されると思います。
(「名称」の件数がどれだけかわかりませんが、1件ごとに OpenRecordset するので・・・)
環境にあった速い方法を見つけられたらと思います。
(Dictionary 展開が速い・・・・ わかりません)
お礼が遅くなり申し訳ありません。
ライブラリを追加してキャッシュに展開するロジックを
活用させていただきました。
何度も丁寧な回答をありがとうございました。
No.6
- 回答日時:
> 許可文字数が150字程度と少ないので
> キャッシュに展開しない方法をご教授いただけないでしょうか。
ということなら、許可文字一覧を1文字1レコードではなく、1レコードに
すべて入れてしまえばどうでしょうか。
◆許可文字一覧テーブル
文字
1レコードめ アイウA123
標準モジュールに下記の関数。
Public Function MeisyouError(Meisyou, ArrowChars As String) As Boolean
Dim c As String
Dim i As Long
MeisyouError = True
If IsNull(Meisyou) Then Exit Function
For i = 1 To Len(Meisyou)
c = Mid(Meisyou, i, 1)
If InStr(ArrowChars, c) = 0 Then
MeisyouError = False
Exit For
End If
Next
End Function
クエリ
SELECT データ一覧.*
FROM データ一覧, 許可文字列
WHERE MeisyouError([名称],[文字]);
No.5
- 回答日時:
30246kikuさんのコード見さていただきました。
さすがですね。Dictionary を使う所など参考になります。
私のクエリの直積を使う方法は、許可文字数やレコード数が多くなると、かなり重くなりそうです。
No.4
- 回答日時:
> データ一覧].名称 は同じ文字を複数含むケースがあるため
> 許可文字だけの場合もエラーレコードとなってしまいます。
そのケースを考慮するのを失念してました。
Q_許可文字数 を下記のように変更してください。
SELECT
データ一覧.名称,
Sum(Len([名称])-Len(Replace([名称],[文字],""))) AS 許可文字数
FROM データ一覧, 許可文字一覧
GROUP BY データ一覧.名称;
これで文字に重複があっても大丈夫だと思います。
お礼が遅くなり申し訳ありません。
質問させていただいた機能は#2さんのロジックを使いましたが、
別の機能で文字数チェックをする必要があり
さっそく回答いただいたSQLを活用させていただきました。
どうもありがとうございました。
No.2
- 回答日時:
一例で良いですか。
VBA でユーザ定義関数を作って、それを呼び出して処理します。
「名称」の文字列から「文字」を1つ1つ削除していき、
最終的に何らかの文字が残っていたら・・・・と考えてみます。
1つ1つを削除する時には、Replace を使用します。
ここで、毎回レコードセット(「文字」を得て、クルクル回す時)を得ていると
遅くなると思うので、「文字」を Dictionary に展開しておいて、メモリ上で処理・・・
「文字」を Dictionary に展開 : DicMake
何らかの文字が残るか : DicCheck
(関数名は適宜変更してください)
標準モジュールに以下を記述します。
Private Const sTable As String = "許可文字一覧"
Private Const sField As String = "文字"
Private dic As Object
Public Function DicMake() As Boolean
Dim rs As New ADODB.Recordset
If (dic Is Nothing) Then Set dic = CreateObject("Scripting.Dictionary")
dic.RemoveAll
rs.Open sTable, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
While (Not rs.EOF)
dic.Item(rs(sField).Value) = Null
rs.MoveNext
Wend
rs.Close
DicMake = True
End Function
Public Function DicCheck(vSrc As Variant) As Boolean
Dim sS As String
Dim v As Variant
DicCheck = True
If (dic Is Nothing) Then Exit Function
If (dic.Count = 0) Then Exit Function
sS = vSrc & ""
For Each v In dic.keys
sS = Replace(sS, v, "")
If (Len(sS) = 0) Then Exit For
Next
' sS = Trim(sS)
If (Len(sS) = 0) Then DicCheck = False
End Function
※ ADO を使ってますが、DAO でも・・・・
※ Trim は必要に応じて・・・・
このユーザ定義関数を使って、クエリを作ります。
(SQLビュー表示にして)
SELECT * FROM データ一覧
WHERE DicMake() AND DicCheck(名称);
※ パラメータ(引数)を持たない DicMake() は1度しか呼ばれません。
なので、WHERE の1番最初に呼び出すことで 「文字」がメモリ上に展開されます。
参考になるかどうか、しっかりと検証はしてください。
この回答への補足
早速回答ありがとうございました。
関数を定義して実行してみたところ、
Dim rs As New ADODB.Recordset 行で
で「ユーザ定義型は定義されていません」が出てしまい、
試しにDim rs As New DAODB.Recordset と書き変えたりしたのですが
如何せん知識不足で対処できませんでした。
そこで、キャッシュに展開せずに、DicCheck だけを実行する形に
変えようとしていますが、うまく修正できません。
許可文字数が150字程度と少ないので
キャッシュに展開しない方法をご教授いただけないでしょうか。
どうぞよろしくお願い致します。
回答ありがとうございました。
補足で再度質問させていただいていますが
こちらも回答いただけるととても有難いです。
引き続きどうぞよろしくお願い致します。
No.1
- 回答日時:
下記のようにクエリを2段に使うことで可能です。
SQLが分からない場合は、クエリのデザインビューの画像を参照してください。名称に含まれる許可文字数を取得するクエリ
Q_許可文字数
SELECT [データ一覧].名称, Count(許可文字一覧.文字) AS 許可文字数
FROM データ一覧, 許可文字一覧
WHERE [データ一覧].名称 Like "*" & [文字] & "*"
GROUP BY [データ一覧].名称;
このクエリとデータ一覧テーブルからクエリを作成
実際の文字数より許可文字数が少ないレコードを抽出
Q_名称エラー
SELECT [データ一覧].名称
FROM データ一覧 LEFT JOIN Q_許可文字数 ON [データ一覧].名称 = Q_許可文字数.名称
WHERE Nz([許可文字数],0)<Len([データ一覧].[名称]);
SQLが理解できるなら、サブクエリを使えば一つのクエリにまとめることができます。
この回答への補足
早速ありがとうございました。
SQLは理解できたのでクエリを作成してみました。
うまく動いたのですが、一つ問題がみつかりました。
[データ一覧].名称 は同じ文字を複数含むケースがあるため
許可文字だけの場合もエラーレコードとなってしまいます。
(例) [データ一覧].名称 アイウアイ
許可文字数 3
Len 5
自分でも試行錯誤しているところですが
なにかアイデアお持ちでしたらレクチャお願いいたします。
回答ありがとうございました。
補足で再度質問させていただいていますが
こちらも回答いただけるととても有難いです。
引き続きどうぞよろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
- Visual Basic(VBA) Accessフォームで全レコードを指定のExcelのセルへ転送し印刷する方法について 2 2022/09/08 18:23
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- その他(音楽・ダンス・舞台芸能) 「録音品質の良い」オススメのレコードを教えてください。 皆様のお持ちのレコードで「これは音がいい!」 8 2022/08/08 14:45
このQ&Aを見た人はこんなQ&Aも見ています
-
好きなおでんの具材ドラフト会議しましょう
肌寒くなってきて、温かい食べ物がおいしい季節になってきましたね。 みなさんはおでんの具材でひとつ選ぶなら何にしますか? 1番好きなおでんの具材を教えてください。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
自分のセンスや笑いの好みに影響を受けた作品を教えて
子どもの頃に読んだ漫画などが その後の笑いの好みや自分自身のユーモアのセンスに影響することがあると思いますが、 「この作品に影響受けてるな~!」というものがあれば教えてください。
-
【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
【お題】 ・急に朝起こしてきた母親に言われた一言とは?
-
Access サブフォームでの選択行の取得
その他(データベース)
-
アクセスのfilter、複数条件の記述方法を教えてください。
Access(アクセス)
-
実行時エラー3131 FROM 句の構文エラーです について
Access(アクセス)
-
-
4
アクセスで数値型のフィールドにNullをいれたい
その他(データベース)
-
5
禁止文字をエクセルかアクセスでチェックする方法について
その他(ソフトウェア)
-
6
sqlに記述できない文字
PostgreSQL
-
7
親フォームからサブフォームのレコードソースを設定
Access(アクセス)
-
8
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
9
ACCSESS2013VBA フォームのレコードソースを変更する
その他(データベース)
-
10
AccessのRefresh・Requery・Repaintの違い
Access(アクセス)
-
11
2つ目のレコードの値を取得するには?
Access(アクセス)
-
12
Accessのレポート上のテキストボックス値を設定したい
その他(データベース)
-
13
Access:クエリーにて集計後に文字列結合したい。
その他(データベース)
-
14
Access VBA SQL文で教えてください
PowerPoint(パワーポイント)
-
15
ACCESS 「パラメータの入力」を消したい!!
Access(アクセス)
-
16
Accessのフィールド名に半角括弧を使ってしまった
Visual Basic(VBA)
-
17
Accessのフォーム上にレコード数とレコード番号の表示
その他(データベース)
-
18
Accessを開くと「排他モードじゃないので変更しても保存できない」との旨の表示が出てしまう。
Access(アクセス)
-
19
サブフォームの行ごとにコンボボックスの表示項目を変更する方法が知りたいです
Visual Basic(VBA)
-
20
Accessのレポートの文字にカッコを追加したい。
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
3つ以上のテーブルをUNIONする...
-
データの二重表示の原因
-
Accessにインポートしたら並び...
-
Access VBA Me.Requery レコー...
-
SQLServerで同一条件レコードの...
-
エクセル テーブル機能の不明点
-
Accessで重複したデータを一件...
-
2つのテーブルからのレコード取得
-
DB2のデーターベースに、ADOで...
-
Access カレントレコードがあり...
-
パススルークエリの使い方
-
キーが重複したレコードを無視...
-
Accessの固有レコード識別子の選択
-
Access 抽出したレコードのうち...
-
SQLデータ修正時に『このレコー...
-
テーブルのレコード削除ができ...
-
2つの項目が重複するレコード...
-
ManagementStudioからのデータ削除
-
Accessでの禁止文字チェック
-
世代管理をするデータベース設...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
データの二重表示の原因
-
Access 1レコードずつcsvで出力...
-
Access VBA Me.Requery レコー...
-
2つの項目が重複するレコード...
-
数百万件レコードのdelete
-
非連結サブフォームのレコード...
-
ACCESSのBookmarkプロパティの...
-
Access 削除クエリが重い
-
ManagementStudioからのデータ削除
-
SQLServerで同一条件レコードの...
-
Access カレントレコードがあり...
-
Accessでの禁止文字チェック
-
Accessでの排他制御
-
テーブルのレコード削除ができ...
-
Accessの重複クエリで最小以外...
-
(ACCESS)並び替えをしないで...
-
Accessでレコードが更新された...
-
Accessで重複したデータを一件...
おすすめ情報