質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

866閲覧

Access テーブルの全データに対して、桁溢れチェックを行いたい

access

総合スコア9

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2023/02/09 11:38

実現したいこと

Access のテーブルの全データに対して、桁溢れチェックを行いたい。

ここに実現したいことを箇条書きで書いてください。

  • AccessDB の 1つのテーブル(以下、T_本)の全データに対し、桁溢れしていないかチェックをしたい。
  • 最終列に "桁溢れ" という名称のフィールドを1つ追加し、そこに "桁溢れしたフィールド名"を追加したい。

T_本:
イメージ説明

欲しい結果:
イメージ説明

前提

  • 画像では6フィールドしかチェックしてないが、実際は40フィールド程度ある。
  • 各フィールドにそれぞれ上限桁数が決まっている

試したこと

①テーブルAに "桁溢れ" フィールドを追加
②テーブルAをレコードセットとして取得し、1レコードずつ桁あふれチェックする。
③桁あふれが発生したら、カレントレコードの最終列に移動し、桁溢れしたフィールド名を書き込む。

Sub test()

'桁溢れ列追加 CurrentDb.Execute "ALTER TABLE [T_本] ADD COLUMN [桁溢れ] TEXT(255)" 'レコードセット取得 Dim rs As New ADODB.Recordset rs.Open "T_本", CurrentProject.Connection 'レコードセット Do Until rs.EOF Dim var As Variant Dim fld As ADODB.Field 'フィールド移動 For Each fld In rs.Fields [桁溢れしていたら最終フィールドへ移動して、フィールド名を書き込む] [移動元のフィールドへ戻る] Next fld rs.MoveNext Loop rs.Close

End Sub

問題点

[桁溢れしていたら最終フィールドへ移動して、フィールド名を書き込む]
ここの処理が分かりません。
そもそも、"桁溢れ発生" ⇒ "最終フィールドへ移動" ⇒ "移動元のフィールドへ戻る" なんてことはできるのでしょうか?

補足情報(FW/ツールのバージョンなど)

office365 Access

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんな感じでどうでしょう。

ただし、

  • DAO向けに書かれているのでADOなら適宜書き換えが必要。
  • Microsoft Scripting Runtimeが参照設定されているので、されていない環境ならCreateObject("Scripting.Dictionary")に書き換えが必要。
  • 「桁溢れ」列の「ALTER TABLE」は処理済とし割愛。

vba

1 2Sub test() 3 4 Dim dicRule As Dictionary 5 Dim strOverflowColNames As String 6 Dim varColName As Variant 7 Dim rst As Recordset 8 9 Const conSeparater As String = "、" 10 11 Set dicRule = New Dictionary 12 dicRule.Add "タイトル", 8 13 dicRule.Add "著者", 7 14 dicRule.Add "出版社", 6 15 16 Set rst = CurrentDb.OpenRecordset("T_本") 17 Do Until rst.EOF 18 strOverflowColNames = vbNullString 19 For Each varColName In dicRule 20 If (Len(rst(varColName).Value) > dicRule(varColName)) Then 21 strOverflowColNames = strOverflowColNames & conSeparater & varColName 22 End If 23 Next 24 25 If strOverflowColNames <> vbNullString Then 26 rst.Edit 27 rst("桁溢れ") = Mid(strOverflowColNames, Len(conSeparater) + 1) 28 rst.Update 29 End If 30 rst.MoveNext 31 Loop 32 33 Set rst = Nothing 34 Set dicRule = Nothing 35End Sub 36

投稿2023/02/14 11:04

kappa

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kappa

2023/02/14 11:36

ああ、意味的には、 Dim varColName As Variant For Each varColName In dicRule If (Len(rst(varColName).Value) > dicRule(varColName)) Then strOverflowColNames = strOverflowColNames & conSeparater & varColName End If Next よりも Dim i As Integer For i = 0 To dicRule.Count - 1 If (Len(rst(dicRule.Keys(i)).Value) > dicRule.Items(i)) Then strOverflowColNames = strOverflowColNames & conSeparater & dicRule.Keys(i) End If Next i のほうが伝わりやすいかもしれないですね。 また、関数が条件を変えて複数回実行されるなら If strOverflowColNames <> vbNullString Then の判定をなくしてvbNullString の場合に"桁溢れ"列がリセットされた方がいいですね。
guest

0

[桁溢れしていたら最終フィールドへ移動して、フィールド名を書き込む]
[移動元のフィールドへ戻る]

桁溢れの結果を代入する変数を1つ用意しておけば良いかと思います。
以下、サンプルになります。

Basic

1Sub Test() 2 CurrentDb.Execute "ALTER TABLE [T_本] ADD COLUMN [桁溢れ] TEXT(255)" 3 'レコードセット取得 4 Dim rs As New ADODB.Recordset 5 '更新モードでオープン 6 rs.Open "T_本", CurrentProject.Connection, adOpenKeyset, adLockOptimistic 7 8 '桁数判定用辞書 9 Dim dic 10 Set dic = CreateObject("Scripting.Dictionary") 11 12 'フィールド毎の上限文字数(バイト数) 13 dic.Add "タイトル", 20 14 dic.Add "著者", 8 15 dic.Add "出版社", 8 16 17 'レコードセット 18 Do Until rs.EOF 19 Dim var As Variant 20 Dim fld As ADODB.Field 21 Dim strOverflow As String 22 Dim bFirst As Boolean 23 24 '初期化 25 bFirst = True 26 strOverflow = "" 27 28 'フィールド移動 29 For Each fld In rs.Fields 30 '桁溢れ判定 31 If IsOverflowColumn(dic, fld) Then 32 '初回なら 33 If bFirst Then 34 'フィールドの値を変数に設定 35 strOverflow = fld.Name 36 bFirst = False 37 '2回目以降であれば 38 Else 39 'フィールドの値を変数に追記 40 strOverflow = strOverflow & "、" & fld.Name 41 End If 42 End If 43 Next fld 44 'チェック結果を代入 45 rs("桁溢れ") = strOverflow 46 rs.MoveNext 47 Loop 48 rs.Close 49 50End Sub 51 52' 桁溢れ判定関数 53Function IsOverflowColumn(dic, fld As ADODB.Field) As Boolean 54 Dim strFieldName As String 55 Dim strFieldValue As String 56 Dim nLimitSize As Long 57 58 If TypeName(fld.Value) = "String" Then 59 strFieldValue = fld.Value 60 Else 61 IsOverflowColumn = False 62 Exit Function 63 End If 64 65 strFieldName = fld.Name 66 If dic.Exists(strFieldName) Then 67 nLimitSize = dic(strFieldName) 68 If LenB(strFieldValue) > nLimitSize Then 69 IsOverflowColumn = True 70 Exit Function 71 End If 72 End If 73 74 IsOverflowColumn = False 75 76End Function

投稿2023/02/09 12:51

cx20

総合スコア4693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

access

2023/02/27 09:54

ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問