プロが教えるわが家の防犯対策術!

Excel 1セル当りの文字数が255文字を超える場合のADOからの取り扱いについて

前回質問した続きになるのですが、VBA(ADO)で自分自身のSheet間で抽出・コピー・ペーストを行っているのですが、抽出の際に、1セルの内容が255文字を超えている場合、エラーが発生します。

strSQL = "Select * from [sheet1$] where Col1 like '" & schStr & "%'"

Set RS = New ADODB.Recordset
RS.Open SQL, CN, adOpenStatic, adLockReadOnly

RS.Open でエラーが発生します。

私的には、255文字を超えているセルに関しては2行に分けるしかないのかなと考えております。
何か「こうすればいいよ」的なアドバイス頂けましたら幸いです。

よろしくお願い致します。

A 回答 (1件)

1)ADOでExcelを読み込む場合、256文字以上は切り捨てられる事があります。


 回避するには、8行目までのスキャンデータ中に
 最大文字数のダミーデータを置くか、
 http://support.microsoft.com/kb/189897/ja
 レジストリを修正するか、などになります。
 ただし、全レコードをスキャンするわけですから、
 パフォーマンス的に問題ありそう。

2)また、開いているExcelBookにADOでアクセスすると
 メモリリークが発生します。
 大量のデータを繰り返し抽出する作業には向いていません。
 #OSがVista以降になって改善されたかも。検証不足。

3)ADOとは関係ない部分で、2003では配列内文字列911文字まで
 という制限があります。
 http://support.microsoft.com/kb/818808/ja

255文字制限の場合は切り捨てられるだけで、エラーは発生しません。
仮に911文字制限に引っ掛かったとしても、CopyFromRecordsetメソッドの時に
エラーになります。
ですので
>RS.Open でエラーが発生します。
これは別の要因じゃないでしょうか。

いずれにしても、(2)の不具合がありますから、
自Bookに対するADOアクセスはあまりおすすめしません。

どうしてもADOを使いたい場合、
GetRowsメソッドで抽出結果データを配列に取得します。
その後、配列をLoopし行列をTransposeさせながら文字長をチェックし、
255文字超えるデータを別配列に退避して消去し、
後から1個ずつセルにセットさせたり、

またはvbTabとvbCrLfで配列要素を連結して文字列を作り、
DataObject経由でシートに貼り付けたりとか。

...などが考えられますが、
それよりも、Excelの基本機能を使った方が簡単です。


提示条件と同じ事をAdvancedFilterメソッドを使って
([データ]-[フィルタ]-[フィルタオプションの設定])

Sub Macro1()
  Dim schStr As String  '抽出条件
  Dim ws   As Worksheet '抽出条件書き出しシート
  Dim r   As Range   '元データ範囲

  With ActiveWorkbook
    '元データ範囲取得
    Set r = .Sheets("sheet1").UsedRange
    Set ws = .Sheets.Add
    schStr = InputBox("schStr")
    '元データの見出し(Col1)をセット
    ws.Range("A1").Value = r.Item(1).Value
    '抽出条件をセット
    ws.Range("A2").Value = schStr
    '[フィルタオプションの設定]
    r.AdvancedFilter Action:=xlFilterCopy, _
             CriteriaRange:=ws.Range("A1:A2"), _
             CopyToRange:=.Sheets.Add.Range("A1"), _
             Unique:=False
  End With
  Set r = Nothing
  Set ws = Nothing
End Sub

ActiveWorkbookにシートを2枚追加し、
1枚はAdvancedFilterの抽出条件書き出し用とします。
もう1枚に抽出結果を書き出します。
あくまでサンプルですから、既存シートへ抽出するようにも変更できます。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A