過去ログ

                                Page      79
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼フィールド名を変更したい  あおやま 02/10/25(金) 17:23
   ┣Re:フィールド名を変更したい  イケガミ 02/10/25(金) 17:35
   ┃  ┗ありがとうございました  あおやま 02/10/28(月) 9:42
   ┗Re:フィールド名の変更ではありませんが  YU-TANG 02/10/26(土) 16:00
      ┗ありがとうございます  あおやま 02/10/28(月) 9:47

 ───────────────────────────────────────
 ■題名 : フィールド名を変更したい
 ■名前 : あおやま
 ■日付 : 02/10/25(金) 17:23
 -------------------------------------------------------------------------
   こんにちは。
お世話になるのは二度目です。

VBAで、テキストのフィールド名を変更することはできるんでしょうか。
やりたいことは以下の通りです。

「DoCmd.TransferSpreadsheet」を利用して、
エクセルシートからデータをテーブルにインポートします。
その際、諸事情により、
エクセルの先頭行をそのままフィールド名にはしたくないのです。

DoCmd.TransferSpreadsheet acImport, 8, "書込み先テーブル名", "D:\excel\エクセル.xls", False, "シート名!B2:AE"

というように、1行目を取らないようにし、且つ、先頭行をフィールド名にしない(False)を選択すると、
フィールド名ナシでデータのみ取得できるのですが、
この場合、フィールド名は「F1」「F2」…でなければならないらしく、
書込み先のテーブルに予めフィールド名が入っていると、エラーになってしまいます。

そこで、存在しないテーブル名を「書込み先テーブル名」とすれば、
フィールド名は「F1」「F2」…となるもののインポートはできるので、
ここで作成されるテーブルのフィールド名を望むものに変更できれば、と考えました。
いかがでしょう、方法はありますでしょうか?


とはいえ、実は上記が可能でも別の問題がありまして、進む方向を迷っています。

インポート後のテーブルには、フィールド名の他に、書式もいろいろ設定しておきたいのです。
ですから、予めフィールドや書式を設定したテーブルを作成して、
そこへ書き込めればベストなのですけれども…

前に、以下のやり方を試してみました。
"INSERT INTO " & g_str_TableName & "(" & str_Field & ") " & "VALUES(" & str_Data & ")"
のstr_Fieldとstr_Dataとを編集するものです。

Public g_str_TableName As String 'インポート先のテーブル名称

Dim str_Field As String '書込み対象フィールド
Dim str_Data As String 'テーブルに書込むデータ
Dim strArrayField() As String '書込み先テーブルの全フィールド名が各要素

Set Obj_Excel = CreateObject("Excel.Application")

With Obj_Excel.Application

  '数値型のデータ
  If intCol = 6 Or 7 Or 25 Or 26 Or 27 Or 30 Or 31 Or _
    33 Or 35 Or 36 Or 39 Or 40 Or 41 Then
    '書込み対象フィールド追加
    str_Field = str_Field & "," & strArrayField(intCol - 2)
    'セルの中身を書き写す
    str_Data = str_Data & "," & .Cells(intRow, intCol)
  End If

  '日付型のデータ
  If intCol = 14 Or 19 Or 21 Or 23 Or 24 Or 29 Or _
    32 Or 34 Or 37 Or 38 Or 42 Or 47 Then
    '書込み対象フィールド追加
    str_Field = str_Field & "," & strArrayField(intCol - 2)
    str_Data = str_Data & ",'" & .Cells(intRow, intCol) & "'"
  End If

  'テキスト型のデータ
  If intCol <> 6 Or 7 Or 25 Or 26 Or 27 Or 30 Or 31 Or _
    33 Or 35 Or 36 Or 39 Or 40 Or 41 Or _
    14 Or 19 Or 21 Or 23 Or 24 Or 29 Or _
    32 Or 34 Or 37 Or 38 Or 42 Or 47 Then
    '書込み対象フィールド追加
    str_Field = str_Field & "," & strArrayField(intCol - 2)
    'セルの中身を書き写す
    str_Data = str_Data & ",'" & .Cells(intRow, intCol) & "'"
  End If
End With

  'str_Fieldが出来たら、最後に、一番左の","を削除すること
  If Left(str_Field, 1) = "," Then
    str_Field = Mid$(str_Field, 2)
  End If
  
  'str_Dataが出来たら、最後に、一番左の","を削除すること
  If Left(str_Data, 1) = "," Then
    str_Data = Mid$(str_Data, 2)
  End If
  
  If str_Data = "" Or str_Field = "" Then
  Else
    'SQL文作成
    strSQL = "INSERT INTO " & g_str_TableName & "(" & str_Field & ") " & _
          "VALUES(" & str_Data & ")"
    Set db = CurrentDb
    'SQL文実行
    db.Execute strSQL, dbFailOnError
  End If

こんな感じに、列に応じて3種類のパターンに分けてINSERTでやってみました。
すると、パターン分けでOrを使うとダメになるんです。
Selectもやってみて、(Case…Or…Or…(:数値の列、日付の列)、Case Else(:テキスト))
ダメでした。
確かSelectのときは全部Elseになってしまって。

Orを使わないとなると、ずらーーーっと1列ずつIf文を書くしかないのでしょうか。

 ───────────────────────────────────────  ■題名 : Re:フィールド名を変更したい  ■名前 : イケガミ <ikegami_kumamoto@dosule.com>  ■日付 : 02/10/25(金) 17:35  -------------------------------------------------------------------------
   ちゃんと見てないのでハズシかもしれませんが。。

>   '数値型のデータ
>   If intCol = 6 Or 7 Or 25 Or 26 Or 27 Or 30 Or 31 Or _
>     33 Or 35 Or 36 Or 39 Or 40 Or 41 Then
>     '書込み対象フィールド追加
>     str_Field = str_Field & "," & strArrayField(intCol - 2)
>     'セルの中身を書き写す
>     str_Data = str_Data & "," & .Cells(intRow, intCol)
>   End If

If intCol = 6 Or intCol = 7 Or ・・・
とするか、

Select Case intCol
  Case 6,7,25・・・
とすれば大丈夫だと思いますけど。。

 ───────────────────────────────────────  ■題名 : ありがとうございました  ■名前 : あおやま  ■日付 : 02/10/28(月) 9:42  -------------------------------------------------------------------------
   返信ありがとうございました。
お礼が遅くなってしまってすみません。

IfとSelectと、Orや「,」やいろいろ変えてやってはみたのですが、
どうも条件が2つ以上になると、Ifでは何でもthenになったり、
Selectでは何でもCase Elseになったりと、謎の動きになってしまいました。
しかし察するにイケガミ様のところではそのような事象はないようですから、
私のところだけの特殊な問題なのかもしれません。
(まだアクセスを使い始めて1ヶ月でして、分からないことが多く、
何か自分では気づかない間違いをしていたり、そういう何かの影響が残っているのでしょう。
以前他の件で相談させていただいたときにも、
とあるコードが上手く動いたり動かなかったりだったのですが、
改めて別のmdbを作ったら問題が解決したということがありました。)
次にこういうコードを書くときには、初めから
>If intCol = 6 Or intCol = 7 Or ・・・

>Select Case intCol
>  Case 6,7,25・・・
という形で書くようにします。
ありがとうございました。

 ───────────────────────────────────────  ■題名 : Re:フィールド名の変更ではありませんが  ■名前 : YU-TANG <yu-tang@my.tramonline.net>  ■日付 : 02/10/26(土) 16:00  -------------------------------------------------------------------------
   > ですから、予めフィールドや書式を設定したテーブルを作成して、
> そこへ書き込めればベストなのですけれども…

では、そうした方がよいでしょう。
IN 句を使った SQL 文一撃のケースに見えます。

一例を挙げるなら、たとえば C:\顧客管理.xls の Sheet1!A:C の
データを、テーブル tblCustomer にインポートしたいとしましょう。
Excel 側の 1 行目(A1:C1)は列見出しになっていて、「顧客コード、
氏名、住所」と列名が付けられていますが、インポート先のテーブル
側のフィールド名はそれぞれ「CustID, CustName, CustAddress」に
なっていて、列名-フィールド名が食い違うため TransferSpreadSheet
メソッドでは失敗してしまいます。

このケースでは下記 SQL 文でデータを追加できます。

CurrentDb.Execute _
  "INSERT INTO tblCustomer ( CustID, CustName, CustAddress ) " _
  & "SELECT 顧客コード, 氏名, 住所 FROM [Sheet1$A:C] " _
  & "IN 'C:\顧客管理.xls' 'EXCEL 8.0;';"

上記は DAO の場合ですが、SQL 文の実行自体は ADO でも Access(DoCmd)
でもかまいません。
IN 句の記述法には例示しなかったもう一パターンあるので、詳細に
ついては Jet-SQL のヘルプで IN 句を調べることをお勧めします。

 ───────────────────────────────────────  ■題名 : ありがとうございます  ■名前 : あおやま  ■日付 : 02/10/28(月) 9:47  -------------------------------------------------------------------------
   YU-TANG様、返信ありがとうございます。
なるほど、フィールド名が違うときには、書込み側のフィールドだけでなく
読取り元のフィールドも設定できるんですね。
特に、IN句というのは今回初めて目にしました。
>IN 句の記述法には例示しなかったもう一パターンあるので、詳細に
>ついては Jet-SQL のヘルプで IN 句を調べることをお勧めします。
はい、勉強してみます。
アドバイスありがとうございました。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 79