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

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

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

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

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

Q&A

解決済

2回答

10687閲覧

ADODB.Recordset で Recordset.Fields.Append の 初期値(FieldValue)が設定できない

woria

総合スコア36

VBA

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

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

ADO.NET

ADO.NETは.NET Frameworkで各種データベースへの統一された接続機能を提供するソフトウェアコンポーネントの集合です。

0グッド

0クリップ

投稿2020/02/19 09:16

前提・実現したいこと

Recordsetを新規作成し、Fieldを追加、Fieldに初期値を追加したい

発生している問題・エラーメッセージ

実行時エラー '3001':引数が間違った型、許容範囲外、または競合しています。

該当のソースコード

VBA

1Sub Main() 2 Dim adoRs As New ADODB.Recordset 3 With adoRs 4 With .Fields 5 .Append "処理日", adDate, , , Now 6 .Append "列1", adVarChar, 255, , "倉庫" 7 End With 8 .Open 9 End With 10End Sub

試したこと

型がダメかと思い、.Append "処理日", adVarChar, , , Format(Now, "yyyy/mm/dd hh:nn:ss")にしたり、
.Append "処理日", adDate, , , Nowを無視して次の行を実行したが、同じエラー
FieldValueを無しにした.Append "処理日", adDateならOK

参照設定

Microsoft ActiveX Data Objects 6.1 Library

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

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

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

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

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

guest

回答2

0

ベストアンサー

Append メソッド (ADO) | Microsoft Docs

公式のヘルプがちょっとわかりにくいですが、

FieldValue パラメーターは、Field オブジェクトを Record オブジェクトに (Recordset オブジェクトではなく) 追加する場合にのみ有効です。Record オブジェクトは、フィールドの追加と値の設定を同時に行うことができます。Recordset オブジェクトの場合は、Recordset を閉じた状態でフィールドを作成し、その後、Recordset を開いてフィールドに値を設定する必要があります。

とあるように、Fields.Appendで初期値を設定できるのはADODB.Recordオブジェクトのみとなります。

もし、Recordsetに追加する全ての行に同じ値を設定したい、という事であれば
以下のようにAddNewをするときに初期値を渡してあげると若干マシになるかもしれません。

vba

1Sub Main() 2 Dim adoRs As New ADODB.Recordset 3 With adoRs 4 Dim proccessedTime As Date 5 processedTime = Now 6 7 With .Fields 8 .Append "処理日", adDate 9 .Append "列1", adVarChar, 255, , "倉庫" 10 End With 11 .Open 12 13 adoRs.AddNew "処理日", proccessedTime '行追加と同時に、「処理日」フィールドにproccessedTimeを設定。 14 'あとは普通に値を設定。 15 End With 16End Sub

また、文字列にadVarCharを使うと、いわゆる環境依存文字が含まれる場合にエラーになりますので注意が必要です(adVarWCharなどであれば、VBAで扱える文字は基本入るはずです)。

投稿2020/02/19 11:16

imihito

総合スコア2166

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

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

woria

2020/02/19 23:34

丁寧にありがとうございます。 RecordsetではなくRecordは利用したことがなかったので、後程調べてみます。 文字通りなら、Recordset = Record Collection ? 今回の案件では環境依存文字はないのですが、念のためadVarCharではなく、adVarWCharの方を使っていきたいと思います。
guest

0

ADODBを使うなら、SQLのLTER TABLEを使うことになります。

下記が参考になるでしょう。

特定フィールドに既定値を設定したい - マイクロソフト コミュニティ

投稿2020/02/19 12:22

hatena19

総合スコア33699

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

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

woria

2020/02/19 23:29

今回のマクロではADODB.ConnectionやSQLを利用しません。 DAOを使わず、ADODB.Recordsetを新しく用意して、マクロ内でAppendする場合はDefaultValueを使うことはできないという認識でよろしいでしょうか。
hatena19

2020/02/20 04:25

テーブルを作成せずに、メモリ上でレコードセットを作成するということでしょうか(インメモリレコードセット)。ならば、そういう認識でいいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問