- 締切済み
VBAでのフィールド追加処理
AccessVBAにて既に定義されているテーブルにフィールドを追加する処理にて、'**の部分でエラー(同名のフィールドが既にあるエラー)が起きます。以下の記述をしています。 フィールド追加は2つのテーブルに対して実施しています。 Do While iC < rstH.Fields.Count For Each fldLoop In tdfM.Fields sName = rstH.Fields(iC).Value If sName = fldLoop.Name Then 'H_workにはフィールドを設定 tdf1.Fields.Append tdf1.CreateField(sName, dbText, 100) Else Set fd = tdfM.CreateField(sName, dbText, 100) '空文字列の許可=true fd.AllowZeroLength = True tdfM.Fields.Append fd '** tdfM.Fields.Refresh 'Test tdf1.Fields.Append tdf1.CreateField(sName, dbText, 100) End If iC = iC + 1 If iC = rstH.Fields.Count Then Exit For End If rstH.MoveFirst Next fldLoop Loop 既に設定されているフィールド名の場合は、If sName=fldloop・・・の部分を通るはずですが、何故か 想定と違った分岐をしてしまっています。原因が解りません。どなたか教えて下さい。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- myRange
- ベストアンサー率71% (339/472)
回答2、myRangeです。 先ず、 >sName = rstH.Fields(iC).Value >sName = rstH.Fields(iC).Name >でもどちらでも良いです。 そんなことはないでしょう。 名前を比較してるわけですから、 sName = rstH.Fields(iC).Name でないと拙いのではありませんか? ちょと全コードを見てみました。 >既に設定されているフィールド名の場合は >If sName=fldloop・・・の部分を通るはずですが 提示のコードではそうなってません。 例えば、 rstH のField名が、AAA、BBB,CCC tdfM のField名が、XXX、AAA,CCC となってた場合 提示のコードでは、 Filed名1番目同士 AAAとXXX を比較して 等しくなかったら、即、AAAを追加するようになってます。 AAAは、tdfMにあるわけですからエラーになるのは当然です。 rstHのAAAがtdfMにあるかないかは、 tdfMのfield名を全て検索した後でないと分かりませんよね。 で、以下のように。 '-------------------------------------------- Dim Flag As Boolean 'あるかないかの判断用フラグ For IC = 1 To rstH.Fields.Count Flag = False sName = rstH.Fields(IC).Name tdf1.Fields.Append tdf1.CreateField(sName, dbText, 100) For Each fldLoop In tdfM.Fields If sName = fldLoop.Name Then Flag = True Exit For End If Next fldLoop If Flag = False Then Set fd = tdfM.CreateField(sName, dbText, 100) fd.AllowZeroLength = True tdfM.Fields.Append fd '** tdfM.Fields.Refresh 'Test End If Next IC End Sub '------------------------------------- 当方、Accessは持ってないで 通常のコードの流れを回答していますので。。 以上です。
- myRange
- ベストアンサー率71% (339/472)
Access云々は別にして、、、、 >sName = rstH.Fields(iC).Value これは、「値」を取得するコードだと思いますが。 いいんですか? 以上です。
補足
>sName = rstH.Fields(iC).Name でもどちらでも良いです。 プログラム実行中に、この2つの変数にマウスをポイントすると、 明らかに違う日本語が確認出来るのですが、何故このロジックを通ってしまうのか解りません。 宜しくお願い致しますm(_ _)m
- A88No8
- ベストアンサー率52% (836/1606)
こんにちは >既に設定されているフィールド名の場合は、If sName=fldloop・・・の部分を通るはずですが、何故か想定と違った分岐をして.. ACCESS VBAは全く判りませんがIF文の比較の時に想定と違った動きをするときは二つの変数の内容が違うということです。 二つの変数の型が一致しているかどうか(自動的に型変換されている場合がある)、二つの変数の文字数が同じかどうか(DBに多い固定長の場合既定長までパディングキャラクタで埋まっていることがある)。 外しているかも知れませんが、こんな観点もあるということで..
お礼
なるほど!ありがとうございました。 これでやってみます。