- ベストアンサー
Excel97 VBAとVBSでsplit関数が使えない場合の対処方法
- 新しい職場でExcel VBAを使用してデータを取り込む際に、改行文字で区切って配列に格納しようとしました。しかし、Excelのバージョンが97であり、VBAのsplit関数が使用できなかったため、VBScriptのsplit関数を利用しました。
- しかし、VBScriptのsplit関数を使用する際に「終了していない文字列型の定数です。」というエラーが発生しました。このエラーの対処方法として、VBScriptの言語設定を設定する必要があります。
- 具体的な対処方法は、CreateObject("ScriptControl")でScriptControlオブジェクトを作成し、Languageプロパティを"VBScript"に設定します。また、split関数を使用する際には、改行文字を引用符で囲む必要があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 97を想定して作ってみました。97で試したわけではありませんが、試してみてください。 他にも、Replace関数がなかったと思います。 '//標準モジュール Function mSplit(ByVal TextLine As String, ByVal Delim As String) As Variant Dim k As Integer Dim i As Integer Dim t As Integer Dim f As Integer Dim Ar As Variant TextLine = Trim(TextLine) k = Len(TextLine) - Len(Application.Substitute(TextLine, Delim, "")) k = k / Len(Delim) f = 1 ReDim Ar(k) t = f For i = 1 To k + 1 t = InStr(t, TextLine, Delim) If t > 0 Then Ar(i - 1) = Mid(TextLine, f, t - f) f = t + Len(Delim) t = t + Len(Delim) Else Ar(i - 1) = Mid(TextLine, f) End If Next i mSplit = Ar End Function '//
その他の回答 (4)
- WindFaller
- ベストアンサー率57% (465/803)
#4の追加:(解決に結びつくものではありませんので、すみません) Split は別として、ここでは、成功しているようですが、問題は、そのデータの長さかな? そもそも、対象は、テキストファイルとしたら、一回にどれだけ読み込むかにもよります。 エクセルマクロでcrlfを含むデータを複数セルに分割して入力させたいのですが」 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1259608847 まあ、この回答者のような手抜きのコードをふつうは書きませんが。 つくづく、この手(Text Qualifier)の質問は、千差万別です。未だ、別の質問も解決していません。 しかし、こちらの自作Splitが問題あれば、考えなおさなくてはなりません。
お礼
splitの代わりを自作すること自体は、割りと何とかなりそうです。ありがとうございました。
- WindFaller
- ベストアンサー率57% (465/803)
#2の回答者です。 >CSVとかから取り込んだ複雑な文字列だと「アプリケーション定義またはオブジェクト定義のエラーです」エラーが出ちゃいました。自分でも考えて、色々やってみます。 どのような形でインポートしているかしりませんが、私の所のコードでエラーが出たのでしょうか? ふつう、そのエラーは、名指ししたオブジェクトが、その範囲ではないところのものだと、そのようなエラーが出ます。 典型的な例は、Sheet2のローカルモジュールで、 Sheets("Sheet1").Range(Cells(3, 3), Cells(5, 4)).Select と書いた場合ですね。Rangeの中のCellsプロパティとのつなぎが合っていません。 こういう場合は、標準モジュールに書くべきなのですね。 昔、作ったCSVインポート用のマクロをアップしようと思いましたが、急遽取りやめることにしました。 うっかりしていました。今、気がついたのですが、よく考えると、"1" & vbCrLf & "2" & vbCrLf & "3" の一般的な行の終わりが存在していないので、これは、CSVではありません。こういうファイル形式をなんと呼ぶのかは分かりませんが、シーケンシャルの類だと思います。通信機器などに発生するデータのようですね。それをインポートする方法は、まったく違いますね。 まず、データ数をカウントして、ストックして、それを強制的に行の桁数を作っていかなくてはなりません。 そういうことではありませんか?もしくは、縦を横にする工夫が必要です。 >"1" & vbCrLf & "2" & vbCrLf & "3" vbCrLf は、デリミタには違いありませんが、こういうスタイルが途切れることなく続くのではないでしょうか?もしそうなら、今までの方向性は、考え方を変えないと無理です。
お礼
ありがとうございました。
- WindFaller
- ベストアンサー率57% (465/803)
#2の回答者の追加です。 >Debug.Print rtn(1) 'ここで「終了していない文字列型の定数です。」エラーが出る これは、CR+LF (改行コード)が原因では?VBScript などのスクリプト言語では、CR+LFコードは、正しく処理できないのではないかと思います。おそらく、カンマ区切りなどでは、通るはずです。 CR+LFを別のものに置き換えれば、可能かと思いますが、97では、Replace関数がないので、置き換えには、Mid関数ぐらいしか思い当たりません。
お礼
VBScriptを苦肉の策で使うのには、色々と面倒なことが多いですね。
- bin-chan
- ベストアンサー率33% (1403/4213)
> rtn = vs.Eval("split(" & q & buf & q & ", vbCrLf)") 'Excel97のVBAにはsplit関数がないのでVB Sからsplitを流用 唐突に q が出てきたが、これは何?ダブルクォーテーション? rtnが何を受け取ったか、確認が先ですね 現在のままで、rtn(0)を表示できるなら、デリミタが存在しないから。
お礼
ありがとうございました。
補足
上の方のコードに書いていますが、qはダブルクォーテーションです。Evalの中にダブルクォーテーションを幾つもネストさせると分かりにくいので、代わりにこれをやってみました。
お礼
う~ん。短い文字列なら良いのですが、CSVとかから取り込んだ複雑な文字列だと「アプリケーション定義またはオブジェクト定義のエラーです」エラーが出ちゃいました。自分でも考えて、色々やってみます。