
新しい職場で、Excel VBAでデータを取り込み、それを改行文字ごとにsplit関数で区切って配列に入れようとしました。
arr=split(文字列,vbcrlf)
って感じでですね。しかし、なんとその職場のExcelのバージョンが97のため、VBAでsplit関数が使えず、この意図が実現できませんでした。そのため、ネットで調べてVBScriptのsplit関数を流用しようとしたのですが、「終了していない文字列型の定数です。」とエラーが出てしまいます。ソースは次のとおりなのですが、どう直せばいいでしょうか。改行文字で区切るのでなく、カンマなどで区切るのなら、上手く出来るのですが・・・。
Sub sample()
Dim vs As Object
Dim rtn As Variant
Dim q As String
Dim buf As String
q = Chr$(34) 'ダブルクォーテーション
Set vs = CreateObject("ScriptControl")
vs.Language = "VBScript" 'Excel97のVBAにはsplit関数がないのでVBSからsplitを流用
buf = "1" & vbCrLf & "2" & vbCrLf & "3" '改行で区切った文字。実際は、もっと複雑な文字を取り込みます。
rtn = vs.Eval("split(" & q & buf & q & ", vbCrLf)") 'Excel97のVBAにはsplit関数がないのでVBSからsplitを流用
Debug.Print rtn(1) 'ここで「終了していない文字列型の定数です。」エラーが出る
End Sub
No.2ベストアンサー
- 回答日時:
こんばんは。
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
'//
う~ん。短い文字列なら良いのですが、CSVとかから取り込んだ複雑な文字列だと「アプリケーション定義またはオブジェクト定義のエラーです」エラーが出ちゃいました。自分でも考えて、色々やってみます。
No.5
- 回答日時:
#4の追加:(解決に結びつくものではありませんので、すみません)
Split は別として、ここでは、成功しているようですが、問題は、そのデータの長さかな?
そもそも、対象は、テキストファイルとしたら、一回にどれだけ読み込むかにもよります。
エクセルマクロでcrlfを含むデータを複数セルに分割して入力させたいのですが」
http://detail.chiebukuro.yahoo.co.jp/qa/question …
まあ、この回答者のような手抜きのコードをふつうは書きませんが。
つくづく、この手(Text Qualifier)の質問は、千差万別です。未だ、別の質問も解決していません。
しかし、こちらの自作Splitが問題あれば、考えなおさなくてはなりません。
No.4
- 回答日時:
#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 は、デリミタには違いありませんが、こういうスタイルが途切れることなく続くのではないでしょうか?もしそうなら、今までの方向性は、考え方を変えないと無理です。
No.3
- 回答日時:
#2の回答者の追加です。
>Debug.Print rtn(1) 'ここで「終了していない文字列型の定数です。」エラーが出る
これは、CR+LF (改行コード)が原因では?VBScript などのスクリプト言語では、CR+LFコードは、正しく処理できないのではないかと思います。おそらく、カンマ区切りなどでは、通るはずです。
CR+LFを別のものに置き換えれば、可能かと思いますが、97では、Replace関数がないので、置き換えには、Mid関数ぐらいしか思い当たりません。
No.1
- 回答日時:
> rtn = vs.Eval("split(" & q & buf & q & ", vbCrLf)") 'Excel97のVBAにはsplit関数がないのでVB Sからsplitを流用
唐突に q が出てきたが、これは何?ダブルクォーテーション?
rtnが何を受け取ったか、確認が先ですね
現在のままで、rtn(0)を表示できるなら、デリミタが存在しないから。
この回答への補足
上の方のコードに書いていますが、qはダブルクォーテーションです。Evalの中にダブルクォーテーションを幾つもネストさせると分かりにくいので、代わりにこれをやってみました。
補足日時:2014/04/04 23:11お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 改行ごとに行を追加し、数量を分割 4 2023/07/11 16:39
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) VBAでファイルを開くプログラムがエラーです 2 2023/02/21 16:56
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) エクセルのマクロとシートの保護について教えてください。 1 2022/10/18 08:36
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
実行時エラー -'-2147417848
-
実行時エラー 438になった時の...
-
Excel VBA で End Subのところ...
-
なぜこんな初歩的なVBAのIf文で...
-
Excelで=IFで始まるStringがセ...
-
エクセルVBAについて
-
Accessで定型フォーマットのExc...
-
VBAで、定数式が必要ですのエラ...
-
アプリケーション定義またはオ...
-
ACCESS VBA Excelにデータ出力...
-
マクロについて教えてください...
-
VBAがブレークモードになっ...
-
プロシージャ名の取得
-
【Excel VBA】マクロをボタンに...
-
ExcelVBA Range クラスの Page...
-
AccessのクエリーでDate関数の...
-
エクセルのマクロでCells(j,i)...
-
コンバインエラー
-
なぜエラーになるのでしょうか...
-
日本語環境下で作成したマクロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
実行時エラー 438になった時の...
-
VBAがブレークモードになっ...
-
なぜこんな初歩的なVBAのIf文で...
-
ExcelVBA Range クラスの Page...
-
EXCEL VBAマクロ中断でデバッグ...
-
実行時エラー -'-2147417848
-
【Excel VBA】マクロをボタンに...
-
Outlook.ApplicationをCreateOb...
-
VBAでのエラー
-
マクロについて教えてください...
-
実行時エラー3001「引数が間違...
-
実行時エラー48発生時のDLL特定...
-
VB6+SQL サーバー 2000 で 実行...
-
エクセルエラー13型が一致しま...
-
VBS実行時エラー オブジェクト...
-
ADODB.Streamを使用してUTF-8を...
-
INSERT INTOステートメント構文...
-
VBAで、定数式が必要ですのエラ...
-
OLEDB.NETで接続できない
-
VBSで変数の宣言はできないので...
おすすめ情報