
ACCESS DAO&VBA 初心者です。
どなたかお知恵を拝借いただけませんでしょうか。課題は以下の内容です。
諸事情(というか私の力量なんでしょうが)。納品店舗(列)とアイテム毎の発注数量(行)を、テーブルに格納しています。発注数量の合計がnull値の店舗を削除するコードを下記のように書きました。
Sub テスト()
Dim DB As Database
Dim Tdf As DAO.Recordset
Dim i As Integer
Dim s As Long
Dim g As Long
Dim tenn As String
Dim hinn As String
Set DB = CurrentDb
Set Tdf = DB.OpenRecordset("○○○ピッキングテーブル")
hinn = Tdf.fields(i)
i = 4
For i = Tdf.fields.Count - 1 To 4 Step -1
g = 0
Tdf.MoveFirst
Do Until Tdf.EOF
tenn = Tdf.fields(i).Name
'MsgBox tenn
s = Nz(Tdf.fields(i))
g = s + g
Tdf.MoveNext
Loop
If g = 0 Then
※Tdf.fields(i).Delete Tdf.fields(i).Name 実行時エラー 438でストップ
End If
Next
Set Tdf = Nothing: Set DB = Nothing
End Sub
※で実行時エラーの発生。
DAO の基本的な運用および設定の間違いのように思えるのですが、解消できません。どなたかよろしくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
こんばんは。
ソースから何となく集計してるのかなーとは思っていましたが、、
こんな時は DSum や SQL の集計関数を利用します。
https://officek.net/access/a-function/al-dfunc/d …
https://www.ipentec.com/document/sql-get-sum
ソースがなるべく簡易になるように DSum 関数を使った例です。
コメントやエラートラップで長く見えますけど、シンプルなソースです。
Sub sampleProc()
Const TABLE_NAME As String = "○○○ピッキングテーブル"
Dim DB As DAO.Database
Dim table_def As DAO.TableDef
Set DB = CurrentDb
Set table_def = DB.TableDefs(TABLE_NAME)
Dim i As Long
Dim total As Long
' i は列フィールドの番号(インデックス)
' 最後の列を除き、後ろから4列目に向かって逆順に処理
For i = table_def.Fields.Count - 1 To 4 Step -1
'
Dim f As DAO.Field
Set f = table_def.Fields(i)
' Dsumなどの集計関数を使う方が楽
total = Nz(DSum(f.Name, TABLE_NAME))
If total = 0 Then
’ 合計値が0の時、列を削除する
On Error Resume Next
table_def.Fields.Delete f.Name
' テーブルが開いている=使用中だとエラー3211が発生
If Err.Number = 3211 Then
MsgBox "テーブル使用中エラー", vbCritical
Exit Sub
End If
On Error GoTo 0
End If
Set f = Nothing
’
Next
Set table_def = Nothing
Set DB = Nothing
End Sub
No.3
- 回答日時:
補足します。
本ご質問は下記の問題点を含むと考えます。
レコードはひとつしかない?
■問題点1
列(フィールド)を削除する場合は注意が必要です。
添付図参照
削除 → アイテム1の行(レコード)で店舗Bは Null であるから列[店舗B]を削除
結果 → 店舗Bのアイテム2、アイテム3のデータが無かったことに
この点はどのように考えていますか?
■問題点2
>Set DB = CurrentDb
>Set Tdf = DB.OpenRecordset("○○○ピッキングテーブル")
>Tdf.fields(i).Delete Tdf.fields(i).Nam
この形で列を削除したいなら、Tdf は OpenRecorset ではなく次の様にします。
Dim db As DAO.Database: Set db = CurrentDb
Dim table_def As DAO.TableDef
Set table_def = db.TableDefs("○○○ピッキングテーブル")
'↓テーブルが開いてなければ、次のコードで列[店舗F]は削除できる
table_def.Fields.Delete "店舗F"
なお、TableDef は Table Define の略で、テーブル構造(どんな列を持つかなど)の定義オブジェクトです。
行の情報にアクセスできませんから、この方法でレコードの内容を精査しながらの列の削除は不可能です。
仮に OpenRecordset を併用し内容を精査できたとして、問題点1 が解決できません。

No.2
- 回答日時:
こんにちは。
通常は列(カラム、フィールド)は削除しません。削除するなら行なのですが、、
https://docs.microsoft.com/ja-jp/office/client-d …
具体的にテーブルの内容を列名を1行目に、数レコード分を提示し、次にどの様な結果を望んでいるのかをまた同様に提示してみて下さい。
説明しにくい場合は、画像の添付も。
No.1
- 回答日時:
ど素人でございますのでダメならスル~して下さい。
>Tdf.fields(i).Delete Tdf.fields(i).Name
Tdf.fields.Delete Tdf.fields(i).Name
ググって見つけたもの。
https://oshiete.goo.ne.jp/qa/9023032.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) 【VBAエラー】Nextに対するForがありません 対策について 5 2022/11/21 21:26
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
このQ&Aを見た人はこんなQ&Aも見ています
-
ACCESS VBAでテーブル内の特定のフィールドを削除 .Fields.Delete (*")"
その他(プログラミング・Web制作)
-
ADOをし使用して、Accessのテーブルの中のフィールドを消したいのですが。
Visual Basic(VBA)
-
ACCESS 複数のフォームから同一テーブル参照
Access(アクセス)
-
-
4
ACCESSでテーブルをコピーしようとすると3211のエラーが出てしまう
Access(アクセス)
-
5
Access2010 「演算子がありません」エラー
その他(データベース)
-
6
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
7
AccessのDAOでフィールド名を配列に格納して・・・
Visual Basic(VBA)
-
8
新規レコード行を非表示にしたい
Access(アクセス)
-
9
Access フォームのテキストボックスに半角英字のみで入力する設定は
Access(アクセス)
-
10
Access サブフォームでの選択行の取得
その他(データベース)
-
11
Accessのテーブルデータを一気にVBAで追加したい・・
その他(データベース)
-
12
希望の位置へフィールドを追加するには?
その他(Microsoft Office)
-
13
ACCESSでテーブルにあるチェックボックスを一括でYesにする方法を教えてください
Access(アクセス)
-
14
アクセスでテキストボックスの値が空白だったら
Access(アクセス)
-
15
Accessのマクロでモジュールを実行させたい。
Access(アクセス)
-
16
Accessのテーブルを既存のExcelファイルへエクスポートしたいんですが
Access(アクセス)
-
17
【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには
Access(アクセス)
-
18
accessのエクスポートエラーについて
その他(データベース)
-
19
AccessのDAO.ExecuteとDoCmd.RunSqlの違いについて
その他(データベース)
-
20
Accessで、1つの項目に複数の置換えを1度でするには?
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VBA】ワークブックを開く時に...
-
UserForm1.Showでエラーになり...
-
Excel vbaについての質問
-
お助けください!VBAのファイル...
-
マクロの「SaveAs」でエラーが...
-
フランスの生年月日(jj/mm/aaaa)
-
VBでSQL文のUPDATE構文を使った...
-
HTMLソースが表示のページのも...
-
マクロで"#N/A"のエラー行を削...
-
mailstorehomeのエクスポートで...
-
エクセルVBAで埋め込みグラフ(C...
-
文字列内で括弧を使うには
-
SQLでエラーです。
-
pythonのopenpyxlについて
-
VBAでfunctionを利用しようとし...
-
ApplicationとWorksheetFunctio...
-
C言語で、自分で作った関数内で...
-
ADO 「認証に失敗しました」
-
On ErrorでエラーNoが0
-
【VB.NET】 パワポ操作を非表示で
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
ApplicationとWorksheetFunctio...
-
【Access】Excelインポート時に...
-
インポート時のエラー「データ...
-
実行時エラー 438 の解決策をお...
-
オブジェクト型の変数にフォー...
-
.VBSだとADODBのプロバイダが見...
-
実行時エラー'-2147467259(8000...
-
【VB.NET】 パワポ操作を非表示で
-
フランスの生年月日(jj/mm/aaaa)
-
【VBAエラー】Nextに対するFor...
おすすめ情報
kenkenさん丁寧な返答ありがとうございます。
私が削除したい列は、アイテム1,2,3すべての納品がない店舗です。そのため、OpenRecordset
で、店舗毎の納品数量を精査させているつもりなんです。つまり、行の情報を精査させて、その結果で列を削除させるコードの書き方なんです。わがまま言って申し訳ありませんが、何らかの解決方法がありますでしょうか?ご指導ください。