• 締切済み

AccessでExcelデータをインポート

お世話になります。  Access2003/2010  Excel2003/2010 10年程前より、Access2003で作成したツール(Excel2003形式のファイルを インポート)を利用しております。 Excelファイルは毎日追加/更新しているのですが、先日、とうとうExcel2003 の行の上限である65,536行を超えてしまいました。 今後はExcel2010形式のファイル(行の上限は1,048,546行)とし、かつ、 2010形式のファイルをインポートできるようツールの修正をしなければならなく なりました。 ツールの修正というよりは、今までAccess2003上で使用していたので、そのまま Access2010上で使用したいだけなので、修正が必要がどうかも分からない 状況です。 そこで2点質問ですが、  1.現状インポートする際は、   DoCmd.TransferSpreadsheet acImport, 8, "temp", strFile, True   としておりますが、「8」の箇所は2010形式のExcelをインポートする場合   どのように修正すればよいでしょうか。   ヘルプを見ても8(Excel2000形式)までの記載しかありません。   とりあえず8のままExce2010形式で、かつ2003の行の上限を超えている   ファイルを(66000行)インポートしてみましたが、行は削れることなく   インポートできました。  2.インポート時の文字数制限について   インポートするExcelファイルの「備考」フィールドは文字数が多いのですが、   Access2003上で使用すると全ての文字列(750文字程度)をインポート   できておりました。   しかしAccess2010上で使用すると、文字列が途中で切れる(255文字)   不具合が発生しました   インポートする際は、あらかじめテーブルを作成しておき、そこに対して   Excelのデータをインポートしております。なお、「備考」のデータ型は   メモ型です。   (255文字で切れることから)恐らくAccessがインポートする時点で「備考は   テキスト型」と判断しているから255で切れてしまうのではないか、で、切れた   文字列をメモ型に入れてるだけのように見受けられるのですが。。   2003から仕様が変わってしまったのでしょうか。   上記のことから、インポートするExcelの先頭行の「備考」に、適当な文字列   (750文字)を入力し、それをインポートすると途切れることなくインポート   できました。   ※Accessがメモ型と認識したから? ※いずれもツールをAccess2010上で使用した状況です。 ご教示の程、宜しくお願い致します。

みんなの回答

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

8→10    だと。 以前も似たような質問がありましたが、 http://okwave.jp/qa/q8413669.html 上記は、 varStr = Split(buf, ",", , vbTextCompare) のところを、 varStr = Split(buf, ",", , vbBinaryCompare) と、引数を変更する必要がありましたが。 たとえば、以下のように、メモ型のデータがある場合、配列に 入れ込んでAccessでテーブルに入れるという方法 ぐらいだと思いますが。 例えば、Excelで 番号  名前    住所     質問 1    徳川    東京    秋刀魚は、・・・・・ 2    織田    名古屋   外郎の・・・・・・・ 3    豊臣    大阪    タコヤキの・・・・・ のような、データがあり、Accessに同じ構造の テーブルがあるとして、 Dim db As DAO.Database Dim rs As DAO.Recordset Dim i As Long Dim j As Long Dim k As Long Dim m As Long Dim App As Object Dim obj As Object Dim sheet As Object Dim buf As Variant Dim varData As Variant Set db = CurrentDb Set rs = db.OpenRecordset("T質問", dbOpenDynaset) Set App = CreateObject("Excel.Application") App.Visible = True App.Workbooks.Open (CurrentProject.Path & "\mydata1.xls") 'obj.Visible = True i = App.Worksheets("Sheet1").Range("A1").End(xlDown).Row For j = 2 To i   For k = 1 To 4     If k = 1 Then       buf = buf & App.Sheets("sheet1").Cells(j, k)     Else       buf = buf & "," & App.Sheets("sheet1").Cells(j, k)     End If   Next k   varData = Split(buf, ",", , vbBinaryCompare)   rs.AddNew     For m = 0 To UBound(varData)       rs.Fields(m) = varData(m)     Next m   rs.Update   buf = "" Next j App.Quit Set App = Nothing rs.Close: Set rs = Nothing db.Close: Set db = Nothing のような、感じですかね。 あるいは、大量のデータを処理するならば、 一旦、そのまま DoCmd.TransferSpreadsheet acImport で、入れてその後、メモ型のフィールド のみを配列に入れて上記の一部を以下のようにして、 メモ型のフィールドを書き変えるかでしょうか。 i = App.Worksheets("Sheet1").Range("A1").End(xlDown).Row For j = 2 To i   If j = 2 Then     buf = buf & App.Sheets("sheet1").Cells(j, 4)   Else     buf = buf & "," & App.Sheets("sheet1").Cells(j, 4)   End If Next j   varData = Split(buf, ",", , vbBinaryCompare)   m = 0   rs.MoveFirst   Do Until rs.EOF   rs.Edit   rs.Fields(3) = varData(m)       'あるいは、       'rs!質問 = varData(m)   rs.Update   m = m + 1 rs.MoveNext   Loop この場合は一度にデータを配列に入れますから、 メモリの余裕がなければフリーズ、ということに なるかもしれません。 余裕がなければ、ExcelとAccessを行ったり来たり といことになります。 上記の二つを一つのプロシージャの中に、どちらかの変数(i、j、m など) を違うものして一度にやってしまうか、あるいは、別個にして実行 するかのどちらかだろうと思いますが。

naoto0216
質問者

お礼

いつもご回答ありがとうございます。 >8→10    だと。 これってどこかに情報載ってますでしょうか。色々探してはみたのですが。。 とりあえず、10に変更して問題なくインポート(エクスポートも)できることを 確認しました。 元々インポートしているExcelファイルに限界があり、運用自体も変えたい ところではあるのですが、なかなか手を付けられずにいます。 Excelファイルは質問にも書きましたように、既に65000行を超えており かつ、100列ほどあります。 なので教えて頂いた上記処理に耐えられるかどうか。。 なお、レジストリの修正については先日行ってみたのですが、 状況かわらずでした。 TypeGuessRowsを「0」にして、ImportMixedTypesを 「MajorityType」に変えてみたのですが、何か間違ってますでしょうか。 なお、「MajorityType」にするとTransferSpreadsheetの箇所で エラーになったのでTextに戻しました。

関連するQ&A

  • Access2007へのデータインポート

    Excel2007で作った、2列だけの40,000行にわたるデータがあります。この1列目には数値が入っていて、複数の行に同じ数値が入っています。2列目は文字列です。 これをAccess2007で作ったデータベースに取り込みたいのです。 データベースにはIDフィールド(固有数値)とメモ型に規定されたフィールドがあり、Excelの1列目の数値がAccessのIDフィールドと一致したら、Excelの2列目の文字列を、メモ型に規定されたAccessのフィールドにインポートする作業を目指しています。 結果的に、メモ型に規定されたAccessのフィールドにはたくさんの文字列が連なるようにしたいのですが、方法がわかりません。 教えていただける方がおられましたらうれしいのですが・・・。どうぞよろしくお願いいたします。

  • Access Excelインポート時の制限について

    お世話になります。 Access2010 Win7Pro Excelファイルのデータをインポートし、それをSQLサーバーへ エクスポートするツール(Access)があります。 例えば、Excelに「ID」と「メモ」というフィールドがあり、1500行 あったとします。 また、メモには100文字程度の文字列が入力されています。 それをインポートすると、問題なくメモの100文字はインポートできます。 但し、1000行目のメモに500文字入力されている場合、それを インポートすると255文字に削られてしまいます。 これはインポートするときに、先頭から数行がチェックされて データ型が自動的に決められる為、上記のケースだとテキスト型に なってしまい1000行目のメモは255文字に削られている・・・ ということだと思います(仕様)。 なので、現状はExcelをインポートする前に先頭行のメモを255文字 以上入力した状態でインポートし、SQLサーバーへエクスポート後 テーブルの先頭レコードのメモより不要な文字(追加して入力した分)を 削除しております。 当該ツールを使って、インポート⇒エクスポートするのは日々の作業なので 毎回メモに文字を追加して、あとで削除するというのが手間でなりません。 なにかよい方法はございますでしょうか。

  • アクセスへのデータインポートが上手くいきません。。。

     アクセスへのデータインポートで知恵をおかし下さい! <現象>エクセルからアクセスへデータインポートをしようとしたところ、エクセルで【01】のものがインポートすると【1】になってしまいます。 エクセル上での【01】の表示形式は、分類:ユーザー定義、種類:00、になっております。 文字列に変えようとすると、してみましたが、【1】になってしまいます。。。。  どのように、したら、【01】としてインポートできるのでしょうか。教えて下さい。

  • アクセスへのインポートについて

    こんにちは。アクセスへインポートするエクセルファイルが 以下の構造になっており、どうした物か分からず困っており ます。 エクセルの1シート上にA列~IF列まで、行数は1~1200 行まで使用したデータがあります。 各セルに入力されているデータは、全て半角の文字10文字です。 又、不規則にブランクがあります。   A   B C ・・・・IF 1行目 123-456  456-321 213-901 2行目 ブランク ブランク 438-698 3行目 ブランク 361-465 ブランク  ・  ・ 1200行 このデータをアクセスのテーブル、1つのフィールドに 全部インポートするやり方が分からず、途方に暮れて おります。 アクセス、エクセルお詳しい方、何卒宜しくお願い致します。

  • Access97 Excelファイルのインポート

    はじめまして、こんにちわ。 早速ですが、質問させてください。 Access97で既存のテーブルにExcelファイルをインポートした際にエラーがでてインポートできないファイルがありました。その原因を調査している次第です。 Excelファイルは様々な担当者に作成いただく予定ですので、エラーの再現性を確認して、原因となる作業を予め禁止しておきたいと考えております。 (1)ファイル→外部データ取込→インポートからインポートするExcelファイルを選択し、インポートボタンを押したところ、『ファイル○○にアクセスできません。このファイルが存在するか、またファイルの形式が正しいか確認してください』と言うエラーが出ます。 実際にそのファイルは開けますし、同じように作成したファイルはインポートできるものもあります。 中身を全てコピーし、新規作成したExcelファイルに貼り付けて名前をつけて保存したものをインポートすると、問題なくインポートできました。 どういった作業をすると、上記エラーが出るようなファイルになってしまうのでしょうか。 (2)ファイル→外部データ取込→インポートからインポートするExcelを選択し、インポートボタンを押した後、ワークシートインポートウィザードで『先頭行をフィールド名として使う』をチェックすると、『先頭行にAccessフィールド名に使用できない文字が含まれています。』というエラーが出ます。 調べてみると、空白の列がフィールドとしてインポートされるようになっています。Excel上では何も表示されていない列で、その列を削除すればエラーがなくなります。 どういった作業をすると、空白の列や行がインポートされるようになってしまうのでしょうか。 お手数ですがよろしくお願い致します。

  • 【再】AccessでExcelインポート時の制限

    お世話になります。 ※再投稿となります。 Access2010のExcelインポート時の制限につきまして、ご教授頂けたらと思います。 現在、VBAにてExcelをインポートし(※)、その後、SQLサーバーへエクスポートする処理を行っておりますが、Excelの「備考」の文字数が多くなってきた為、途中で文字が切れないよう修正することとなりました。 上記(※)の処理では予めローカルに空のテーブル(temp)を作成し、そこにExcelデータをインポートしております。  DoCmd.CopyObject "", "temp", acTable, "tempcopy"  DoCmd.TransferSpreadsheet acImport, 8, "temp", strFile, True tempはtempcopyをコピーして作成しており、今回tempcopyの「備考」をテキスト型からメモ型に変更しました。 これにより「備考」の文字は途中で切れなくなりました。 ※当該mdbはAccess2003にて作成。 しかし、このmdbをAccess2010で実行すると、文字が途中で切れてしまいます。 Access2010は2003とインポート時の仕様(制限)が異なるのでしょうか?その場合、どのようにすれば文字列が途中で切れずにインポートすることが出来るようになるのでしょうか。 以上、宜しくお願い致します。

  • access2010でメモ型がインポートできない

    以前のACCESS2000では出来ていたのですが、ACCESS2010(windows7)にバージョンアップしたところ、csvファイルのインポートで、メモ型のデータが255文字までしかインポートできなくなりました。 調べてみたところ、そのフィールドを、クエリなどで使用しているとキャスト(型変換)されるのでメモ型ではなくなり255文字の制限がかかる、との記述がありましたが、新しいテーブルを作成してインポートしてもできませんでしたので、別の原因かと思われます。 また、ACCESS2000のデータを、ACCESS2010の[ファイル]-[保存して発行]・・・・も行い、拡張子を.accdbにしてみましたが、やはり255文字を超えるインポートができませんでした。 インポート時の[設定]のところのフィールドの情報で、メモ型にしてあるフィールド名が表示されていないのが気になりますが。 文字列の引用符は ” にしています。 ACCESSはデータの25行目までを読み込んでデータ型を自動選択している、という記述もあり、1行目のデータに256以上の文字を入れてインポートもして見ましたが255文字で切られてしまいます。 よろしくお願いいたします。

  • エクセルのデータをアクセスにインポートするのに

    EXCEL2000、ACCESS2000を使用しています。 エクセルのデータをアクセスにインポートする場合、一般的な表形式であれば一括でインポートできるのですが、いわゆる帳票形式のような縦横の表ではないデータをインポートすることはできるのでしょうか。

  • Excelのデータ(数字)をテキスト型としてaccessにインポートする方法

    Excelの「セルの書式設定」を「文字列」にして、数字を入力し、accessで「インポート」すると「データ型」が「倍精度浮動小数点型」となって「1(2)」や「1&2」と入力した行がインポートできずerrorとなります(普通の数字はインポートできます)。Excelの書式設定を「ユーザ定義」→「@」としても同じです。またaccessでテーブルのデザインでそのインポートするフィルドを「データ型」としておいてインポート操作をしてもインポートされません。Excelを開きそのセルや行の書式設定を確認しましたが文字列となっています。どこが問題なのでしょうか? また正しくインポートできる方法を教えてください。 accessとExcelのバージョンは2003です。 よろしくお願いします。

  • EXCEL→ACCESSインポートでセル内改行が機能しません・・。

    EXCELデータをACCESSにインポートする局面で、 ・EXCELデータのセルは、CHAR(10)によって、セル内で改行されています。 ・これをACCESSへインポートすると、改行が機能せず連続した文字列となってしまいます。 ・ACCESSの該当項目は、メモ型(文字数が多いので)です。 EXCELでの表示と同一の表示がACCESSで得たいのです。 よろしくご指導下さい。