MS Access Tips/Sample and VBA and Blog customize etc...

AC2007, 2010 の Split, InStr関数のバグ?

VBA の Split() で「文字列領域が不足しています。」のエラーになります。
Windows7 64bit, Office2010β版 の環境で、 というようなコードで再現できます。

というような質問がMoug掲示板でありました。
(改編してます。オリジナルは、
Split 関数でエラー「文字列領域が不足しています。」となる

当方のWin7 32bit + AC2007 でも再現できました。

VBASplitBug.png

難易度: 難易度: 2

再現方法

標準モジュールに下記の関数を作成して、イミディエイトウィンドウで実行します。

すると上の画像のエラーメッセージが表示されます。

検証

最後が、","(カンマ)だけで終わっているのがどうも怪しい。そこで、"," の後に文字列を追加してみました。

イミディエイトで実行してみると、エラーは出ずに下記の結果となりました。

SplitTest
7202.T        いすゞ自動車(株),           /30,          03,           bc

"いすゞ自動車(株)"以降、分割位置が一つずれています。そのために、最後が","だけの時は、文字列領域外にアクセスして上記のエラーになるのだと思われます。

"ゞ" がいかにも怪しそうです。そこで、4行目を下記のように変更して実行してみました。

すると問題なく分割されました。

SplitTest
7202.T        いすす自動車(株)           4/30          303           

ということで、"ゞ" がどうも原因らしい。他に調べてみると、 "ヾ" でも同じ問題が発生しました。普通の濁音などは問題ないようです。

対処法

今回のようにcsvデータを処理する場合なら、全角のカンマが区切り文字として混在することはないはずなので、vbTextCompare にする必要はないです。下記のように vbBinaryCompare にすれば"ゞ"が含まれても問題なく分割できます。

もし、全角と半角が混在するという場合は、Replace で半角に変換してから、vbBinaryCompare でSplitすればいいでしょう。

結論

AC2007で InStr についても、テストしてみたところ、

?InStr("いすゞ,",",")
 5 
?InStr("いすず,",",")
 4

というようおかしくなりました。"ゞ" を2文字とカウントしているようです。こちらも vbBinaryCompare ですと問題ないです。

また、AC2003でSplit、InStr で同じテストをしたところ、問題はでませんでした。どうやら AC2007から持ち込まれたバグのようです。2010/03追記: Access2010でもこのバグは解消されていないようです。

2014/04/10追記: Access2013の最新バージョンでは解消されているようです。

下記の記事でも Printメソッドのバグを報告しましたが、AC2007では、テキストモードの比較には問題がありそうです。
AC2007のPrintメソッドのバグ

拍手する

4 Comments

通りすがり says..."access2003"

access2003で同様の現象が出たので参考にさせていただきました。
同じ対処で回避できました。ありがとうございます。

2013.03.26 11:38 | URL | #mQop/nM. [edit]
名無し says...""

Replaceでも同様の事象が発生するようですね・・・

2014.01.08 21:35 | URL | #- [edit]
hatena says..."re:Replaceでも"

確認しました。

置換される位置がずれますね。

2014.01.09 17:14 | URL | #5uE6dEgY [edit]
Sr. says..."クエリーに於ける不具合の回避 ( Replace )"

『いすゞ自動車 株式会社』という文字列から空白を除く為に
Replace([名前]," ","")という式を入れたら、
結果が『いすゞ自動車 式会社』になって困っていました。
以前に(見かけ上 判らない)改行が含まれていた経験から 改行を除く記述を入れてみましたが変化なく、途方に暮れている時に このサイトを見付けました。
引っ掛かる文字が特定できたお蔭で対処できました。("ゞ"と"ヾ"を一旦 使う可能性が極めて低い文字に置き換え、実際に行いたいReplaceを行った後に元に戻す。)
有難うございました。

2016.06.04 15:10 | URL | #- [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/266-34a95ef3
該当の記事は見つかりませんでした。