タイトル通りなんですけど、
テーブルにあるフィールドを追加、削除したいのですが、
どうしたらいいのか全くお手上げ状態です。
助けてください。

ADOを使用しています。
お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

こんにちは。

maruru01です。
テーブルにあるフィールドの追加や削除は、ADOの拡張機能であるADOXを使用します。

まず、ADOと同じように参照設定でライブラリを追加します。
ライブラリ名は「Microsoft ADO Ext.2.5 for DDL and Security」です。(バージョンが2.5でないかも知れません。)
そうしたら、後はADOとだいたい同じで、オブジェクト変数を宣言して、新規オブジェクトへの参照を代入します。

Dim cat As ADOX.Catalog
Dim Tbl As ADOX.Table

Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection
Set Tbl = cat.Tables![テーブル名]

'フィールドの追加
Tbl.Columns.Append "追加フィールド名", adWChar
'フィールドの削除
Tbl.Columns.Delete "削除フィールド名"

Set Tbl = Nothing
Set cat = Nothing

Append、Deleteメソッドの引数など詳しいことは、MSDN Libraryなどで調べて下さい。
では。
    • good
    • 1
この回答へのお礼

やってみたところ、もののみごとに消えたり追加されたりしてくれました。
本当にありがとうございました!

お礼日時:2001/12/27 17:12

Dドライブ直下"db2000.mdb"ファイル、"ABC"テーブル、"AAA"テーブルを削除するサンプルです



'~~~~~~~~~~~~~~~~~~~~
Private Sub DelField_Click()
Dim stDbName As String
Dim stTblName As String
Dim stFidName As String
Dim stConnect As String
Dim ADOCN As ADODB.Connection
Dim ADOCAT As ADOX.Catalog

stDbName = "D:\db2000.mdb"
stTblName = "ABC"
stFidName = "AAA"
stConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & stDbName & ";"

Set ADOCN = New ADODB.Connection
ADOCN.Open stConnect

Set ADOCAT = New ADOX.Catalog
ADOCAT.ActiveConnection = ADOCN

ADOCAT.Tables(stTblName).Columns.Delete (stFidName)

End Sub
'~~~~~~~~~~~~~~~~~~~~
※参照設定にて「Microsoft ADO Ext 2.5 DLL and Security」をチェックしてください

御期待にそえれば...

参考URL:http://homepage2.nifty.com/inform/vbdb/index.html
    • good
    • 0

それは、テーブルの定義 (フィールドの数や型) を変更したいという事でしょうか?

この回答への補足

フィールドの数をへらしたかったんです。
返事おそくなりまして、すみません。

補足日時:2001/12/27 17:11
    • good
    • 0

http://www.zdnet.co.jp/help/howto/win/win2000/00 …

上記にアクセスして勉強してください。

この回答への補足

レコードセットの削除、追加はできるんです。
上記のURLに行ってみましたが、該当するものが存在しませんでした・・・。
せっかく教えてくれたのにすみません。

補足日時:2001/12/27 16:20
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESS VBAでテーブル内の特定のフィールドを削除 .Fields.Delete ("*")

教えて下さい。
 倉庫テーブル
  フィールド:
   北海道倉庫1
   北海道倉庫2
   仙台倉庫1
   仙台倉庫2
   仙台倉庫3



とあります。仙台と付くフィールドを全て削除したく

CurrentDb().TableDefs("倉庫テーブル").Fields.Delete ("仙台倉庫1")

の”仙台倉庫1”の部分を
(”仙台”&”*”)にしたのですが、動きません。
どのように書けば良いのでしょうか?
宜しくお願い致します。

Aベストアンサー

さすがにそのワイルドカードは無理。
こんな風では?

Sub てすと()
Dim DB As Database
Dim Tdf As DAO.TableDef
Dim Fld As DAO.Field
Dim i As Integer
Set DB = Application.CurrentDb
Set Tdf = DB.TableDefs("倉庫テーブル")

For i = Tdf.Fields.Count - 1 To 0 Step -1
If Tdf.Fields(i).Name Like "仙台*" Then
Debug.Print Tdf.Fields(i).Name
'Tdf.Fields.Delete Tdf.Fields(i).Name
End If
Next
Set Tdf = Nothing: Set DB = Nothing
End Sub

確認のためイミディエイトウィンドウに出力してますので
OKだったら下のコメントを外して実行してください。
※念のためバックアップを取ってからに。

QACCESSデータベースにVB6(DAO)でフィールドを追加したい

既存のACCESSデータベースのテーブルにVB6のDAOでフィールドを追加したいのですが、テーブル名.Fields.Append とかいうメソッドがあるようですが、使用方法がわからずフィールドを追加が出来ません。
具体的には、フィールド名"電話番号"で、文字型で固定文字数13を追加したいのです。
どうぞよろしくお願いします。

Aベストアンサー

VB6.0からDA0を使用して、既存のAccessのテーブルへのフィールド追加、という事でしたら以下のコードで出来ました。

Sub Main()
Dim dbs As DAO.Database
Dim s_sql As String

Set dbs = OpenDatabase("C:\test.mdb")
s_sql = "ALTER TABLE テーブル名 ADD COLUMN フィールド1 TEXT(10)"
dbs.Execute s_sql
Set dbs = Nothing

End Sub

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

QAccessのマクロでCSVファイルをインポートする

Accessのマクロ・VBAにてCSVファイルを
インポートしたいのですが、うまくいきません。

DoCmd.TransferText acImportDelim, , "C:\Documents and Settings\yoshimi\My Documents\顧客マスタテーブル.csv", False
現在のコードです。

「オブジェクト'0.txt’が見つかりませんでした。
オブジェクトが存在していること、名前やパス名が正しいことを確認
してください。」
とエラーが表示されます。

過去ログを検索し、似たようなものを見つけ同じようにしたつもりです。
http://okweb.jp/kotaeru.php3?q=1691138
(回答のANo.1の定義の保存場所が分からずしていません)

どこがおかしいのか教えていただきたいです・・・

Aベストアンサー

インポート先(保存先)となるテーブルが指定されていないようです。

その分、カンマ(,)が1個少ないなっているために引数がずれて判断され、インポートするファイルが「C:\~顧客マスタテーブル.csv」ではなく、「0.txt」だと判断されているのではないかと思います。
(「False」がファイル名と解釈され(False=0)、テキストファイルと解釈されて拡張子「.txt」をつけてエラー表示された、と)

とりあえず、「Test」テーブルを作成し(フィールドは仮でF1,F2の2つでテキスト型)、「,"C:\~」の前に「,"Test"」を入れて実行してみて下さい。
(csvファイルが3列以上の構成であれば、「テーブル'Test'にはF3フィールドがありません」とのエラーが表示されるようになりると思いますので、適宜F3,F4,・・・と、必要な列数を追加して下さい:定義のかわりです)

QAccessでフィールドを追加したい

Accessであるシステムを作成しているのですが、いくつか不明な点があるのでアドバイスをお願いします。

「社員情報」をいうテーブルがあり、初期の状態で「社員番号」「氏名」「入社年月日」「年齢」とフィールドがあります。
このテーブルを基にフォーム「社員情報入力」も作ってあります。

ここで新たに、社員情報テーブルに「生年月日」「連絡先」など、フィールドを追加したいのですが・・・以下のような条件があるので、どうしていいのかわからず困っています。

【条件】
・フィールド追加用のフォーム(新規フィールド名を入力させる)を作り、そこからフィールドを追加させる。(直接テーブルはいじらせないため)
・追加したフィールドを社員情報入力フォームに反映(表示)させたい
・追加したフィールドをレポートにも反映(表示)させたい

このような条件でフィールドの追加は無理なのでしょうか?
アドバイスや参考になるページを教えてください。
よろしくお願いします。

Aベストアンサー

[イミディエイト]
? CnnExecute("ALTER TABLE 社員情報 ADD COLUMN 生年月日 DATE")
True
? CnnExecute("ALTER TABLE 社員情報 ADD COLUMN 連絡先 TEXT(32)")
True

<社員情報>

社員番号__氏名_________入社年月日____年齢___生年月日___連絡先
101__________鈴木 一郎__2001/04/10___22
102__________中村 主水__2001/04/10___22

このように、<社員情報>テーブルに列を追加するのは簡単に実行できます。

<TableAdd.txt>
ALTER TABLE 社員情報 ADD COLUMN 生年月日 DATE
ALTER TABLE 社員情報 ADD COLUMN 連絡先 TEXT(32)

通常は、このような列を追加するSQL文をテキストで配布するでしょう。
後は、それを実行するアプリケーションを配布すれば目的は達成されます。
ユーザに<新規フィールド名を入力させる>なんて冒険は犯さないと思います。

フォームやレポートもコピーして差し替えればいい訳ですが・・・。
ここを自動化すると、仕掛けがチトややこしいと思います。
まあ、そこはオペレータに頼んだらどうですか?

<バックエンドとフロントエンドとへの分割が最善>

思うに、この際、データベースをバックエンドとフロントエンドに分割したらどうですかね。
であれば、バックエンドを変更するアプリと新しいフロントエンドは配布した終わりです。
分割こそが、この手の悩みからも解法される最善策だと・・・。

[イミディエイト]
? CnnExecute("ALTER TABLE 社員情報 ADD COLUMN 生年月日 DATE")
True
? CnnExecute("ALTER TABLE 社員情報 ADD COLUMN 連絡先 TEXT(32)")
True

<社員情報>

社員番号__氏名_________入社年月日____年齢___生年月日___連絡先
101__________鈴木 一郎__2001/04/10___22
102__________中村 主水__2001/04/10___22

このように、<社員情報>テーブルに列を追加するのは簡単に実行できます。

<TableAdd.txt>
ALTER TABLE 社員情報 ADD COLUMN 生年月日 DATE
ALTER TABLE...続きを読む

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

QACCESSでフィールド名の変更(VBA)

VBAを使ってテーブルのフィールド名等を変更させたいと思います。
そういう事ってできるのでしょうか?

フィールド名を作成者ではなく、利用者が設定するようにしたいと思っているのですが、どういった方法があるでしょうか?

よろしくお願いします。

Aベストアンサー

>ちなみに、それはどういったやりかたでやったら良いのでしょう?

例えば、[フィールド名対応表]という名前のテーブルで、[フィールド名][変換名]というフィールドを作ります。
で、[フィールド名]には予め実際のテーブルのフィールド名を、正しく入力しておきます。
[変換名]にも初期値として[フィールド名]と同じ値を入力しておきましょう。

まず、変換名の登録は、更新クエリを実行します。
仮に[誕生日]というフィールド名を[生年月日]という名前に変更するとすると、コードは以下のような感じ。


Dim SQL As String 'SQLステートメント

SQL = "UPDATE フィールド名対応表 SET 変更名 = '生年月日' WHERE フィールド名 = '誕生日'"
DoCmd.RunSQL SQL


次にフィールド名に付けられた変更名を拾ってくる方法は、


Dim temp As String '変更名

temp = DLookup("変更名", "フィールド名対応表", "フィールド名 = '誕生日'")


ちなみに、DLookup関数は、条件にあったデータの値を返す関数ですが、条件にあったデータがない場合は、Nullを返しますので注意して下さい。

>ちなみに、それはどういったやりかたでやったら良いのでしょう?

例えば、[フィールド名対応表]という名前のテーブルで、[フィールド名][変換名]というフィールドを作ります。
で、[フィールド名]には予め実際のテーブルのフィールド名を、正しく入力しておきます。
[変換名]にも初期値として[フィールド名]と同じ値を入力しておきましょう。

まず、変換名の登録は、更新クエリを実行します。
仮に[誕生日]というフィールド名を[生年月日]という名前に変更するとすると、コードは以下のような感じ。

...続きを読む

QAccessのフォームのみ表示させたい

Accessを起動した際、フォームのみ表示するにはどうすればよいのでしょうか?
(Accessを起動すると、オブジェクトメニュー?(テーブルやクエリ等のオブジクトを選択するウィンドウ)を表示させないで、フォームのみを表示させるには?)
また、上記と同じようにして、なおかつAccessを起動させないでフォームで起動や終了といったことが出来るのでしょうか?
やはりこれはVB等プログラミングでないと出来ないのでしょうか?ちなみに私はプログラミングは全く出来ません。
わかる方、教えて下さい。宜しくお願いします。

Aベストアンサー

ツールメニュー
”起動時の設定”を開き

フォーム/ページの表示にて起動時に表示させたいフォームを選択すれば、そのMDBを開いた時に、該当のフォームが表示されます。

メニュー画面等を作り、各処理のフォームを開いたり、アクセスを終了するマクロを呼び出すボタンを作ればフォームからの終了等も可能です。

また、データベースウィンドウの表示のチェックボックスを外せば、質問者様の言われているオブジェクトメニューは表示されなくなります。

メンテナンス等を行いたい時はshiftキーを押下しながら立ち上げればデータベースウィンドウが表示できます。

QAccess サブフォームでの選択行の取得

こんにちは。

Access初心者です。

サブフォームでテーブルの項目を表示させていますが、
選択された行を取得する方法はありますか?
サボフォームの下の方に現在選択されているレコード数が表示されてますが、その値でかまいません。

調べているのですが、なかなか検討がつきません。
宜しくお願い致します。

Aベストアンサー

フォーム名がフォーム1、サブフォームコントロールの名前がサブフォーム1だとすると、

Forms!フォーム1!サブフォーム1.Form.CurrentRecord

で取得できます。
(「Forms」と「Form」がありますのでご注意下さい)


また、フォーム1にコードを記述する場合であれば

Me!サブフォーム1.Form.CurrentRecord

サブフォーム1へのコード記述であれば

Me.CurrentRecord

という構文によっても、それぞれ取得が可能です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング