
こんにちは。お世話になります。
VBAで、ExcelシートをAccess側でデータ型を指定してテーブルにインポートする方法
をご教授いただきたく書き込みをさせていただきました。
値("001")と数値(1)が混在する列を
整数型のフィールドに保存するというようなことがしたいです。
今までは、
1.ExcelをCSV形式で保存する。
2.インポート定義ですべてテキストを指定
3.テーブルの項目定義でデータ型を指定したところにインポート
ということをおこなっておりましたが、
1.のCSV保存の際にデータの丸めが発生してしまう問題が発生してしまいました。
(※本来の値が123456789.12であるような場合に、
123456789.1とシートに表示され、そのままCSV化してしまう。)
直接Excelからですと正しくデータがインポートされるようですので、
いろんなサイトを参考に、
・すべてテキスト型の仮テーブルを動的に作成し、
Excelシートをインポート
というところまで作ってみたのですが、
これを本来のデータ型を指定したテーブルに追加しようとすると
”型が違います”エラーがでてしまって、
CSVのように無理やりデータを受け取ってはくれず
どうしたらいいのか壁にぶつかって困っています。
Accessを使われている方々はどんな方法で
あまりデータがきれいでないExcelシートの場合のインポートをされているのでしょうか?
検索しても同じことで困ってらっしゃる方の質問があまりないことからも
自分の知識不足で、回りくどい変な方法になってしまっている気がしてなりません。
お時間のある時に是非アドバイスよろしくお願いいたします。
Access2002:WindowsXP
No.3ベストアンサー
- 回答日時:
補足
ただし、当然のことながら"AAA"などの文字列を整数型にすればエラー値になる。
ちなみにそんなデータは0にするなら、
iif(iserror(CInt([book1].[フィールド1])),0,CInt([book1].[フィールド1]))
で回避できる。
かもしれない、やった事無いが。
そうですか、エラーになったら、ただNullになってしまうのかなぁっと思っていましたので、そのあたりもちゃんと仕様をつめる必要があるんですね。参考になる補足まで書いていただきありがとうございます。
No.4
- 回答日時:
>あまりデータがきれいでないExcelシートの場合のインポート
エクセル形式だと、「大きなお世話」をしてくれる事が多いので、質問者さんと同様に、テキストファイルで、定義ファイルを用いて処理しています。
Excelでは、Range("A1").Valueと、Range("A1").Textで、セルの内容が取得できますが、後者の場合は、表示されている状態での取得になります。ExcelのCSV形式出力は、.Textの方で行っている様ですね。
自分で、Tab区切りテキストファイルへの出力ルーチンを作成されては如何でしょうか。Tab区切りにする時は、1行分の文字列を生成しないといけないので、.Valueでいきなり結合はできないでしょうが、trim(str(.value))でも入っている通りの値が得られる様です。
Sub test()
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.CreateTextFile(ThisWorkbook.Path & "\" & "Sample.txt")
.WriteLine ActiveSheet.Range("a1").Value
.WriteLine ActiveSheet.Range("a1").Text
.Close
End With
Set FSO = Nothing
End Sub
なるほどーー。そういうことなのですね。
以前、valueとtextの違いで思った値が取れなくて困った経験がありましたが、CSV出力時にはtextということなんですか!激しく納得です!
やはりデータのほうをキレイに出力してインポート、というのが正しい姿なのですね。
コマンドボタン押下時に、
ユーザーが指定したxlsファイルを、いただいたコードでtextで保存しなおして、Accessにインポート。
そのあとに使用したtextファイルを削除。
とすればユーザーは意識することないってことですね!
先ほどhotosysさんに教えていただいた方法とどちらがいいのか悩みます~。
後々後任者が不自然に思わない方法をとりたいなぁっと思っているのですが、悩みますー。
項目数がおよそ200項目のファイルもありますので、あとは実行時間で考えたいと思います。
色々な方法をご提示いただいて、みなさまにとても感謝です。
No.2
- 回答日時:
読み込んだテーブルを基にクエリを作る。
例えば読み込んだテーブル名がBook1で、フィールド1,フィールド2,フィールド3,フィールド4があるとする。
新規でクエリを作り、
フィールド1: CInt([book1].[フィールド1])
フィールド2: CDbl([book1].[フィールド2])
フィールド3: CCur([book1].[フィールド3])
フィールド4
と指定すれば各々、整数、倍精度浮動小数点型、通貨型、そのままのデータ型、のデータになる。
ただし、当然のことながら"AAA"などの文字列を整数型にすればエラー値になる。
本来のテーブルの項目定義のデータ型をfield.typeで判定させ、
そのデータ型にあったCint()やCdbl()を挿入しながらSQLを組み立てて実行する。。。
(お伝えしていませんでしたが、functionとして共通利用したいので、動的に都度SQLを実行しようかと思っています)
なるほど!出来そうな気がします~!
hotosysさんご回答ありがとうございました!
No.1
- 回答日時:
>値("001")と数値(1)が混在する列を
"001"という値はテキスト型です数値型のフィールドには取り込めません
>Accessを使われている方々はどんな方法で
>あまりデータがきれいでないExcelシートの場合のインポートをされているのでしょうか?
Access(データベース)はデータの整合性を確保するために非常に制限が厳しいです
きれいでないExcelデータはそのままでは取り込めません
”001”と1をともに1として取り込みたいと伝えたかったのですが、説明が足らず申し訳ありません。
そうですか。。。
CSVって何?Excel!っという職場環境も多いように感じておりましたので、
Excel取り込みもよくあることで、きっと何か技があるのだろう。。。と夢みていたのですが、悲しい結末です。
ご回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Access(アクセス) accessでexcelを読み込む時のデータ型 1 2022/03/28 19:45
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) CSVファイルがカンマ区切りにならない。対処法を教えていただきたいです。 仕事でSMS一斉送信ができ 2 2022/07/01 21:24
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) excelの列幅高さが勝手に変わる(特定のPCだけ) 8 2022/07/14 16:51
- Excel(エクセル) EXCELの外部データ取得ができない 1 2023/03/23 09:03
- Excel(エクセル) Power Query でのデータの一括修正について 2 2022/05/10 02:00
- Excel(エクセル) マクロVBA別Excelブックにデータ転記 2 2022/07/10 23:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access2000 2番目に大きい数値...
-
Accessのクエリで、Left関数を...
-
【access】テキストから日付へ...
-
アクセスのフィールドデータを...
-
アクセスで前年対比を出す方法...
-
Access2003でフィールドのデー...
-
ACCESS クエリで重複データを最...
-
テーブルに主キーを作らないデ...
-
「データベースまたはオブジェ...
-
ACCESSにてフィールド間の最小...
-
accessのレポートであとから他...
-
ACCESSでクエリを作成したら「...
-
Access 複数フィールドの一致
-
Accessのフォーム上にレコード...
-
アクセス非連結フォームのテキ...
-
選択したチェックボックスのみ...
-
オートナンバー型を1から始める...
-
「メソッドまたはデータメンバ...
-
アクセスのフォームのビューが...
-
accessで、「集計のオプション...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのクエリで、Left関数を...
-
アクセスで前年対比を出す方法...
-
別のテーブルのフィールドを抽...
-
Access2000 2番目に大きい数値...
-
Accessでグループ化した結果フ...
-
Accessでフォームへのフィール...
-
【access】テキストから日付へ...
-
ファイルメーカーで名前のよみ...
-
NULL値を含む場合のフィルタ
-
ファイルメーカーで住所内の市...
-
Accessの入力について
-
[Access]クエリの抽出条件について
-
access で「指定したフィール...
-
図面の管理をしたい
-
ACCESSのフィールドに記述する...
-
筆王の宛名書き
-
LotusNotesで全角の空白を半角...
-
VBAで日付型とテキストでフィル...
-
ファイルメーカーのチェックボ...
-
Access_vbaフィルタ機能
おすすめ情報