差し込み印刷の設定が保存してあるWordを開いたら、 『エラーが発生しました。外部テーブルのフォーマットが正しくありません。』 とエラー表示されちゃうんだ。 ・ ・ ・ 〔びすこ〕 参照しているExcelをあらかじめ開いておけば大丈夫ですよ。 word2013 差し込み印刷 できない エラー 外部テーブルのフォーマットが正しくありません 差し込み用EXCELファイルはローカル(ドキュメントとか)にコピーして、 Excelで開いたうえで指定するとうまくい … Wordの差し込み印刷は、「Wordの差し込み文書」と「Excelなどのデータソース」をペアにして使うことが多いと思います。 このペアを他人に渡した場合など、別の環境で差し込み文書を開こうとすると次のようなエラーメッセージが表示されることがあります。 ワード2010で差し込み印刷をする際にエラーが出て印刷できません。住所録はエクセル2010を使用エラー内容:エラーが発生しました。外部テーブルのフォーマットが正しくありません。どうしたらいいか教えてください。 間違いありません。安心して続けてください) ここでは、Excel で保存したCSV ファイルを指定します。 B-4 CSV ファイルの取り込みオプション画面が現れます。 B-5 P-touch Editor のデータベースに、データが取り込まれ、以下の画面が現れます。 これで、P-touch Editor に、Excel/CSV のデータが取り込 … Wordの印刷機能で「差し込み印刷」というものがあります。皆さんは、この機能を使っているでしょうか?差し込み印刷ができるようになると、Wordの印刷がもっと便利になるのでおすすめです。今回はWordの差し込み印刷にスポットを当て、色々な角度 Win2000,Access2000,Excel2000を使用しています。アクセスのテーブルを既存のエクセルファイルへエクスポートするマクロを組みましたが実行すると、 「外部テーブルのフォーマットが正しくありません。」というメッセージが出ます。ヘル VB.NETでエクセルを開こうとするとエラー。 Provider=Microsoft.Jet.OLEDB.4.0 で エクセルの拡張子は.xls 「 Microsof Excel 5.0/95 ブック」 で保存していると、 「外部データのフォーマットが正しくありません」 とエラーが発生します。 「Excel 97-20… 今Wordを開き差し込み文書→作成→はがき印刷→宛名面の作成でいろいろ実行していったところ、「エラーが発生しました。外部テーブルのフォーマットが正しくありません」と出てしまいました。昨日は出ていませんでした・・・くじけそうです。 アクセスのテーブルを既存のエクセルファイルへエクスポートするマクロを組みましたが実行すると、 「外部テーブルのフォーマットが正しくありません。」 というメッセージが出ます。 ヘルプを見ると、 「テーブルの形式がリンク後に変更されています。 word2013 差し込み印刷 できない エラー 外部テーブルのフォーマットが正しくありません 差し込み用EXCELファイルはローカル(ドキュメントとか)にコピーして、 E ... ファイル中の文字列を検索する . Excel2013で作成したパスワード付きのExcelがあります。 このExcelを利用してPublisherから差し込み印刷を行いたいのですが、方法が判りません。 接続に利用するプロバイダで「Microsoft jet 4.0」を選択し、「すべて」の「Jet OLEDB:Database Password」で Excelのファイルを開くためのパスワードを指定 … 挿し込み印刷では、http の場所での保存はサポートされていません。 Excel スプレッドシート Word で読み取ることができるように適切に書式設定されていて、1 つのシートにまとまっている場合、Excel スプレッドシートは宛名の差し込みのデータ ソースとして問題なく使用できます。 差し込み印刷の設定が保存してあるWordを開いたら、 『エラーが発生しました。外部テーブルのフォーマットが正しくありません。』 とエラー表示されちゃうんだ。 ・ ・ ・ 〔びすこ〕 参照しているExcelをあらかじめ開いておけば大丈夫ですよ。 VB.NETでエクセルを開こうとするとエラー。 Provider=Microsoft.Jet.OLEDB.4.0 で エクセルの拡張子は.xls 「 Microsof Excel 5.0/95 ブック」 で保存していると、 「外部データのフォーマットが正しくありません」 とエラーが発生します。 「Excel 97-20… エクセルとワードは、2000だと思います。アクセスのデータが、差し込みになっていたものを、エクセルにしようと考えています。ツール → はがきと差込印刷 → 差込印刷ウイザード → データの選択画面までは動かせたのですが、ここからが、 差込印刷で既存のデータを参照しようとすると、「データファイルを開くことができません」とエラーメッセージが出て来てしまいます。以前は同じ既存ファイルを使って問題なく出来ていたのに・・・・これは何に問題があるのでしょう?どう Wordの差し込み印刷は、「Wordの差し込み文書」と「Excelなどのデータソース」をペアにして使うことが多いと思います。 このペアを他人に渡した場合など、別の環境で差し込み文書を開こうとすると次のようなエラーメッセージが表示されることがあります。 Windowsには、UNIXの「grep」のような正規表現によって検索する「fi ... SublimeText2インストール~ … 卵焼き 器 食パン, ウイルスバスター For Mac 再インストール, あん スタ 福袋2020, レジン 失敗 削る, 放送大学 出願 方法, 8 5キロ 自転車, Slack ダイレクトメッセージ 通知, なで肩 肩パット メンズ, ● Excel2010で、開かれていない閉じたままのブック・Excel(xls)データをできるだけ速く読み込む方法(DAOにて) また、「閉じたままのブックからデータを読み出す方法」は、一般的には以下の5つがあります。(バージョン指定がないものは全バージョンで使えると思ってください。) ※参考記事 目次 ※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。 ★ はじめに 「32bitの」Excelファイルの値を、そのExcelファイルを開かずに読みに行く方法です。 (「64bitの」ExcelではDAOは使えないかもしれません(未確認です。)その場合はADOでやる方法があります。→こちら、でテストしましたが、これは32bitExcelでやったテストですので、64bitだとまた微妙にちがうかもしれません。ご参考にとどめるだけにしてください。) 閉じたままのExcelファイルのデータを取得するには、「ExecuteExcel4Macro」を使ったり、「Excel.Application」などで読み込む方法があるようなのですが、以下のサイトによりますと、データの量が多いと速度が遅くなる?みたいです。 というわけで、DAOとかADOなどのミドルウェアを使う方法で試してみました。 ミドルウェアとは、私もよくわかっていないのですみませんが、例えばExcelやAcessなどのアプリケーションソフトと、SQL ServerやJETエンジン、オラクル、MySQLといったデータベースシステムなどとの間に立って、お互いの仕様の違いを「なかったもの」としてデータをやり取りさせてくれるソフトウェアのこと・・・と大雑把には理解しています。 データベースのみならず、中間に位置してなんらかの便宜を取り計らってくれるソフトウェア全般とか・・・。 ODBCもミドルウェアの一種らしいです。 そんな感じです。 以下のサイトが図解でわかりやすかったのでご参考にしてください。 ・「間違いだらけのデータアクセス」から脱却するために ミドルウェア ちなみにですが、DAOやADOを使うと、具体的には、それ経由で Access/SQL Server/オラクル/MySQL、などのデータベースにアクセスし、そのデータをExcelシートに吸い込むことができます。 もちろん、データを読み行く対象は同じくExcelファイルでもOKですし、テキストファイルなどでも大丈夫です。 そういったことができることは以前から知ってはいたのですが、実際に使っていたのはAccess上でばかりで、Excelのデータを読みにいったことが無かったので、今回試してみました。 ========== ちょっとテストしてみたら、ネットワーク越し(UNCパス)のどこか向こう側のExcelファイルの中身を読みに行くにもそこそこ速いみたいなので、ご紹介したいと思います。(速くなかったらごめんなさい) 実際、僕自身の職場でも、ExecuteExcel4Macroでの処理と比べると10倍以上は速くなった気がします。 今はDAOよりもADOを使うほうが普通だと思いますが(なのかな??)、あえて、古いほうのDAOが使えないかテストしてみました。Excel2000、Access2000ともに、どちらでもDAOは使えるのですが、2010などの新しいExcelでも古い技術のDAOが使えるのかが疑問だったので・・・。 結果、一応、DAOも動くみたいです。(ただし新しいバージョンのExcelは 32bit版のExcelだけかも??64bitOSでもインストールされたExcelが32bit版ならDAOも動くみたいです。64bit版のオフィスならADOしか動かないかもしれません。ご自身でも調べてみてください。) というわけで、以降、テスト内容です。
まず、D:\DAOテスト.xls を作成します。 Sheet1のA1からC11に以下のように値を入力します。
※「xlFName = "D:\DAOテスト.xls"」の "D:\DAOテスト.xls" の部分は、UNCパスでもOKです。
では次に、"D:\DAOテスト.xls" のSheet2にも何らかのデータを書き、それをまた別のExcelファイルから読みこんで、そのファイルのSheet1に転記するテストもしてみます。 では、まず、"D:\DAOテスト.xls" のSheet2に、以下のようなデータを入力します。
できたら、そのシートの名前を、「読み込みテスト」という名前に変えます。 ※「xlFName = "D:\DAOテスト.xls"」の "D:\DAOテスト.xls" の部分は、UNCパスでもOKです。
Sheet1にうまく読み込めたでしょうか? 先にも書きましたが、これは読み込み対象のExcelファイルが、ファイルサーバにあったり、別のPCにある場合も、パスをUNCパスを使えば大丈夫です。 もともとDAOやADOを使うと、読み込み先のデータの指定(取得)が直感的でラクなので、また、「ExecuteExcel4Macro」などと比べるとかなり柔軟な処理ができるので、速くて処理もしやすいなら、これからこちらをメインで使うほうがいいかもしれないなあ、と思いました。 もちろん、「少ないセルの数・・・2、3個のセルの値を取得するだけ」、といった場合なら、「ExecuteExcel4Macro」のほうが短く書けるし便利なので、適材適所で使い分ければ良いと思います。 なお、レコードセット側のカレント行の列の値をExcelのセルに転記する場合、 WS01.Range("A" & i) = .Fields("氏名") といった記述方法でも、 WS01.Range("A" & i) = .Fields!氏名 という記述方法でも、どちらでも大丈夫です。 ただ、前者のほうが、( )の中身を・・・、リテラル値って変ですけど「実際の値というか名前」でも、また逆に、実際の名前じゃなくて「文字列型変数」でも、どちらでも格納(記述)することができるので、便利です。 汎用的なコードを書きやすくなる=共用部品を作りやすくなる=面倒くさいのが減る、ので、こちらの記述方法をおすすめします。 AccessでフォームのMeキーワードを使うときも同じです。 例えばテキストボックスなどを指定するときに、 見た目的にも「あ、コントロール名だな」とわかったり、サブフォーム内のコントロール指定でもカッコの数で記述ミスが無いかわかったり・・・。( )の中にIndex番号を使うこともあり、「あああ、これは本当に"オブジェクト"なんだな」と改めて「なるほど」と感じたり、「コレクション」の意味が少し直感的にわかりやすくなったり気付きやすくなったり・・・。オブジェクトとコレクションの関係が「!」を使う場合よりも明確に感じられたり・・・。 とにかく、(" ")で書くほうが、ヘルプやWebの解説とあいまって、何かと「気づき」が増えやすいと思うのです。 「!」ばっかりで書いていたときは、そういうことは全く起きませんでした。 「カッコばっかり多くてウザイ。読みにくい。」と感じる方も多いのかもしれませんが・・・ぼく個人としては視覚的にもやりやすいです。 また、VBEditorでは、かなり長い単語でもダブルクリックで一発文字列選択(一発単語選択、一発変数選択、など)ができるケースがほとんどなので、列名に関してはコピペなども使いやすく、("")の中に列名を入力する場合も手間がかからないため、さほど苦になりません。 よくAccessの参考書やWebサイトにて、フォームでもADOでもDAOでも、後者の「!」を使った記述方法がよく説明されるのですが、共用部品が作りにくくなっちゃって、意外と、けっこう面倒くさいです。 「最初から、 .Fields("性別") みたいな、書きかたを教えてくれればよかったのに・・・」、と思うことが多いです。 以下の例は、「D:\DAOテスト.xls」というExcelファイルの、「Sheet1」の内容を現在アクティブなシートに吸い込みます。 このようなやり方でやれば、後半に書いた「グリーンの三角のエラー」が出ませんので、列名も転記したい場合は、このやり方がひとつの基本、となると思います。
以下の例は、「D:\1\tes001.mdb」というmdbファイルの、「T99_社員マスタ」というテーブルのデータをシートに吸い込みます。 ファイルの置き場所はサーバでもいいので、「D:\1\tes001.mdb」の部分は「\\サーバ名\1\tes001.mdb」といったUNCパスでも大丈夫です。 こちらも、このようなやり方でやれば、後半に書いた「グリーンの三角のエラー」が出ませんので、列名も転記したい場合は、このやり方がひとつの基本、となると思います。
(00)結論 Excel2010でテストした場合なので、古いバージョンではどうなのかわかりませんが、また、表の形にもよるのかもしれませんが、一応、動的な表ではなく、多段的なクロス集計表(静的な表)であっても読み込めるっぽいです。(僕のほうだけとか2010だけとかだったらすみません!また、ネットワーク越しでUNCパスではまだ試してません!) そしてこの場合、1シートに複数の表があっても、また、結合されたセルがあっても読み込めるようです。 結合されたセルの値は、「勝手に」「分解されたものとみなされて」読み込まれるようです。 また、「シート上の」、「何らかの値が入力されたもっとも左側に位置するセル」が、「”このシート=このシステムテーブル”の一番左側の列」と自動認識され、「F1」という列名として認識されるようです。 結合されたセルについては、例えばシステムテーブルのどこかの行の、「F1」、「F2」、「F3」、で結合されていた場合なら、自動的に「F1だけに値が入力された」ものとみなされ、、「F2、F3、は空白」とみなされるようです。 参考 では、列の指定の方法をご説明します。
xlsm拡張子のサンプルファイルのダウンロード xls拡張子のサンプルファイルのダウンロード ※ウィルスチェックはESETで行いました。 サンプルファイルの名前は、2010用のものは「tes1.xlsm」で、2003以前用のものは「tes1.xls」です。 解凍してから「Dドライブのルートとデスクトップの2か所」にコピペして、デスクトップ側の「tes1.xlsm」や「tes1.xls」から試してみてください。 このサンプルはファイルの中身のシートで、「静的な表-意外とわかりにくい」というシート(クロス集計表)の内容の一部を、Sheet2に転記するものです。(「静的な表-意外とわかりにくい」というシートはDAOにて「システムテーブル」として扱っています。あと、Sheet2はだいぶ後ろのほうのシートです。) 基本的には、デスクトップの「tes1.xlsm」からも「tes1.xls」からも、Dドライブの「tes1.xls」(xls拡張子のほう)は読めると思いますが、「tes1.xlsm」では「外部テーブルのフォーマットが正しくありません」といった感じのエラーになると思います。これはxlsx拡張子のファイルに作り直しても同じです。 どうしても閉じたファイルの内容をDAOかADOで読みたい場合は、xlsmやxlsx拡張子のファイルの場合は、ADOで読みに行くのが良いかもしれません。(一番最後にADOでのテストの記事のURLを載せてあります) なお、2010でファイルを開いた場合は、xlsmでもxlsでも、「コンテンツの有効化」を押してからお試しください。 VBEの「参照設定」に、「Microsft DAO 3.6 Object Liblary」にチェックが入ってないとエラーになりますのでそこを事前に確認してください。 あと、Sheet2に読み込んだ値が数値のセルだけ下図のようになってしまったら、その下のURLのWeb記事に解決方法が書いてありますのでそれをそのままお試しください。 『文字列扱いになっている数字を数値へ一括で変換する方法』 一応、「ファイル→オプション→数式」、にて、「エラーチェック」のところで「バックグラウンドでエラーチェックを行う」のチェックをはずすと緑のマークやミニメニューは表示されなくなります。 でもちょっと心配なので、上記URLのように「1をかけてしまう」ほうが確実かと思います。 ※2018/07/29追記:VBAにてワンクリックでグリーン三角マークを消して数値化するサンプルプログラムを作りましたのでご覧になってみてください。 『Excel2010:「このセルにある数値が、テキスト形式か、またはアポストロフィで始まっています」というグリーンの隅っこ三角エラーマークを消して、セルの値を明示的に数値化するプログラム』
列名は、読み込み元の表(システムテーブル)の何らかの値が入った列(=起点となるセル=列名だけでも可のようです)の「一番左の列から順」に・・・、 「F1」 という名前でDAO側では自動認識されます。 あるいは 「0」 とDAO側から自動認識されます。 なお、この場合は列の直接の名前ではなく、 「左からの列番号が0番の列(つまり1番目の列)」 という意味で扱われます。 なので、読み込みたい列の指定方法としては、前述のプログラムの場合を例にとると、 RS.Fields("F1") といった感じで指定するか、あるいは、 RS.Fields(0) と指定します。 ここでの注意点としては、シート=システムテーブル上のA列が「F1」の列にみなされるわけではなく、最初に値の入ったセル(起点のセル)の列が「F1」になります。 (※ ただ、これはExcelのバージョンによって違うかもしれません。でも2010ではこういう動きでした。2000だと「A列=F1=0」になるっぽいです。僕のPCだけかもしれませんがもしそうだったらごめんなさい。後述の(08)に少しこのことについて書きました。) 例えば、A列もB列もC列も全部(縦方向に)空白で列名も無く、D列になって初めて何らかの値が入っていたら、それが列名であっても値であってもD列が「F1」にみなされます。 なお、シート=システムテーブル上に複数の表があって、それぞれ、複数の空白列で区切られている場合は、その区切りの空白列は「F×××」とみなされるようです。 「F×××」という列名で「みなされない」のは、シート=システムテーブル上の一番最初(一番左側&一番上側)に位置する表・あるいはセルの左側に、「もし空白列があった場合は、その列だけ」のようです。 参考:列と行について あと、こちらの→「ADO.NETでExcelファイルに接続する」のサイトに、レコードセットのデータ範囲について少し詳しい説明がありました。 ここから少し引用させていただきます。 =========引用ここから======== 【レコードセットのデータ範囲について】 •[名前](Excelで定義した領域名) をテーブル名として、SELECT/INSERT/UPDATEが普通に使えます。ただしDELETEはできない。 =========引用ここまで======== これはDAOではなく、ADOに関するWebページの記述でした。 なお、ADOでは・・・ •[シート名$セル範囲]([シート名$] の範囲内のみ)は •[シート名$名前]は 一応、こちらもご参考に↓。「Excel 8.0」みたいな「ISAM形式」についても書いてあります。 『DAOでExcelデータを読み込みテキストボックスに表示』 ポイントだけ引用させていただきます。 =========引用ここから======== 接続文字列のオプション IMEX の意味と結果 HDR=NO 1行目を読み込んで表示する。 組合せによる表示状態(※テキストボックスに表示した場合) =========引用ここまで======== ※実際に、上記のIMEXの値を変えて、HDR=NOやHDR=YESや省略を試すと、エラーで読み込めないケースもありました。なのでこの情報をベースに、ご自分でも状況に応じて事前にお試しください。(2018/08/11追記)
また、列に関してはそういう風で、行に関しては起点のセルに関係なく、空白行があっても無くても、それも含めて「××行目」とみなされるようです。 ただ、「(シートとしての)1番最初の行は「列名」のための行」、とみなされます。 ですので、シート=システムテーブル上の・・・
少しまとめますと・・・、次のような感じです。 シート=システムテーブル上の、何らかの値が入力された「最も左・最も上」のセルを起点として、 列に関しては、シートの列番号A、B、C、、、に関わらず、 行に関しては、シートの行番号1、2、3、、、から「マイナス1」した数が、 もし複数の表があっても、最初のセルが起点となって、そこから数えて、あとは同上。 ・・・という感じになります。 (05)※補足:「F1」「F2」「F3」「F4」・・・という列名は本当は誰が決めるのか? これは僕はよくは分かっていないのですみませんが、動きを見てますとなんとなくですけど、多分、Excelが勝手に決めてくれてて、それを、DAOやADO、Microsft Queryやピボットなどが流用している・・・という感じに見えます。 例えば、Microsft Query の画面でも、なにかイレギュラーなことがあると、よく列名が「F14」「F15」・・・みたいな感じに勝手に書き換わってる・・・、ということがあります。(同じ列名がダブった時とかだったかな?忘れました。チェックするのが面倒いかったです。すみません。) そういうところからみると、今回のサンプルファイルも、行番号1に列名が入力されているわけではないので、Excelが勝手に「あれぇ~??、これシステムテーブルのくせに列名が無いなあ。そんじゃー、こっちで勝手に「F1」「F2」「F3」「F4」・・・って付けとくね!」という感じにつけてくれているのだと思います。 あ・・・、でも、そういう意味からすると、もしかしたら、1シートに複数のクロス集計表があって、それをシステムテーブルとしてDAOやADOで読みに行きたいときは、「シートの行番号1のセルたちのところは、横一行・全部、あえて空白にしておいたほうがいい」のかもしれないですね。 いずれにしても、「F1」「F2」「F3」「F4」・・・とか「0」「1」「2」「3」・・・みたいな形で列が指定・操作できるので便利でありがたいことです。
なお、ある一つのセルを列と行のクロスでピンポイントに読みにいきたい場合は、DAOやADOの場合はちょっと面倒くさいです。 参考図:以下、本文と起点のセルや求めたいセルのアドレスが違いますが、ご参考にしてください。 DAOやADOの場合は、「列」×「行」という指定だけですぐに読みに行けるわけではなくて、いったん、目的の行に移動してから列を指定してクロスしたセルの値を読み込みます。 これは1シート上に複数の表がある場合も同じです。 例えば、「B1」のセルが起点のセルで、すなわち、B列が「F1」になっていた状況を考えてみます。 まず、行番号「1」のすべての横方向のセル達は、全部列名としてとらえられています。 なので、この状況のときにもし「C10」のセルの値を読みに行きたいという場合は、まず「10マイナス2」で、実データとしての「8行分」を移動します。 このとき、なぜ「10マイナス1」ではなくて「10マイナス2」になるのかということが疑問になると思います。 そのことについて(下手くそですみませんが)ご説明しますと、まず、DAOやADOでは、(Accessではなくて)Excelの場合、最初に位置している行の場所はシートとしての行番号「2」の行であり、そしてそこに既に「今居る」ということになっています。(今居る行のことを「カレント行」と呼びます。) DAOやADOは、「その認識が前提」「きまり・掟」となっている機能なのです。 だから、そこから1行分移動すればB3の行・・・、2行分移動すればB4の行・・・、3行分移動すればB5の行・・・という風になっていきます。 つまり、「行数としてはシートの行番号マイナス1」なんだけれども、目的のセルに移動するための「移動する行の数」としては「行番号マイナス2」ということになってしまい、意味が異なるため、話としてはちょっとややこしくなっています。 ただまあ、そう深く考えずに、 その後、「C列」を読みたいわけなので、「起点のB列=F1=列番号0」ということからすると、1列右になるわけですから、「C列=F2=列番号1」となります。 というけで、「B列が起点の場合」に「C10」のセルをピンポイントで読みに行きたい場合は、まず、「8行分」を移動して、そののち、「RS.Fields("F2")」あるいは「RS.Fields(1)」を読みに行けばいいということになります。 ※「With」でまとめてある場合は、「RS」は省略できます。 実際に書くプログラムとしては次のようになります。 RS.Move (8) ’8回(8行分)下に下がって、シートとしての行番号10の行へ移動。 「Do Until RS.EOF ~ Loop」の行を全部消すかコメントアウトして、この2行に書き換えます。 なお、クロスで値を求めたいときは、あらかじめ『シート内の複数の表をすべて含んで考えた通しの行番号(連番)』をふっておけば、SQLでも求められるかもしれません。(エラーでできない可能性もありますが・・・) ちなみにですが、AccessにおけるDAO・ADOでは、Excelのような「列番号(A、B、C、・・・)や行番号(1、2、3、・・・)」という概念が無いのでどちらの方法もよく使います。 また、逆に、Excelでも複雑な条件でクロスの値を見たい場合は、SQLで求めたほうが便利になるシーンも、もしかしたらあるかもしれません。 『Excel2000にて表と表を紐付けするときに、VLOOKUP関数以外に、「DAO」というミドルウェアを使って、紐付いた値を、1つのセルに表示する方法』 DAOやADOのほうが便利なケースのときだけ、それらを使って、他の閉じたファイルの値の取得をしてみてください。 「ExecuteExcel4Macro」を使うどんなケースがあるかしらん? 例えば、読み込みたいセルが数百個という「表」のような場合や、単一セルをバラバラに100個読み込みたい、というようなケースなら、DAOやADOのほうが便利な気がしますね。 逆に、「単一セルを4、5個(=数個だけ)、読み込めればいい」、みたいな場合はDAOやADOじゃなくて「ExecuteExcel4Macro」のほうがいいかもですね。 また、誰かがすでに開いているExcelファイルを、さらに読みに行く、なんてことが「DAOやADOではできない、ということなら、その場合も「ExecuteExcel4Macro」を使ったほうがいいですよね。 一応同じプログラムコードにて、Win2000+Excel2000でもクロス集計表をシステムテーブルとして読み込むことができました。 でも、F1の列(番号0の列)が、どうやら「起点のセル」が関係なくて、A列=F1=0番、という感じになって動いてしまいました。 この動きは、「xls拡張子だから」ではないようです。 なぜこうなるのかはわかりませんし、僕のPCだけかもしれません。 2010では、xlsmを読み込んでも、xlsを読み込んでも、起点セルから読み込まれていて、起点セルの列の左側の空白列は全部無視されている感じです・・・ 仮想マシン2000の場合はxlsmファイルは読めませんが、xlsを読み行くと、この項のテストのような動きになってしまいました(あくまで僕のPCは、ですが・・・) いずれにしても、「バージョンごと・OSごと・環境ごとに 動きが違う」かもしれないので、事前に、異なる動きにならないかを確かめておいたほうがよさそうです。 ※こちらもまだUNCパスでのテスト=ネットワーク越しのファイルのクロス集計表を読みに行くテストはできていません。すみません。
ただ、プログラムコードをDAOではなく、ADOに書き換えて読みに行ったら大丈夫でした。 たた、ケースによっては、DAOのほうが最初のアクセスだけは速いような気がしました。 ★ 「外部テーブルのフォーマットが正しくありません」エラーが出たりした場合の対処 まず、ここで書いていることは32ビット版のExcelについての話です。(バージョンは2010) また、読み込みたい先のファイルが、今の自パソコン内にあっても、ファイルサーバにあっても、どちらの場合もです。(「ファイルサーバにある」ということは、「¥¥サーバ名¥共有フォルダ名」、といったUNCパスを使う場合のことを指します。DAOでは、xls拡張子だけになってしまい、xlsm拡張子はダメですが、UNCパスのファイルも読みに行けます。) DAOやADOで「閉じたExcelファイル」の中身を読みに行くと、「外部テーブルのフォーマットが正しくありません」というエラーに出くわすことがあります。 これは特に、「DAOにて」、xlsm拡張子のファイルを読み行くときに多いみたいです。 僕の環境では、読み込み先のファイルがどこにあろうが、ローカルだろうがサーバ上だろうが、その拡張子がxlsxやxlsmだと、DAOで読みに行くと必ずこのエラーになりました。 「SrcXLFName = "d:\tes1.xls" 」の内容を、今開いている自ファイルのフルパスに書き換えて、自ファイルを読みにきたときだけはもちろん読めるのですが・・・。 自ファイルじゃなくて、別ファイルで・かつ・閉じているものを読みに行くと、xlsxやxlsmの拡張子だと必ずこのエラーになりました。 そんなとき、このエラーを出させない方法は以下の通りです。 (01)読みに行くファイルをxls拡張子に作り替える 基本的にプログラムコードは(読みに行くファイルの名前(拡張子部分のみ)をxlsmからxlsに変える以外は、他は一切変える必要はありません。エラーは出なくなります。 あと、後述(03)のADOで速度が出ないとき、もし、この方法でもよければ、この方法でやります。 (02)読みに行くファイルを開いておく ただまあ、それだと「Excel.Application」で処理するのと変わらない感じになる場合もあると思いますので、sの場合は、「Excel.Application」を使ってもよいと思います。 なお、「中身を読みに行きたいファイルはどうしても閉じておかないとまずい」ということなら、(01)か(03)のやり方になるのではないかと思います。(他の良い方法があればそちらで。) (03)DAOをやめてADOでやる 詳しくは別の記事を書きますね。 ※書きました! 『ADO:Excel2010で、開かれていない閉じたままのブック・Excel(xls)データをできるだけ速く読み込む方法ーその2(ADOにて)』 ※その他参考記事 |