LoginSignup
2
1

More than 1 year has passed since last update.

Access VBA HTMLへのExport及びImportを考慮した場合の問題点

Last updated at Posted at 2023-01-29

文字どおりのおまえが言うな

公式の全体解説
Access でのデータのインポート、リンク、およびエクスポートの概要

Access の最も便利な機能の 1 つは、多数の他のプログラムからのデータと接続する機能です。 実際には、Access との間でデータを移動することができるすべての方法を単一の記事にまとめることは困難です。

前提は日本語環境

ほかはちょっとわからない。
また、今後改善するのかもしれないが、現在のAccessのバージョンにSQL ServerのようなUTF-8の並び順はない。
ここから述べる現象の根本的な原因は並び順だと考えられる。おそらく、これができればAccessでもエクスポートとインポートの問題も解決すると思われる。

今回はAccessのテーブル、クエリをHTML形式でExportする

今回の記事の教育的効果

:blue_book: 基本的に選択クエリで作ったものもエクスポートできる。なので以下テーブルと書いてあるのは選択クエリの結果も含む。
:blue_book: Exportするとテーブルをブラウザで開けるようになる(あたりまえ)
:blue_book: 印刷にむいた出力ではないが、画面で表示するという点では拡大縮小が効きスムーズにスクロールするので閲覧には向いている。Accessにはそんな機能はないからだ。
:blue_book: フィルタは効かないが、ちょっとした検索はできる。
:blue_book: 参照テーブルとしてリンクテーブルとして使える可能性もある。
:blue_book: 65000を超えてもエラーにはならない。
:blue_book: 欠点としてはアクションクエリでExportした場合、異体字セレクタ、サロゲートペアは文字化けしているが、Importを考慮した場合、文字化けは修正しない方が良いという常識とかけ離れた点がある。
:red_circle: 実はHTMLにExportするクエリが存在するQiita Exclucive :exclamation:
:red_circle: サロゲートペアの文字化けは異体字の数値参照文字のように記述しているのが原因である。と言うか異体字の異体字セレクタもサロゲートペアとして記述され、この部分が文字化けする。この記事も世界中探してここしか書いてない。Qiita Exclucive :exclamation:(だって誰もやらないし)
:sob: あと、この変な点の検証に時間を取られたので、DoCmdの場合の検証はできなかった。
:sob: 数値文字参照も最後にわかったのでImport Exportは未検証
:sob: 基底文字と結合文字については書いたあとわかったので未検証

実際に使うとき

  1. やりたい方法で出力されたhtmlのコードを一度確認する。
  2. あえて異体字やサロゲートペアを入れて結果を確認する。
  3. Titleやファイル名を変えて、インポートしてみる。この結果次第で、現在のルールに変える必要性があるか、あれば変更してサイドインポートした結果がうまくいくか確認する。
  4. インポートしない場合は、現在のユニコード2.0の表記に書き換えてよい。Importするときはやめた方がよい。

用途

例えばコード表のようなテーブルはよくある。

IDNum oItem
01 Pencil
02 Eraser

品名のコードのテーブルなど、仕事でデータベースを作るときには教科書に出ててくる。
このテーブルの確認のために、毎回Accessを起動するのは面倒。
とくにデータが大きくなるとストレス。
また、エクスポートしてエクセルも面倒。
Excelの場合、TranferSpreadsheetは書式ありだと約65,000が限界。
Access2013 65000件以上のエクスポートは書式設定なしで出力 hamachan
テキストファイルは、レイアウトというものはなく、カオスな表示になることはよくある。
そこで、セカンドベストとして、HTMLで出力することを考える。
これだとブラウザでチェックができることや、多少装飾して見やすくすることができるという利点がある。
出力されたHTMLのコードを書き換えることで、さらにレイアウトを変更することもできる。
また、ブラウザのタブで複数のファイルを横に開けるため、複数のテーブルをまとめて開き、視覚的な比較することも容易である。
検索はできるが、フィルタは効かない。
印刷には向いていない。列のタイトルをページごとに印刷することはできない。しかし、紙に収まらないような縦に長い場合にはこの機能を活用できる。
また、TrasferSpreadSheetは書式ありの場合65,000でエラーになる場合がある(xlsxを選んでいても)。HTML出力はこのような制約がない。(遅いけど)

HTMLの出力の差

書式の美しさで比較すると

  1. `ADODB.Stream`で出力し、ゴリゴリとタグを書き込んだHTMLファイル(力技)
  2. 書式を保持する`Domcd.OutputTO`。ただし遅い。
  3. 書式がシンプルな`TranferText` :arrow_backward: 現在の主力
  4. TranferTextと同格だが文字次第で問題があるアクションクエリ

https://tsware.jp/study/vol4/docmd_1.htm
DoCmd.TransferText acExportHTML, "", "Tablename", "C:\hoge\Filename.htm", True
もちろんHTMLのタグを記述していく方法ならもっといろいろなことができる。

アクションクエリ(SQL) Qiita Exclusive:exclamation:

クエリはHTML形式のExportは資料がない。いろいろ突き合わせてみてようやく動いた。
Importの反対にするという方法でようやくたどり着いた。
多分世界で唯一このQiitaの記事だけに記述されているクエリ。

:red_circle:前提

  • 出力するテーブル名 T_Name
  • 出力するフォルダ C:\hoge
  • 出力するファイル名:hoge.htm :arrow_backward: htmlでも可能
  • 1行目はフィールド名
SELECT * INTO [hoge.htm] IN 'C:\hoge\' 'HTML Export;HDR=YES;IMEX=0'
FROM (SELECT * FROM T_Name);

そして、以下に述べる事実から、Accessは、マクロアクションDoCmd.OutputToが生まれ(x-jis出力)、アクションクエリ(Shift_jis)が生まれ、VBAに吸収されDocmd.TranferTextが生まれ、VBAにDoCmdオブジェクトとして取り込まれていったと思われる。
SQL(アクションクエリ)でExportする方法は現在のところ、文字コードを指定する方法が見つかっていない。Shift_Jisにより出力され、サロゲートペアは数値参照文字形式で出力される。しかし、この記述は現在のブラウザでは文字化けする。
ただ、SQL(アクションクエリ)でExportする方法は出力する部分(SELECT * FROM T_Name)のとおり、ここでテーブルをクエリで絞り込むことができる。ほかは一度クエリを作らなければならない。

VBA

ポイント

  1. Schema.iniはいらない。
  2. 文字コードは番号で指定する、UNICODEとかUTF-8といった文字列では指定できない。
  3. OutputToはサイズが大きくなると遅くなる

DoCmd.OutputToを使った例

Sub exportHTML()
' https://ray88.hatenablog.com/entry/2020/11/23/100840
' 書式がある状態で出力
' フォントサイズは既定のフォントから決まっているらしい
' 文字コードは番号指定 "Unicode" "UTF-8"はエラー
Dim sPath As String: sPath = CurrentProject.Path & "\"
Dim sacObjectName As String ' テーブル、クエリー、レポート名 なるべく空白は避ける、機種依存文字は避ける、予約語は避ける
sacObjectName = "" ' 出力するテーブル名を書くこのサンプルではそのままファイル名となる
' 既存のファイルを削除
With CreateObject("Scripting.filesystemObject")
If .FileExists(sPath & sacObjectName & ".html") Then .DeleteFile sPath & sacObjectName & ".html"
End With
DoCmd.OutputTo acOutputQuery, sacObjectName, acFormatHTML, sPath & sacObjectName & ".html", False, , 932 '文字コードは932 65001
End Sub

後述するようにこの場合でもサローゲートペア文字はサロゲートペアのように表記され、異体字の異体字セレクタの部分がサロゲートペアで表記され、文字化けする。

DoCmd.TranferTextの例

Sub exportText2()
'https://ray88.hatenablog.com/entry/2020/11/23/100840
'書式がなし状態で出力
'フォントサイズは規定のフォントから決まっているらしい
'文字コードは番号指定 "Unicode" "UTF-8"等はエラー
'https://www.feedsoft.net/access/tips/tips113.html
Dim sPath As String: sPath = CurrentProject.Path & "\"
Dim sacObjectName As String ' テーブル、クエリー、レポート名 なるべく空白は避ける、機種依存文字は避ける、予約語は避ける
' 既存のファイルを削除
sacObjectName = "" ' 出力するテーブル名を書くこのサンプルではそのままファイル名となる
With CreateObject("Scripting.filesystemObject")
If .FileExists(sPath & sacObjectName & "1.htm") Then .DeleteFile sPath & sacObjectName & "1.htm"
End With
' Schema.iniは定めない
DoCmd.TransferText acExportHTML, , sacObjectName, sPath & sacObjectName & "1.htm", True, , 65001 '文字コードは932 65001
End Sub

力技

強引にHTML自体のコードを書いていく。
このときADODB.StreamのCharsetとContent-TypeのCharsetは一致させること。
ただしこの場合のUTF-8はBOMありなので、UTF-8N、いわゆるBOMなしにしたい場合は、
ADODB.Streamを利用してUTF-8(BOMなし)で書き出すのような操作が必要となる。x-sjisはshift-jisとする。また、Unicode(UTF-16)の場合は、FilesystemObjectのTextStreamを使っても良い

Sub VBAExportHTML()
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim sPath As String: sPath = CurrentProject.Path
Dim aRS As New ADODB.Recordset ' 要参照設定
Dim aCN As New ADODB.Connection: Set aCN = CurrentProject.AccessConnection
Dim CMD As New ADODB.Command
Dim sr As New ADODB.Stream
Dim i As Long
Dim sTitle As String
sTitle = "titleString" 'テーブル名かつHTMLのページタイトル
With sr
.Charset = "UTF-8"
.LineSeparator = adCRLF
.Type = adTypeText
.Mode = adModeReadWrite
.Open
End With

aRS.Open "Select * From [" & sTitle & "];", aCN, adOpenForwardOnly
Dim myHTM As String: myHTM = "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>" _
& vbCrLf _
& "<HTML DIR=LTR>" & vbCrLf & "<HEAD>" & vbCrLf & "<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=Utf_8'>" & vbCrLf & _
"<TITLE>" & sTitle & "</TITLE>" & vbCrLf & _
"</HEAD>" & vbCrLf & _
"<BODY>" & vbCrLf & "<TABLE DIR=LTR BORDER>" & vbCrLf & "<CAPTION>" & sTitle & "</CAPTION>"
sr.WriteText myHTM, adWriteLine
sr.WriteText "<TR>", adWriteLine
For i = 0 To aRS.Fields.Count - 1
sr.WriteText "<TH>" & aRS.Fields(i).Name & "</TH>", adWriteLine
Next
sr.WriteText "</TR>", adWriteLine
Do Until aRS.EOF
sr.WriteText "<tr>", adWriteChar
myHTM = ""
For i = 0 To aRS.Fields.Count - 1
' データの方で右寄せ、左寄せを切り替える。
If IsDate(aRS.Fields(i).Value) Then
myHTM = myHTM & "<TD DIR=LTR ALIGN=RIGH>" & Nz(aRS.Fields(i).Value) & "</td>"
ElseIf IsNumeric(aRS.Fields(i).Value) Then
myHTM = myHTM & "<TD DIR=LTR ALIGN=RIGH>" & Nz(aRS.Fields(i).Value) & "</td>"
Else
myHTM = myHTM & "<TD DIR=LTR ALIGN=LEFT>" & Nz(aRS.Fields(i).Value) & "</td>"
End If
Next
myHTM = myHTM & "</tr>"
sr.WriteText myHTM, adWriteLine
aRS.MoveNext
Loop
sr.WriteText vbCrLf & "</table></body></html>"
With CreateObject("Scripting.Filesystemobject")
If .FileExists(sPath & "\myhtm.html") Then .Deletefile
End With
sr.SaveToFile sPath & "\myhtm.html", adSaveCreateNotExist
sr.Close
aCN.Close
End Sub

リンク

お約束

Access データベースで特殊文字を使用するとエラー メッセージが表示される
フィールド名に@.ピリオドを使わない。Name,Noなどを使わない。特にImport/Exportのときがエラーが発生する。
Access 2002 以降のバージョンの Access の予約語の一覧
予約語を使うと(例:ID)、Exportするクエリはエラーを起こすことが多い。
2 バイトアラビア数字が原因で Microsoft Access でクエリを実行すると、エラー メッセージが表示される
半角数字からフィールド名をはじめてはいけない
テーブルやクエリなどのオブジェクトをインポート(外部データの取り込み)hamachan 2023/1/09
さらに通常はHTMLの入出力なんて公式すら書いていないので記載がない。

Wizard

HTMLにエクスポートさせる方法はVBAでない方法も当然ある。と言うか通常はまずWizardを使用するだろう。
https://www.dekiru.net/article/15671/
書式を保持してエクスポートをチェックすると文字コードが選択できる。
標準、Unicode、UTF-8Nの3種類。
この場合の標準はShift_Jisになる。出力されるテキストファイルの文字コードとContent-TypeのCharsetは一致しているようだ。
このWizardはマクロアクションと似ているが文字コードが微妙に違う。
別な表現をするとAccessはDocmdとWizardをつかいわけることで、UTF-8N(BOMなし)の2つを使い分けて出力することができる。
そして、出力する文字コードに関わらず、サロゲートペア文字、異体字セレクタ等は数値文字参照として出力され、UTF-16のように記述される。この結果文字化けする。

方法 文字コード
DoCmd UTF-8
Wizard UTF-8N
マクロアクション UTF-8

英語だと動画がある。

Docmd.OutPutTo

DoCmd.OutputTo メソッド (Access)
AcOutputObjectType 列挙 (Access)
AcExportQuality 列挙 (Access)

Docmd.TranspherText

DoCmd.TransferText メソッド (Access)
AcTextTransferType 列挙 (Access)

Docmd.RunSQL

DoCmd.RunSQL メソッド (Access)
SQLStatement 引数の最大長は 32,768 文字です (マクロ ウィンドウの SQLStatement アクション引数とは異なり、最大長は 256 文字です)。
上記のアクションクエリが可能なことから、当然これも考えられる。テーブルの絞り込みで字数を使ってもVBAなら可能だ。

DoCmd.RunSQL "SELECT * INTO [hoge.htm] IN 'C:\hoge\' 'HTML Export;HDR=YES;IMEX=0' FROM (SELECT * FROM T_Name);"

マクロ アクション

DoCmd オブジェクトのマクロ操作とメソッド

Access マクロ アクション (Access 開発者用リファレンス)
マクロアクションの公式の解説は、VBAのなかで解説されているページ(learnがつく)、単独のページ(Supportがつく)が存在している。
マクロアクションは名前がかぶりすぎで大混乱するので名前を変えたようだが、Supportがつくほうのページが本家である。
そして、VBAと機能は似ているが、最大の違いは文字コードを 名前(文字列) で指定する点。指定可能なのは指定しない[MS-DOS][Unicode]、または [Unicode (UTF-8)] 指定しないとシステムの設定を使用する、拡張子はhtm,Htmlのどちらでも良い。テキストファイルの形式は指定した文字コードと同じになる。

“ExportWithFormatting/書式設定を保持したままエクスポート“ マクロ アクション

VBAではOutputTo

注: Access 2010 より、“OutputTo/出力“ マクロ アクションは、“ExportWithFormatting/書式設定を保持したままエクスポート“ に名前が変更されました。 マクロ アクションの引数には、変更はありません。

“ExportWithFormatting/書式設定を保持したままエクスポート“ マクロ アクション

Access:テーブルをHTML形式で出力(エクスポート)するマクロを作成する手順(feedsoft)
この方法の場合は文字コードが指定できる。
また、この方法だとCharsetはShift_Jisではなくx-sjisとなる。

X-JIS

逆引きHTMLリファレンス0-13. 「Shift_JIS」or「x-sjis」

HTML文書に文字コードを指定する方法は、META要素を用います。 下記に例題を示します。
<META Http-equiv="Content-Type" Content="text/html;charset=Shift_JIS">

「文書タイプはtext/html形式でShift_JISコードである」というメタ情報をサーバーがブラウザに送るもので、ブラウザはこれを基にその形式、コードで表示しようとします。(といっても完全ではないが)
さて本題ですが、Content="text/html;charset=x-sjis"というのをよく見かけます。 この「x-sjis」というのは「Shift_JIS」と同義語です。 では、どちらが正解なのでしょうか?
答えからいくと両方正解です。(厳密には「Shift_JIS」だが) 規格が2つあるのはおかしいとお考えのあなたは更に正解です。 ではどういうことなのでしょう?
インターネットが始まった頃、まだそのころはアメリカだけのものでした。 この時MozaicMozillaという今のNNの前身のブラウザの出現と共に大きく飛躍しました。 このNetscpeMozilla2.0の時点で日本語のコードも対応されたわけですが、この時点でシフトJISコードを「x-sjis」という風に定義づけてしまいました。
日本でもMozaicMozillaと共にインターネット全盛を迎えていくことになります。 悪いことに「Shift_JIS」には未対応で「x-sjis」のみ連れて・・・
その後、IE3、NN3にバージョンアップし、漸くこの時「Shift_JIS」が使えるようになったのです。
しかし残念なことに一度普及してしまったMozilla2.0が存在する限り、「Shift_JIS」では未対応ブラウザがあるため、世の中では更に「x-sjis」が使われました。 こうやってデファクトスタンダードとなっていき、これで「x-sjis」が規格と勘違いするもの、NetscpeMozilla2.0がまだ存在するからと理由づけるもの、と未だに「x-sjis」が使われ続けています。

タイトルの「Shift_JIS」or「x-sjis」を考えると、どちらが本来の正解かわかってきたかと思います。 私の場合もWebデビュー間もない頃は適当に使っていた文字コードが未だにサイトのどこかに眠っているはずです。 今現在着実に「Shift_JIS」化を進めています。

これはMicrosoft Accessのほうがブラウザより先に存在している事によるだろう。x-sjisで出力するマクロアクションは古いAccessを残しているということになる。

ImportExportText マクロ アクション

注: Access 2010 から、"TransferText/テキスト変換" マクロ アクションは "ImportExportText/テキストのインポート/エクスポート" という名前に変更されました。

注: テキスト ファイルまたは HTML ファイルのデータにリンクする場合、データは Access では読み取り専用になります。

このExportはUTF-8 Unicode 空白が選択できる。選択式なので、これ以外のコードは選択できない。 空白の場合はx-jisになる。

RunSQL マクロ アクション

こちらはVBA版ではない方。255文字までという制限あり。

https://makoto-watanabe.main.jp/access/accessVBA.htm
基礎から全部1ページになっている。TransferTextの解説あり

DoCmd.TransferSpreadsheet

Excelはこれを使用する。
HTMLには使わないが、混乱を避けるためあわせて掲載する。
また、このTranpferSpreadSheetはマクロアクションの場合65,000書式あり限界が発動する
DoCmd.TransferSpreadsheet メソッド (Access)
AcSpreadSheetType 列挙型 (Access)
AcDataTransferType 列挙 (Access)
下記の65,000限界はマクロアクション時に発生する可能性があるが、VBAは不明。

LearnではじまるVBAの中の公式のマクロ アクションの解説

ImportExportSpreadsheet マクロ アクション

Supportではじまる公式のマクロ アクションの解説

ImportExportSpreadsheet マクロ アクション

検索すると2種類存在する。目次があるLearnの方が関連情報が見つけやすいが、Supportの方が機械翻訳がおかしくない。

65,000 を超える行が含まれる Access 2007 のテーブルを Excel ブックにエクスポートしようとすると、エラー メッセージ "選択しているレコードの数が多すぎるため、一度にクリップボードにコピーできません" が表示される

現象

次のような状況を想定します。65,000 を超える行が含まれる Microsoft Office Access 2007 のデータベース テーブルを Microsoft Office Excel 2007 ブック (.xlsx) または Excel 2007 バイナリ ブック (.xlsb) にエクスポートするときに、[書式設定とレイアウトを保持したままデータをエクスポートする] をクリックします。

エクスポートを開始すると、次のエラー メッセージが表示されます。

選択しているレコードの数が多すぎるため、一度にクリップボードにコピーできません。

コピーおよび貼り付けの操作を、いくつかのレコードごとに分けて行ってください。 一度に貼り付けることができるレコードの最大数は、約 65,000 です。

原因

この問題は、[書式設定とレイアウトを保持したままデータをエクスポートする] オプションを使用して、65,000 を超える行が含まれるテーブルをエクスポートできないことが原因で発生します。

回避策

この問題を回避するには、65,000 を超える行が含まれるテーブルをエクスポートするときに、[書式設定とレイアウトを保持したままデータをエクスポートする] をクリックしないようにします。

状況

マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。

ファイルができるけど間違いなアクションクエリ(SQL)

SELECT * INTO [Text;Database=C:\hoge].[hoge.html] From ( Select * From hoge Where ID=42);

要Schema.ini
拡張子がHTMLというだけでただのテキストファイル。
表形式にならない。
なお、

SELECT * INTO [HTML;Database=C:\hoge].[hoge.html] From ( Select * From hoge Where ID=42);

TextをHtmlに変えるとエラーになる。

SELECT * INTO [sage#html] FROM (Select * From [T_Name])  In 'C:\hoge\' '[HTML Export;HDR=Yes;IMEX=0]';

SELECT * INTO [sage#html] FROM (Select * From [T_Name] Where [ID]=42 )
In 'C\:hoge\' '[HTML Export;HDR=Yes;IMEX=0]';

これらも間違い

その他

特定文字を含む Access データをテキストにエクスポートした際に位置がずれる場合の対処方法

特定文字を含む Access データをテキストにエクスポートした際に位置がずれる場合の対処方法
2013以降も発生

Access でメモリ不足エラーが発生する現象の対処策について
SELECT INTO ステートメントでは複数値を持つフィールドは使用できません

Importを少し

英語だとYoutubeの解説動画がある。

基礎から始めるAccessVBA講座http://www.geocities.jp/cbc_vbnet/(WebArchive)
ここにImportのサンプルがあるが、当然HTMLは対象外である。
基礎から始めるAccessVBA講座http://www.geocities.jp/cbc_vbnet/(WebArchive)
もちろんエクスポートも対象外である。
基礎から始めるAccessVBA講座http://www.geocities.jp/cbc_vbnet/(WebArchive)テキストファイルをVBAでインポートする方法
ちなみに2000年代前半のサンプルはインポートエラーがあった場合、エラーのテーブルを削除していた。

インポート エラーが出た場合「GIGYOSHO_インポート エラー」というテーブルが自動的に作成されます。ここでは自動的にこのテーブルを削除しています。

UTF-8のテーブル(MySQL5.6)に竈門禰󠄀豆子が格納できない問題を調べてみた
これから書く異体字セレクタはMySQLでは欠落していた(MySQL 8からはutf8bm4で解消)がAccssは文字化けするものの、Import/Exportには問題が生じない。

Wizardを使う場合、日本語を指定しないと文字化けする場合がある

インポートしても文字化けしてしまう
ただ、これは現在では起きないかもしれないが多言語環境ならあるかもしれない。

Access でファイルのインポートまたはエクスポートを実行すると、読み取り専用のエラーが発生する場合がある

Access でファイルのインポートまたはエクスポートを実行すると、読み取り専用のエラーが発生する場合がある
Access 97 - Access 2010

現象

Microsoft Access 2010、Microsoft Access 2000 または Microsoft Access 97 でファイルのインポート、またはファイルのエクスポートを実行した際に、以下のエラー メッセージが表示され、ファイルのインポート、またはエクスポートに失敗する場合があります。

データベースまたはオブジェクトは読み取り専用であるため、更新できません。

原因

Jet データベースエンジンは Text IISAM を使用することでテキスト ファイルを編集することが可能なため、システム テキストファイルの誤った編集によるセキュリティ上のリスクが発生する可能性がありました。この問題に対応するため、Microsoft ACE データベース エンジン、Microsoft Jet データベース エンジン 4.0 および Microsoft Jet データベースエンジン 3.5 では、Service Pack 3.0 以降、レジストリに指定された拡張子以外のファイルをインポート、またはエクスポートすることができなくなったためにこの現象が発生します。

回避策

拡張子無しのファイル、または、以下の拡張子以外のファイルを処理するには、レジストリキーの値に、処理したい拡張子を追加してください。
txt
csv
tab
asc
htm
html

こんな訳わからないルールを課しているとは。。。どおりでこの方法が廃れているはずだ。。。

接続文字列

Websiteの場合

Connectionstringの記述を現在に書き換える。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=http://www.websitewithhtmltable.com/tablepage.html;Extended Properties="HTML Import;HDR=YES;IMEX=1";

Pageのタイトルがそのままテーブル名になる。
どうでもいいが、そんな都合がいいページがインターネットにあるのだろうか。
イントラネットなどかもしれないが、それでもなかなか見当たらないのでは?

ファイルの場合

ファイルの場合、<file:///>のような表記にしなくていよい。

aCN.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\hoge\hoge.html;Extended Properties='HTML IMport;HDR=YES;IMEX=1';"

Sub ImportHTML()
' ADOX 等参照設定
' https://www.connectionstrings.com/html-table/
' これを書き直したもの
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim aRS As New ADODB.Recordset
Dim sr As New ADODB.Stream
Dim aCMD As ADODB.Command
Dim Cat As New ADOX.Catalog
Dim cTBL As ADOX.Table
Dim aCN As New ADODB.Connection
Dim sPath As String: sPath = CurrentProject.Path & "\"
Dim sacObjectName As String ' テーブル、クエリー、レポート名 なるべく空白は避ける、機種依存文字は避ける、予約語は避ける
' 既存のファイルを削除
sacObjectName = "hoge"
With CreateObject("Scripting.filesystemObject")
If .FileExists(sPath & sacObjectName & "1.htm") Then .DeleteFile sPath & sacObjectName & "1.htm"
End With
aCN.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\hoge\hoge.html;Extended Properties='HTML IMport;HDR=YES;IMEX=1';" 'ここはファイル名まで。File:///のような形式にしなくてよい。
aCN.Open
aRS.Open "Select * From [PageTitle];", aCN, adOpenDynamic 'タイトル。テキストファイルのように[Table#html]などとしなくてよい。これはHTMLファイルを開くと<TITLE></ TITLE >のタグを見ている
aRS.Close
aCN.Close
End Sub
Sub ImportHTML2()
' 参照設定 Micsoroft ActiveX Data Object Library 6.0
  Dim aRS As New ADODB.Recordset
  Dim aCN As New ADODB.Connection
  Dim aCMD As New ADODB.Command
'  Dim FSO As New Scripting.FileSystemObject ' 参照設定 Microsoft Scripting Runtime
  Dim sBuf As String
' https://www.connectionstrings.com/html-table/
  sBuf = CurrentProject.Path
  ' ファイル名は空白を想定し、シングルクォーテーションで囲む
  ' accdbが移動することを想定しCurrentProject.Pathで親フォルダを取得し、合成する
  ' ファイルがあるかないかわからない場合は、FSO.FileExistsを加える。
  ' HTML Importのように空白が入る
  ' サンプルはとりあえず1列目を表示(Accessのテーブルは0から始まるので、実際は2列目)
  aCN.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & sBuf & "\T_Master.html';Extended Properties=""HTML Import;HDR=YES;IMEX=1"";"
  aCN.Open
  aRS.Open "T_Master;", aCN, adOpenDynamic ' HTMLのテーブル名
  Do Until aRS.EOF = True
    Debug.Print aRS.Fields(1).Value
    aRS.MoveNext
    Loop
  aRS.Close
  aCN.Close
End Sub

SQLでOutputした場合のインポート

異体字とサロゲートペア、絵文字がうまくいかない。
現在のところ、これらの文字はエクスポートした文字化け表示の状態でなければインポートができない。
結論から言うとUTF-16LEかつ10進数で記述されていなければインポートができない。
ただし辻󠄀のような異体字をAccessは本字に続いて異体字セレクタ(ただしサロゲートペア)が続くが、この本字を十進コードに変えてもよい。
またフォントは自由で絵文字を使った場合、Segoe UI emojiに変えてもインポートができる。
エクスポートは出力のHTMLではMS P ゴシックとなっている。これを変更する方法は今のところ不明。

前提知識

サロゲートペア入門 Codezine 2007/08/28 14:00
JIS X 0213:2004 対応と新日本語フォント「メイリオ」について(Wayback)
http://www.microsoft.com/japan/windows/products/windowsvista/jp_font/default.mspxは元は、Microsoft『Windows Vista における JIS2004 対応に関する詳細資料』というタイトルだったようだが、書き換わっているらしい。
Microsoft『JIS X 0213:2004 / Unicode 実装ガイド』(PDF)(Wayback)
Unicode 東アジア 図書館員のコンピュータ基礎講座
html 数値参照文字 で検索すると該当記事にあたることが多い。
反対語は「文字実体参照」で、HTMLエンティティともいわれる。
英語は numeric character reference
HTMLの特殊文字(文字実体参照/数値文字参照) - ITSakura
Unicode→Shift_JIS変換時に、Shift_JISに存在しない文字を数値参照文字にする方法
文字参照 TAG index
文字参照 W3G
使いたいときの HTML特殊文字 & 機種依存文字 漢字(360文字)

異体字

Variant selectors
字形選択補助子
Variant Selectors Supplement
数値文字参照 (numeric character reference)

異体字などの字形の違いを表現するために用いる文字で、字形選択子とも呼ばれます。
数学記号、絵文字の異体字には、異体字セレクタ(FE00~FE0F)を使用します。
漢字の異体字には、異体字セレクタ補助(E0100~E01EF)を使用します。

葛&#56128;&#56576;

異体字セレクタはE0100になるはずだが、HTMLではサロゲートペアになる。

奇怪なコード

SQLで出力した場合文字コードはShift_jisになっている。
そしてサロゲートペア、例えば𠮷野家の𠮷は
2023年現在のHTMLでは&#x20bb7;のように記述する。
しかし、AccessからExportされたHTMLでは

&#55362;&#57271;

のように記述されている。
一応Shift_Jisでも現在は&#x20BB7が主力。
Windowsのメモ帳で、文字コードをANSIで保存してみよう。

常識的なHTMLコード

2023年現在はこんな感じだろう。

<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<body>
&#x20bb7;
</body>
</html>

これは正常に表示される。

Accessのアクションクエリで出力した書き方

<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<body>
&#55362;&#57271;
</body>
</html>

image.png
このようになる。
ちなみにEdge Firefox Chrome Internet Explorerすべて同じ表示結果となった。
これは最新のブラウザではShift_JisでもUTF-8と同様に解釈される機能があると思われる。
最も現在は、UTF-16は禁止されているため、サロゲートペア表記自体が文字化けしてしまうようになっているらしい。
 更にいうと、サロゲートペアはVBAでは、&hD842&hDFB7ののような表記で取り扱っており、HEXでセミコロンがない。HTMLの中だから&#とセミコロンがつくといえばそれまでだが、さらにわざわざ10進表記で文字化けしてしまう。これについての説明も見当たらない。誰もわからなくてHTML出力を避けるのは当然だといえよう。

ImportのときはCharsetや書き換えはだめ

一般的な教科書に従えばUTF-8はサロゲートペアが禁止されていることから、

  1. CharsetをUTF-8に変える。
  2. 代用対の書き方を変える。

ということになるだろう。
しかしながら
「このように書き換えるとImportで読み込まれない」
という変な問題が生じる。
なぜかSQLでエクスポートした場合AccessでImportできるHTMLは

  • ANSI
  • Charset Shift_Jis
  • サロゲートペアは数字文字参照形式になっている
  • 現在のブラウザではサロゲートペアは??という文字化け表示される
  • ついでに異体字は本字に異体字セレクタが付く

という方が良いことになる。(WizardでUTF-8などで方法で出力した場合も同じだった。)
通常の正常化する方法が間違った方法になる。
強いて言えば、データにサロゲートペアが含まれる場合、一度UTF-8に書き換え、Importし直すときは数字参照文字形式でサロゲートペアに書き換えてshift-jisに戻す。
という方法になる。
またはDoCmdを使うかだろう。

Docmdを使ってみた

文字コードと実際の部分だけを取り出してみる。
この項目では異体字も入っている。HTMLの変化はどうなるのか。

Shift-Jis

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=shift_jis">
<TD DIR=LTR ALIGN=LEFT>&#55362;&#57271;&#56128;&#56576;</TD>

UTF-8N

<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=UTF-8">
<TD BORDERCOLOR=#d0d7e5 ><FONT style=FONT-SIZE:9pt FACE="MS Pゴシック" COLOR=#000000>&#55362;&#57271;&#56128;&#56576;</FONT></TD>

unicode

<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=unicode">
<TD BORDERCOLOR=#d0d7e5 ><FONT style=FONT-SIZE:9pt FACE="MS Pゴシック" COLOR=#000000>&#55362;&#57271;&#56128;&#56576;</FONT></TD>

全部同じじゃないですか!

COBOL2002 使用の手引 手引編

IVSの異体字セレクタはサロゲートペア文字で表すため,IVSも同様に注意が必要です。

少なくとも異体字セレクタの部分はCobol と同様サロゲートペアになっている

現在のHTMLの書き方と明らかに異なっている

★meta要素で適切な文字コードを指定する
[ASP.NET] Shift-JISのページにおけるJIS2004対応の注意点 2008 06 12

[TIPS]多漢字フォントの活用 2012 06 06

現在のUinocde 2.0 規格は21ビットに拡張されているため,最大6桁のコードポイント(U+0000〜U+10FFFF)で文字を表現することになります。

原因についての推理

日本語版の SQL Server の文字コードの基本

UTF8 の照合順序がついていない Japanese_xxx の照合順序を使用している場合、char/varchar は CP932 の文字コードで格納されるため、Shift_JIS 相当の文字コードが使用されます。

SQL Serverの簡易版であるAccessにはUTF-8の並び順というオプションはない。
したがって、Shift-Jisとなるらしい。

これらの文字については Shift-JIS (厳密には CP932) で登録ができないため、これらの文字の箇所については、「?」に変換されてデータが登録されます。

しかしこの記述は誤りだろう。厳密に言うと数字参照文字の表記方法でサロゲートペアとなっている、正規表現等で書き換えは可能だからだ。

答えは数値参照文字

しんにょうの点が1つの「辻󠄀」をウェブ上で出す方法2017年3月17日(金) 16時23分36秒 [Web関連]
別の方向から回答が見つかった

ウェブ上で、しんにょうの点が1つの「辻󠄀」を表示するには、数値文字参照の書き方を使って「 &#36795;&#xE0100; 」と記述します。
前半の「 辻 」が「辻」という漢字を表す数値文字参照で、それに続く「 &#xE0100; 」が異体字のバリエーションを指定しています。この2つを間隔なく詰めて「 &#36795;&#xE0100; 」と書くことで、点2つ「辻」の異体字である点1つ「辻󠄀」を表示できます。

つまり、アクセスは数値文字参照の形でサロゲートペアを出力していたのである。もちろん、この書き方では表示されない。サロゲートペアを数字文字参照で表記するという例はない。これはUnicode文字とJIS2004に対応したAccess2000-Access2007で取られた苦肉の策だろう。

emkの日記: HTML/XMLの文字参照にサロゲートペアは使えない日記 by emk 2009年12月12日 12時07分

このように、文字参照のD800..DFFFはU+FFFDに置き換えなければならないと明記されています。
これらの規定は、HTML/XMLにおいてUTF-16のサロゲートペアが使えないという意味ではないことに注意してください。文字参照はUTF-16ではないというだけです。符号位置(code position)/コードポイント(code point)と符号単位(code unit)を混同してはいけません。
Unicode→Shift_JIS変換時に、Shift_JISに存在しない文字を数値参照文字にする方法

例外

ところが例外がある。
サロゲートペアってなんでコワイの

なお、実際に取り扱うデータにおいてサロゲートペア云々の問題が発生するのは、実は文字符号化方式にUTF-16を採用している場合のみです。
……のみなのですが、あいにくとUTF-16を文字列の内部表現として使っている言語は少なくありません。結局は、割とどこでも起こりうるめんどくさい問題、と思っておいたほうがよいかもしれません。

つまり、AccessはUTF-16を文字列の内部表現としてHTMLコードを記述しているらしい。
おそらくUnicodeに対応したときにこうなったのだろう。

[Access2007]Microsoft Office 製品 の JIS2004 への対応状況および利用時の注意点について

http://www.microsoft.com/japan/office/2007/compatible/JIS2004/default.mspxのアーカイブから

Office 製品 Unicode - JIS 2004 対応 注意 : JIS2004 文字を表示させるには JIS2004 対応したフォントが必要です。2007/1/18 現在、マイクロソフトからは MS ゴシック version 5.0、MS 明朝 version 5.0、および メイリオフォントを JIS2004 対応として提供しています。
クライアント 対応状況 注意すべき事項
Access 2003、Access 2007 一部制限あり クエリとフィルタリング機能はサロゲートペア未対応です。またデータシートやフォームで Backspace キーでサロゲートペアを消す際に 2 回キーを押す必要があります。カーソル移動は 1 回で良いです。
Excel 2003、Excel 2007 一部制限あり
Backspace キーでサロゲートペアを消す際に 2 回キーを押す必要があります。カーソル移動は 1 回で良いです。
次の文字列操作関数は正しい結果が得られないことがあります : FIND(), FINDB(), LEFT(), LEFTB(), LEN(), LENB(), MID(), MIDB(), REPLACE(), REPLACEB(), RIGHT(), RIGHTB(), SEARCH(), SEARCHB().

CSV 形式出力ではシフト-JIS に存在していない文字をサポートしていません。回避策として Unicode テキスト (.txt) 形式で保存を行ってください。
このクエリが未対応というのがアクションクエリがまだなのではないか。というのも文字列操作関数がうまくいかないのは未だに存在するからである。 じゃあhtmlをなぜなくさないのかというとExcelに出力するときエラーが起きるからだと思われる。

アクセス: Excel xls へのインポート/エクスポート中のエラー

現象

セルが 8224 バイトを超えるデータを含む Excel *.xls ファイルを操作すると、Access でインポート/エクスポート エラーが発生します。

原因

Access 2010 Service Pack 1 以降でリリースされた変更により、セルの内容が 8224 バイトを超える場合、Access によって既存の Excel *.xls ファイルが開けなくなります。

解決方法

次のいずれかの方法を使用して、問題を回避できます。
  1. 代わりに *.xlsx 形式を使用する
  2. メモ/長いテキスト フィールドを 8224 バイト未満の長さに制限する
  3. エクスポートする場合は、同じファイル名を使用してエクスポートを実行する前に、既存の.xls ファイルを削除します
  4. Access からインポート/エクスポートを実行する前に、Excel で.xls ファイルを開く

JIS90への対応

MS ゴシック/明朝 5.0 で新たに表示できる文字、字形が変更された文字WebAchive 2007

Windows7/10対応:JIS90で入力する方法
Windows10はIMEの設定で可能。自治体によっては制限する場合もある。
2010年2月 4日 Windows 7 にしたら XP の頃と字の形が違う!(WebArchive)

Windows XPの時は、フォント環境として JIS90 が採用されていました。XP で「辻」の字の点が一つだったのは、 JIS90 だったからです。ところが、Windows Vista 以降からは、フォント環境として JIS2004 が採用されました。JIS2004 とは、従来の Windows に採用されていた JIS90 と比べて、辞書や戸籍資料で利用されている漢字に近い文字へ改良されており、これまで正確に表示できなかった市町村名や氏名をコンピュータ上で扱うことができるようにしたものです。
ということで、Windows 7 でも JIS2004 を使っているので「辻」の点は二つなのです。

2012年7月 9日 Windows 8 RP でシンニョウの点が1つの「辻」を表示する方法

フォントを「MS 明朝」から「メイリオ」に変更してみましたが、2種類の「辻」が表示されています。

2012年7月11日 Windows 8 RP でシンニョウの点が1つの「辻」を変換候補に表示する方法

変換」が開きます。「変換文字制限」で「IVS (Ideographic Variation Sequence) を含む文字を制限する」から「変換文字制限をしない」に変更します

これはWindows10のIMEも同様である。デザインは変わったが、下の黒で囲ったところにチェックを入れない(入れていれば外す)ことで変換候補として表示される。
image.png

[IMEパットの中で普通の文字が無くなった。 ]

IMEパットの中で普通の文字が無くなった。
IMEパットの中で『つじ』が『辻』しか出ない。普通の文字が無くなった。どうすれば元の文字が出るようになりますか?
マイクロソフトのサポートで聞いてみたところ、Microsoft IMEを使っていて、Google 日本語入力をインストールしたことが原因で、文字が出なくなったのでは?
と言われ、では試しにMicrosoft Office 2010をダウンロードしやってみたが変わらず・・・
普通のしんにょうの『つじ』の出し方、または復活させ方をどなたか教えてくださいませんか?

「辻」の字が、一点しんにょうではなく、2点しんにょうになっているということであれば、Vistaや7で採用されたJIS2004フォントの仕様なのでWindows 7をお使いであれば最初からそうなっていたと思います。
Vistaや7で一点しんにょうの「辻」を表示する必要があれば、JIS90互換フォントパッケージをインストールするしかないと思いますが、これはすべてのフォントに適用されるわけではありませんのでご注意ください。
もし以前は一点しんにょうだったのに、最近急に2点しんにょうになったのであれば、JIS90互換フォントパッケージをインストールしていたのを削除したものと思われますので、再度インストールしてみるといいかもしれません。

続々・Win8で味わう「IVS」(WebArchive)

ここで「JIS90字形」と呼んでいるのはあくまで「XPまでのMSフォントの形」の通称であり、当時のJIS例示字体そのものではないことをご承知おきください。

ただし、完全ではない。&#x7B75;&#x7B75;&#Xe0101;筵筵󠄁は異体字を並べても同じ 正の下の横棒が左側に抜けていない。
先ほどのサロゲートペアと異なり、こちらは表示される。

<!DOCTYPE html>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<body>
<br>むしろ</br>
<br>&#x7B75;</br>
<br>むしろ異体字</br>
<br>&#x7B75;&#Xe0101;</br>
<br>むしろ異体字10進</br>
<br>&#31605;&#917761;</br>
<br>よしHEXコードポイント</br>
<br>&#x20bb7;</br>
<br>つじ</br>
<br>&#x8FBB;</br>
<br>つじ異体字16進</br>
<br>&#x8FBB;&#xE0100;</br>
</body>
</html>

Windows10+IMEでは解決

一応記入はできる。しかし今回はHTML出力がメインで、時間の都合でIVSについてのAccessのフィルタやImport/Exportは未検証である。

Google IMEは不明

Google IMEは異体字セレクタがないようである。
https://qiita.com/toracatman/items/9f609a22b5ad43a4fc4a#google%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B
Googleはコードポイントのみらしい。JIS90の異体字を使うときはIMEを使う方がよい。

計算方法

&#x20BB7;をサロゲートに変換する

文字コードから0x10000を引いて1番左の桁を"2"から"1"にする。これをXとする。
Xを0x400で割ってその商を0xD800に足す。これを「上位サロゲート」とする。
Xを0x400で割ってその剰余を0xDC00に足す。これを「下位サロゲート」とする。
上位サロゲート、下位サロゲートの順番で記述

サロゲートから&#x20BB7;に変換する

上記を逆にすれば良さそうなものであるが、
上記リンク先によると

ちなみに、UTF-8に上記の方法で換算するときは、必ずUnicodeスカラ値から換算します。サロケートペアから換算してはいけません。

とあるので、既知の文字化け程度しか使えない。

上位サロゲートから0xD800を引く。
下位サロゲートから0xDC00を引く。剰余
つぎのような式となる
X=商×0x400+剰余
文字コード = 0x10000 + X
CALCをプログラマ電卓にして16進数に変換するとこの計算は可能である。
ただし、JIS90のIVS系の文字にはこのような変換はないようである。

文字列にUnicode固有文字が含まれるかのチェック方法
C#だが参考になるかも

UTF-8を使うようになりサロゲートは風と共に去りぬ

結局Unicode2.0とUTF-8、サロゲートペアの追放で、異体字の問題はうやむやになったようにみえる。世の中にはうやむやという解決方法もあるのである。

Access総合相談所 29 5ch

506名無しさん@そうだ選挙にいこう2020/08/25(火) 18:00:37.33 Access2019ってサロゲートペア対応してる?

507名無しさん@そうだ選挙にいこう2020/08/25(火) 19:06:14.87

サロゲートペア

何それ?かっこいい!!

結局のところ、こういう壁にぶち当たることはなくなってしまったのである。
なので、AccessのHTML出力が今後も改善することはないだろう。だれも出力しないし、代替方法があるためユーザーとしても問題があるから使わないという方向になるだろう。ふつうの人はExcelかcsvに出力する。英語圏内では問題にはならない。
論理的に考えると、これだけ需要がないと予想できるのに、解決するためのコストをMSが負担するとは思えない。
ただ、SQL Serverも何とかなったがAccessがバージョンアップするかもしれない。並び順のオプションにUTF-8ができたらひっそりと誰にも知られず消えるのではないか?
あれだけ苦労したサロゲートペアも今や歴史のかなたに消え去ろうとしている。

“There was a land of Cavaliers and Cotton Fields called the Old South. Here in this pretty world, Gallantry took its last bow. Here was the last ever to be seen of Knights and their Ladies Fair, of Master and of Slave. Look for it only in books, for it is no more than a dream remembered, a Civilization gone with the wind...”
かつて、なつかしき南部とよばれしふるさとありぬ
それは騎士道と綿畑の国
騎士と淑女、あるじと奴隷の姿は
この美しき国を最後に消え
今や思い出と本に記されるのみ
咲き誇りし文化、風と共に去りぬ

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1