SQLを使って、新たにテーブルにフィールドを追加したのですが(Yes/No型で)テーブルの表示が0とー1になってしまいます。これを□の形式にしたいのですが(書式をYes/No型に変換したい)どうすればよいでしょうか?
ちなみにSQLは
ALTER TABLE aaaa ADD bb BIT
で追加しました。これだとテーブル表示が-1 or 0です。
困ってます。よろしくお願いします。

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

A 回答 (1件)

テーブルのフィールドをチェックボックス型にするには、"DisplayControl/表示コントロール" プロパティを設定してやる必要があり、これをVBAで設定するには、DAO(私はADOについては詳しくありませんので、DAOでご容赦ください。

)を使って行います。
(DAOを使いますので、はじめにモジュールウィンドウを開いて、ツール→参照設定で、 Microsoft DAO 3.* Object Library がチェックされていないようでしたら、チェックしておいてください。)

以下に、コードを示します。
(せっかくDAOを使いますので、フィールドの追加も ALTER TABLE ではなく、DAOの Append fld で行うようにしています。)

‘各変数を宣言
Dim dbs As DAO.Database, tdf As DAO.TableDef, fld As DAO.Field, prp As DAO.Property
‘変数dbs を現在のデータベースに設定
Set dbs = CurrentDb
‘変数tdf を ”aaaa” テーブルに設定
Set tdf = dbs.TableDefs!aaaa
‘変数fld をブール型のフィールド “bb” とし、”aaaa” テーブルに追加
Set fld = tdf.CreateField("bb", dbBoolean)
tdf.Fields.Append fld
‘変数prp を整数型のプロパティ “DisplayControl” とし、”bb” フィールドに追加
Set prp = fld.CreateProperty("DisplayControl", dbInteger, acCheckBox)
Call fld.Properties.Append(prp)
‘各変数のメモリー領域を開放
Set prp = Nothing
Set fld = Nothing
Set tdf = Nothing
Set dbs = Nothing

ちなみに、DisplayControl プロパティは、明示的に Properties コレクションに追加してやらないとVBAから参照できません(HELPでは、Field オブジェクトのプロパティには載っていません。)ので、Set prp =fld.~ 以下の2行で、追加をしています。
    • good
    • 0

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

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

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

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

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

こんにちは。

Access初心者です。

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

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

Aベストアンサー

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

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

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


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

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

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

Me.CurrentRecord

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

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でYes/No参照(チェックボックス)

2つのテーブルがあります。
顧客テーブルは顧客IDと質問
質問テーブルは顧客テーブルの質問を管理するテーブルです。
質問テーブルのフィールドは
質問ID(オートナンバー)と
質問(テキスト)と
チェック(Yes/No)です。
質問の数は不定で
例えば
ID 質問 チェック
1  A    □
2  B   □
3  C   □
という具合にテーブルを作成します。
顧客テーブルの質問フィールドが質問テーブルを参照し
チェックボックスにチェックを入れられるようにしたいのですがどうしてもチェックのところが□ではなく
Yes/Noとなってしまいます。
最終的には質問Aに対するチェックの数
質問Bに対するチェックの数
全てのチェックの数などを計算したいのですが
どのようにしたら良いでしょうか。
よろしくお願いします。

Aベストアンサー

> チェック(Yes/No)の表示が Yes/No になってしまう。
◎テーブルデザインで
 データ型は Yes/No型に なっていると思いますが、
 ルックアップの 表示コントロールが
 テキスト ボックス に なっているようです。
 これを チェック ボックス に変えれば □ になります。

> 全てのチェックの数などを計算
◎選択クエリで 集計します。
 フィールド名 ”質問”の集計は ”グループ化”を選択
 フィールド名 ”チェック”のとこをは IIF関数を使い次のようにします。
 件数: IIf([チェック]=Yes,1,0)
 集計は ”合計”を選択します。

 これで、A、B、C・・・ 別に 件数が出ます。

Qカレントレコードが無い事を判定させる方法

SQLを使ってmdb内のレコードセットを取得し、
無かったらエラーを返す、という処理を作成
する場合、カレントレコードが無い事を
判定するにはどうすれば良いでしょうか?
イメージは下記のような感じです。

レコードセット as DAO.Recordset

'レコードセット取得
 Set レコードセット = db.OpenRecordset(作成したSQL文)

'判定
If カレントレコード無 Then
MsgBox "エラーメッセージ"
Exit Sub
End If

Aベストアンサー

カレントレコード無は"レコードセット.RecordCount = 0"
で行けませんか?

QACCESSのFieldの追加方法

VB初心者です。ACCESSのMDBに下記の構文でFieldの追加はできたのですが
少数点以下2桁に設定する方法がわからなく困っています。
Fieldプロパティにも無く、どなたか教えて下さい。

Set field01 = tdfEmployees01.CreateField("Tanka", dbCurrency)
tdfEmployees01.Fields.Append field01

Aベストアンサー

テキストボックスなどのコントロールに対してなら、Decimalplaces = 2 のようにプロパティを設定すればよいのですが、

DA0 で、テーブルの Field オブジェクトに設定する場合には、Properties コレクションに明示的に DisplayControl プロパティを追加してやらないと、VBAから参照できません。
(Access のHELPには、Field オブジェクトのプロパティとして載っていません。)

具体的には、

Dim dbs As Database
Dim tdfEmployees01 As DAO.TableDef, field01 As DAO.Field, prp As DAO.Property

Set dbs = CurrentDb
Set tdfEmployees01 = dbs.CreateTableDef("テーブル名")
Set field01 = tdfEmployees01.CreateField("Tanka", dbCurrency)

tdfEmployees01.Fields.Append field01
dbs.TableDefs.Append tdfEmployees01

Set prp = field01.CreateProperty("DecimalPlaces", dbByte, 2)
Call field01.Properties.Append(prp)

のようになります。
(CreateProperty は、テーブルの Append の後で実行してください。)

テキストボックスなどのコントロールに対してなら、Decimalplaces = 2 のようにプロパティを設定すればよいのですが、

DA0 で、テーブルの Field オブジェクトに設定する場合には、Properties コレクションに明示的に DisplayControl プロパティを追加してやらないと、VBAから参照できません。
(Access のHELPには、Field オブジェクトのプロパティとして載っていません。)

具体的には、

Dim dbs As Database
Dim tdfEmployees01 As DAO.TableDef, field01 As DAO.Field, prp As DAO.Propert...続きを読む

Q【ACCESS】フォーム名/コントロール名を文字列型変数で指定するには

バージョン:Access2002

フォーム「frm01」にテキストボックス「tb01」が作ってある場合、
Forms.frm01.tb01.Value="あいう"
とすれば、フォームもコントロールも指定できるのですが、
Dim strTxt As String
strTxt = "tb01"
Forms.frm01.strTxt.Value="あいう"
だと、文字列型変数"strTxt"が展開されないのでフォーム「frm01」のコントロール「strTxt」を探してしまいエラーになってしまいます。

文字列型変数でフォームやコントロールを指定するには、どのようにすればよいのでしょうか?

Aベストアンサー

フォームの場合
 Forms(strFrm)

フォームのコントロールの場合
 Forms(strFrm).Controls(strTxt)


これでも参照できますが、普通ここまで省略しませんね。
 Forms(strFrm)(strTxt)

あとで見たとき、訳がわからなくなりそう。

QAccess VBAによるテーブル作成時の書式

お世話になります。

VBAにてテーブルを作成した際の、書式設定についてご教授願います。
以下のようにテーブルを作成しております。

Set cdb = CurrentDb()

Set ctb = cdb.CreateTableDef("TBL")
ctb.Fields.Append ctb.CreateField("A番号", dbInteger)
cdb.TableDefs.Append ctb

Set ctb = Nothing
cdb.Close
Set cdb = Nothing

この『A番号』フィールドは数値型で、書式を3桁にしたいと思っております。
テーブルのデザインでは書式のところに『000』と入れれば、001、002・・・となりますが、上記のようにVBAでテーブル作成したとき、どのようにすればよいか分かりません。

以上、宜しくお願い致します。

Aベストアンサー

リンク先をもう一度確認してください
>Set prp = fld.CreateProperty("Format", dbInteger, "000")
Set prp = fld.CreateProperty("Format", dbtext, "000")
ですよ。

追加して
fld.Properties.Append prp
の後に
Application.RefreshDatabaseWindow
を足してください
(無くても問題は有りませんがデータベースウィンドウが即更新します)

Q「メソッドまたはデータメンバが見つかりません。」というエラーが出ます。

どうもお世話になります。
Accessに関しましての質問でございます。

以下のVBAでコンパイルエラーが出るのですが、
どのように致したらエラーが出なくなるでしょうか?

こちらのプログラムは、
チェックインから宿泊最終日を入力すると
日付を1日ずつ増やして、ほかのデータは
固定したままフォームに入力するプログラムです。

ただし、請求書_詳細IDもオートナンバー型です。
--------------------------------------------

Option Compare Database


Private Sub レコードの追加_Click()
Dim strWHERE As String
Dim D As Date

strWHERE = ""
strWHERE = strWHERE & " AND 宿泊日 >=#" & Me.チェックイン & "#"
strWHERE = strWHERE & " AND 宿泊日 <=#" & Me.宿泊最終日 & "#"
If DCount("*", "Qh2f_請求書_詳細", strWHERE) = 0 Then '条件に当て嵌まるデータ件数を取得

Me.Fh2f_請求書_詳細_sub.Requery

With Me.Fh2f_請求書_詳細_sub.Form.RecordsetClone
For D = Me.チェックイン To Me.宿泊最終日
.FindFirst "宿泊日=#" & D & "#AND 請求書_詳細ID ='" & Me.請求書_詳細ID & "'"
If .NoMatch Then
.AddNew
!宿泊日 = D
!請求書_詳細ID = Me.請求書_詳細ID
!部屋番 = Me.部屋番
!氏名2 = Me.氏名2
!商品名 = Me.商品名
!単価 = Me.単価
!人数 = Me.人数
!宿泊数 = Me.宿泊数
!備考 = Me.備考

.Update
End If
Next
End With

Else

MsgBox ("すでに同じ日付が入っています")
End If
End Sub

--------------------------------------------
こちらの設定にしたところ

「コンパイルエラー」
「メソッドまたはデータメンバが見つかりません。」という
エラーが出てしまいます。

そうして、「.請求書_詳細ID」だけが
ブルーになります。

どうしたら、エラーを消して
連投できるようになるでしょうか?

大変お手数とはぞんじますが、
ご返信お待ち致しております。

【補足】
実は他の方に教えてもらった
プログラムを応用して作ったものです。
VBA初心者です。
どうぞよろしくお願い致します。

どうもお世話になります。
Accessに関しましての質問でございます。

以下のVBAでコンパイルエラーが出るのですが、
どのように致したらエラーが出なくなるでしょうか?

こちらのプログラムは、
チェックインから宿泊最終日を入力すると
日付を1日ずつ増やして、ほかのデータは
固定したままフォームに入力するプログラムです。

ただし、請求書_詳細IDもオートナンバー型です。
--------------------------------------------

Option Compare Database


Private Sub レコードの追加_Click()...続きを読む

Aベストアンサー

>Private Sub レコードの追加_Click()
のコマンドボタンなどがメインフォーム上にあり
.FindFirst "宿泊日=#" & D & "# AND 請求書_詳細ID =" & Me.請求書_詳細ID
の末尾のMe.請求書_詳細IDがサブフォーム上にあるのでしたら
.FindFirst "宿泊日=#" & D & "# AND 請求書_詳細ID =" & Me!サブフォームコントロール名.Form!請求書_詳細ID
でしょうけど、。。。
http://hatenachips.blog34.fc2.com/blog-entry-347.html
Me.請求書_詳細ID が重複している、
OR コントロール名を間違えている、かも?
Me.請求書_詳細ID は何処にあるのでしょう。?
謎の仕様。
上手く行かなかったらより単純に
.FindFirst "宿泊日=#" & D & "# AND 請求書_詳細ID =1"
でもお試しを。


人気Q&Aランキング

おすすめ情報