- ベストアンサー
希望の位置へフィールドを追加する方法
- Access2003を使用している場合、テーブルに希望の位置へフィールドを追加する方法についてのヒントをご紹介します。
- メモ型をテキスト型へ変更する目的で、既存のフィールド名の最後に「2」を追記します。
- 新たに名称と取扱品目のテキスト型のフィールドを追加するコード例を提供します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
【つづき】 Private Function GetPositions(tdf As DAO.TableDef, sName As String) As String Const sColumnOrder As String = "ColumnOrder" On Error Resume Next GetPositions = sName GetPositions = GetPositions & " : " & tdf(sName).OrdinalPosition GetPositions = GetPositions & " : " & tdf(sName).Properties(sColumnOrder) End Function Private Sub Sample2() Dim db As DAO.Database Dim tdf As DAO.TableDef Dim sTmp As String Set db = CurrentDb Set tdf = db.TableDefs("顧客データ") sTmp = "" sTmp = sTmp & GetPositions(tdf, "名称2") & vbCrLf sTmp = sTmp & GetPositions(tdf, "名称") & vbCrLf sTmp = sTmp & GetPositions(tdf, "住所") & vbCrLf sTmp = sTmp & GetPositions(tdf, "担当営業") & vbCrLf sTmp = sTmp & GetPositions(tdf, "取扱品目2") & vbCrLf sTmp = sTmp & GetPositions(tdf, "取扱品目") & vbCrLf sTmp = sTmp & GetPositions(tdf, "備考") & vbCrLf Set tdf = Nothing Set db = Nothing MsgBox sTmp End Sub Private Sub Sample3() Dim db As DAO.Database Dim tdf As DAO.TableDef Set db = CurrentDb Set tdf = db.TableDefs("顧客データ") Call SetPosAndOrder(tdf, "名称2", 1) Call SetPosAndOrder(tdf, "名称", 2) Call SetPosAndOrder(tdf, "住所", 3) Call SetPosAndOrder(tdf, "担当営業", 4) Call SetPosAndOrder(tdf, "取扱品目2", 5) Call SetPosAndOrder(tdf, "取扱品目", 6) Call SetPosAndOrder(tdf, "備考", 7) Set tdf = Nothing Set db = Nothing MsgBox "終了" End Sub ※ 確認される時には、 Sample2 で設定内容を随時確認しながら、いろいろいじってみてください。 (テスト用の環境で) ※ 2000文字って少ないですね。 (ご迷惑かと思いますが、3つにわかれてしまいました)
その他の回答 (2)
- 30246kiku
- ベストアンサー率73% (370/504)
【つづき】 以下、標準モジュールへ記述------ Private Sub SetPosAndOrder(tdf As DAO.TableDef, sName As String, iPos As Integer) Const sColumnOrder As String = "ColumnOrder" On Error Resume Next tdf(sName).OrdinalPosition = iPos - 1 tdf(sName).Properties(sColumnOrder) = 0 If (Err <> 0) Then tdf(sName).Properties.Append _ tdf(sName).CreateProperty(sColumnOrder, dbInteger, 0) End If End Sub Private Sub Sample1() Dim db As DAO.Database Dim tdf As DAO.TableDef Set db = CurrentDb Set tdf = db.TableDefs("顧客データ") tdf("名称").Name = "名称2" tdf("取扱品目").Name = "取扱品目2" tdf.Fields.Append tdf.CreateField("名称", dbText, 255) tdf.Fields.Append tdf.CreateField("取扱品目", dbText, 255) ' ★ tdf.Fields.Refresh Set tdf = Nothing db.TableDefs.Refresh Set tdf = db.TableDefs("顧客データ") Call SetPosAndOrder(tdf, "名称2", 1) Call SetPosAndOrder(tdf, "名称", 2) Call SetPosAndOrder(tdf, "住所", 3) Call SetPosAndOrder(tdf, "担当営業", 4) Call SetPosAndOrder(tdf, "取扱品目2", 5) Call SetPosAndOrder(tdf, "取扱品目", 6) Call SetPosAndOrder(tdf, "備考", 7) Set tdf = Nothing Set db = Nothing MsgBox "終了" End Sub 【つづく】
- 30246kiku
- ベストアンサー率73% (370/504)
解決されていましたでしょうか。 不要ならスルーしてください。 テーブルを直に開いた時の表示順とかになるのでしょうか。 興味もあったので実機で確認してみましたが、正解なのかは???です。 データシートでの表示順は 1)OrdinalPosition で 2)表示した状態で移動等した場合は、ColumnOrder が、使われているようです。 テーブルのデザインビューで順を変更した時には、 ColumnOrder は 0 となり、OrdinalPosition で順を決めているようです。 データシート表示で列(項目)順を変更した時には、 OrdinalPosition はそのままで、ColumnOrder で順を決めているようです。 なので、項目の追加時には、ColumnOrder を 0 にして OrdinalPosition を設定すればよいように思います。 以下を標準モジュールに記述し、 Sample1 内をクリック後「F5」で名変更/追加するものとなります。 Sample2 内をクリック後「F5」で OrdinalPosition / ColumnOrder を表示します。 Sample3 内をクリック後「F5」で再設定(初期化)するものになります。 2007の場合は、★以下4行は不要でしたが、 2003では名前を変更したフィールド2つへ設定ができていませんでした。 タイミングをずらす(?)意味で tdf を再取得してみました。 なお、 db.Execute "ALTER TABLE 顧客データ ADD COLUMN 名称 TEXT(255)" を tdf.Fields.Append tdf.CreateField("名称", dbText, 255) に変更していますが、デフォルトで作成されるプロパティが同じなのかは 確認してません。(プロパティ数は同じみたいですが・・・) また、クエリ等で SELECT * とした時の順は、 OrdinalPosition が使われるようなことがヘルプに書いてあった様な・・・ 【つづく】
お礼
お礼が遅くなり、申し訳ありませんでした。 実際には50フィールド近く処理をしないといけなかったので…希望通りの処理が出来、大変助かりました! あきらめかけていた所へズバリな回答、誠にありがとうございました!