Excel VBAでフィールド名を変更する方法

このQ&Aのポイント
  • Excel VBAで、特定のテーブルのフィールド名を変更する方法について説明します。
  • ADOを使用してフィールド名を変更する方法と、Excelでは使用できないメソッドを使用する方法について説明します。
  • フィールド名の変更には、ADOX.Catalogオブジェクトを使用することができますが、エラーが発生する可能性があります。
回答を見る
  • ベストアンサー

Excel VBA SQL ADOフィールド名変更

「年度」、「月」、「ID」、「名前」の4つフィールドからなる 「テスト」というテーブルの「年度」を「年」に書き換えたいのですが、 「年度」フィールドの値を年度から年には書き換えることができたのですが、 フィールド名の「年度」を「年」に書き換えるには、 ADOで、EXCELでは、どのように記述すればよいのでしょうか。 以下は、ACCESSのVBAの例を参考にして記述したのですが Excel2010のVBAでは「CurrentProject」のところでエラーに なってしまいます。 strSQL = ・・・のような形式で記述して adoCON.Execute (strSQL)でフィールド名を 変更することはできないのでしょうか。 よろしくお願いします。 --- Excel VBA ----------------------------------- Dim adoCON As New ADODB.Connection Dim strSQL As String Dim odbdDB As Variant odbdDB = "C:\TEST\Database.accdb" adoCON.ConnectionString = "provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & odbdDB & "" adoCON.Open '「年度」フィールドの値の年度を年に変換する strSQL = "UPDATE テスト SET 年度 = 年度+1 WHERE VAL(月) < " & 4 & ";" adoCON.Execute (strSQL) adoCON.Close Set adoCON = Nothing 'フィールド名の年度を年に変更する Dim cat As ADOX.Catalog Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection 'エラー発生 cat.Tables("テスト").Columns("年度").Name = "年" Set cat = Nothing -----------------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんにちは。 /// > 「テスト」というテーブルの「年度」を「年」に書き換えたいのですが、 > ADOで、EXCELでは、どのように記述すればよいのでしょうか。 ご提示の記述に手を加えるなら、以下のような感じでしょうか。 ' ' /// ReW9074780() Dim adoCON As New ADODB.Connection Dim strSQL As String Dim strConn As String ' ★ Dim odbdDB As Variant   odbdDB = "C:\TEST\Database.accdb"   strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _       "Data Source=" & odbdDB ' ★   adoCON.ConnectionString = strConn ' ★   adoCON.Open ''「年度」フィールドの値の年度を年に変換する   strSQL = "UPDATE テスト SET 年度 = 年度+1 WHERE VAL(月) < " & 4 & ";"   adoCON.Execute (strSQL)   adoCON.Close   Set adoCON = Nothing 'フィールド名の年度を年に変更する Dim cat As ADOX.Catalog   Set cat = New ADOX.Catalog   cat.ActiveConnection = strConn ' ★   cat.Tables("テスト").Columns("年度").Name = "年"   Set cat = Nothing ' ' /// 一応、一通りのサンプルを作成した上で、動作確認はしてあります。 > 以下は、ACCESSのVBAの例を参考にして記述したのですが > Excel2010のVBAでは「CurrentProject」のところでエラーに > なってしまいます。 どっちみち、文字列指定なのですし、 扱うコネクションもテーブルも共通なのですから、 "コネクションを丸ごと文字列変数に格納して使い回す" という例でお応えしました(お求めに対する私の理解が至っていないかも知れませんが)。 > strSQL = ・・・のような形式で記述して > adoCON.Execute (strSQL)でフィールド名を > 変更することはできないのでしょうか。 フィールドの管理はADOX.Catalogでやるしかないです。 同じADOでも、ADODBではなくて、ADOXの仕事になります。 /// 以上です。

yam2012
質問者

お礼

教えていただきました方法でフィールド名の変更ができました。 変更箇所も★が示されていてわかり易かったです。 ありがとうございました。

その他の回答 (2)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

No1です。 ついでですから書いておきます。 ADOだけでなく、DAOでもExcelから接続し、フィールド名を 変更できます。たとえば、 Sub test2() Dim ws As Workspace Dim db As DAO.Database Dim tdf As TableDef Set ws = DBEngine.Workspaces(0) Set db = ws.OpenDatabase(ThisWorkbook.Path & "\sample.mdb") Set tdf = db.TableDefs("テスト") tdf.Fields("年度").Name = "年" tdf.Fields.Refresh Set tdf = Nothing db.Close: Set db = Nothing End Sub のように。この場合は、接続にDBEngine.Workspacesを使用します。 SQL文での変更は、一旦フィールドを削除し、改めてフィールドを 作成するようになります。したがってデータが失われることに なり、不都合な結果になります。 「Access SQL を使用してテーブルの設計を変更する」 https://msdn.microsoft.com/ja-jp/library/office/ff822825.aspx なお、SQLのUPDATE文はデータに対する更新になるので、テーブル定義の 変更は上記のURLをよく読んでください。

yam2012
質問者

お礼

ADOだけでなくDAOについても教えていただきまして ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

CurrentProject.Connection は、Accessで可能な書き方です。 以下は、Excelのファイルがあるディレクトリのsample.acodbという Accessファイルに接続し「テスト」というテーブルの「年度」というフィールド名を 「年」に変更します。ファイル名は実際に合わせて変更してください。 Sub test() Dim cat As New ADOX.Catalog Dim strPath As String strPath = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\sample.accdb" cat.ActiveConnection = strPath cat.Tables("テスト").Columns("年度").Name = "年" Set cat = Nothing End Sub

yam2012
質問者

お礼

教えていただきました方法でフィールド名の変更ができました。 ありがとうございました。

関連するQ&A

  • テーブルのすべてのフィールド名を配列として取り出せ

    テーブルのすべてのフィールド名を配列として取り出せるように変数に格納したいのですが 詰みました。 Private Sub test() Dim cat As ADOX.Catalog Dim clm As ADOX.Column Dim tmp As Variant Dim myTable As String myTable = "T_Table" Set cat = CreateObject("ADOX.Catalog") cat.ActiveConnection = CurrentProject.Connection For Each clm In cat.Tables(myTable).columns tmp = Array("フィールド1", "フィールド2") Next clm End Sub のようなことがしたいのですが、clm.nameでせっかく名前が取得できるのに、 どうやったらtmpに格納できるのでしょうか? Arrayを使わない方法はあるのでしょうか?

  • ハイパーリンク型を指定することは可能ですか?

    VBAでテーブル(フィールド)を作る際にハイパーリンク型を指定することは可能ですか? Sub test() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection Set tbl = New ADOX.Table tbl.Name = "テーブル" tbl.Columns.Append "URL", adVarWChar cat.Tables.Append tbl Set cat = Nothing End Sub アクセスでこんな感じで作ってるのですが adVarWCharの部分をハイパーリンク型にしたいです。 しかし http://www.accessclub.jp/ado/adox/06.html を見てるとデータ型にハイパーリンク型が見当たらないのですが、不可能という事でしょうか?

  • データ型をメモ型にして既存テーブルにフィールドを追加したい(ACCESS ADOX)

    Sub test() Dim cat As New ADOX.Catalog Dim tb As New ADOX.Table cat.ActiveConnection = CurrentProject.Connection 'テーブルを開く Set tb = cat.Tables("テーブル1") tb.Columns.Append "フィールド1", ad○○ Set cat = Nothing Set tb = Nothing End Sub これで既存のテーブルにフィールドを追加できることを知ったのですが データ型をメモ型にするにはどの「ad○○」にすればいいのでしょう? (文字数が多いためテキスト型では収まりません) オブジェクトブラウザで見ても、多すぎてどれなのかわかりません。 ご教授よろしくお願い致します。

  • エクセルVBA_ADO「ファイアホースモードの間はトランザクションを開

    エクセルVBA_ADO「ファイアホースモードの間はトランザクションを開始できない」 最近、エクセルVBAからSQLサーバーを編集するプログラムの勉強をはじめ、以下のサイトを読みながらテストプログラムを走らせています。 http://www.happy2-island.com/access/gogo03/capter00306.shtml そして、以下のようなコードを走らせて見ると、「ファイアホースモードの間はトランザクションを開始できません」とのエラーが出ます。 コードを以下に記します((2)トランザクションを開始します←ここで上記のエラーが出ます) Sub prcAdoSQLServerDB() Dim adoCON As New ADODB.Connection Dim adoRS As ADODB.Recordset '(1)ADOを使いSQL ServerのDBを開きます adoCON.Open "Driver={SQL Server};" & _ "server=aaa\db; database=a1; uid=a; pwd=a;" 'レコードセットの作成(SELECT文の実行) Set adoRS = adoCON.Execute("select * from 明細") 'レコード追加のSQLを定義(フィールド名省略すると、nullを入れようとする) strsql = "INSERT INTO 詳細 (得意先コード) Values(000010)" '(2)トランザクションを開始します adoCON.BeginTrans '(3)レコード追加のSQLを実行します adoCON.Execute strsql '(4)SQL実行結果の判定 If Err.Number = 0 Then '(5)SQLが正常終了したら追加を反映します adoCON.CommitTrans Else '(6)SQLが異常終了したら追加の破棄とエラー内容の表示をします adoCON.RollbackTrans End If End Sub 何が原因なのでしょうか。

  • アクセスVBA。ADO

    CSVから列を分割してテーブルにしたいかったので 下記のコードを記述しましたが、 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim datacount As Long Set cn = New ADODB.Connection With cn .ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "\;" .Properties("Extended Properties").Value = "text;HDR=YES;" .Open End With Set rs = cn.Execute("SELECT * FROM 構成マスタ.csv") datacount = rs.Fields.Count For i = 0 To datacount strsql = "SELECT " & rs.Fields(i).Name & " INTO " & rs.Fields(i).Name & " FROM 構成マスタ.csv;" cn.Execute strsql Next i rs.Close cn.Close Set rs = Nothing Set cn = Nothing SQLを実行するところで、「日付エラー」となってしまいます。 データには特に日付等はないのでエラーになる原因がわかりません。 どなたかご教示いただけますでしょうか。

  • ADOX フィールドのRequiredプロパティを

    ADOX フィールドのRequiredプロパティをFalseにしたい アクセスです。 Sub test() Dim cat As ADOX.Catalog Dim tbl As ADOX.Table Dim idx As ADOX.Index Dim varRet As Variant Dim strMsg As String Set cat = New ADOX.Catalog cat.ActiveConnection = CurrentProject.Connection Set tbl = New ADOX.Table tbl.Name = "test" tbl.Columns.Append "氏名ID", adInteger '手作業で数値型のフィールドを作るとこれがデフォルトになる tbl.Columns.Append "氏名", adVarWChar, 50 cat.Tables.Append tbl 主キーを作る Set idx = New ADOX.Index idx.Name = "Primary" idx.PrimaryKey = True idx.Columns.Append "氏名ID" tbl.Indexes.Append idx MsgBox tbl.Name & "テーブルを作成しました。" Set cat = Nothing End Sub ********************************************************** 上記のコードでテーブルを作ると、RequiredをTrueにしてないのに、 実際にテーブルにデータを入れてる時に、NULLにしようとすると、 ********************************************************** フィールドに必要なプロパティが True に設定されているため、 このフィールド '<フィールド名>' には Null 値は挿入できません。値を入力してください。 ********************************************************** となります。 Requiredプロパティの規定値は、False になってますが、 なぜか値を要求されてしまいます。 ADOXで上記のコードに追加してRequiredをFalse にする方法を教えてください。、

  • 非連結フォームにレコード表示したい!

    フォームにレコードを表示させたいのですが、 ”FROM 句の構文エラー”と出ます、ヘルプを参照すると何故か表示されません! 「strSQL~Me!年号コード」までの間が間違っているのでしょうか? アドバイス宜しくお願いいたします。 Dim adoCON As ADODB.Connectio Dim adoREC As ADODB.Recordset Dim strSQL As String Set adoCON = Application.CurrentProject.Connection strSQL = "SELECT *" _ & "FROM ta01年号" _ & "WHERE 年号コード =" & Me!txt年号コード Set adoREC = adoCON.Execute(strSQL) If adoREC.EOF = False Then Me!txt年号コード.Value = adoREC(年号コード).Value Me!txt年号.Value = adoREC("年号").Value Else MsgBox "該当データがありません", vbOKOnly + vbExclamation, "年号" Cancel = True Exit Sub adoREC.Close adoCON.Close Set adoREC = Nothing Set adoCON = Nothing End If

  • 【Access2003】VBAで削除のSQL実行ができない

    初歩的な質問かもしれませんが・・・ ACCESS2003VBAでADOを用いて削除を実行しようとしているのですがエラー(エラーは「オーバーフローしました」です。)が出て実行できません。 ソースは以下の通りです。 Dim strSQL As String Dim rs As New ADODB.Recordset Set cn = CurrentProject.Connection strSQL = " DELETE FROM D_TB" rs.Open strSQL, cn, , adOpenStatic, adLockOptimistic       '←ここでエラー Do Until rs.EOF rs.Delete rs.MoveNext Loop rs.Close cn.Close どこがおかしいのでしょうか? 大変困っています。教えてください。よろしくお願いいたします。

  • Excel VBA ADOでのCSV取込みについて

    下記は、Excel VBAでADOを使って、CSVデータを取り出すソースです。ソースは、とあるサイトからほぼ丸写しです。 Sub main()   Const DRIVER As String = "DRIVER={Microsoft Text Driver (*.txt; *.csv)};DBQ="   Const PROVIDER As String = "Provider=MSDASQL;Extended Properties="""   Dim cn As New ADODB.Connection   Dim rs As New ADODB.Recordset   Dim idx As Integer   Dim strSQL As String   cn.ConnectionString = PROVIDER & DRIVER & "C:\"""   cn.Open   '全件数取得   strSQL = "SELECT * FROM Sample.csv"   'CSVファイルの内容を取得   Set rs = cn.Execute(strSQL)   rs.MoveFirst   Do Until rs.EOF     For idx = 0 To rs.Fields.Count - 1       Debug.Print rs.Fields(idx).Value '←ここ     Next idx     rs.MoveNext   Loop   Set rs = Nothing   cn.Close   Set cn = Nothing End Sub ここで、「'←ここ」と示した行のrs.Fields(idx).Valueって、実際には「001」と書かれた値は、ダブルクォーテーションでも入ってない限りは「1」と変換されちゃいますよね?これをちゃんと、実際の値「001」のまま取得することって出来ないのでしょうか?

  • Access2007からADO接続にてEXCEL

    Access2007からADO接続してEXCELのシートにSELECT文を発行すると、 『[Microsoft][ODBC Excel Driver]選択された CollatingSequence は OS でサポートされていません。』のエラーが出ます。 SELECT文に条件を付けると上記エラーが発生します、条件なしの場合はエラーが発生しません。 エラーが発生してもデバッグで F8 で実行すると正常に条件付きでSELECTされます、 エラーは一回目のSELECTだけで、以降はエラーが発生しません。 対処の方法をお教え下さい。 よろしくお願いします。 (("Microsoft.Jet.OLEDB.4.0"を使用してもエラーが発生しました。)) (例) 'テンポラリファイルを取り込む Dim querydef As DAO.querydef Dim adoCON As New ADODB.Connection Dim adoRS As New ADODB.Recordset Dim strV As String Dim strQ As String 'ADOを使い読み込み専用モードでExcelファイルを扱う準備(オープン)をします adoCON.Open "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}; " & _ "DBQ=" & "C:\test2014.xlsx" & ";" & _ "ReadOnly=True" 'SQLを実行(全件検索)   OK Set adoRS = adoCON.Execute("SELECT * FROM [Shite1$]") 'SQLを実行(条件付き検索) NGエラーが発生します。 Set adoRS = adoCON.Execute("SELECT * FROM [Shite1$] WHERE A = 7 ")

専門家に質問してみよう