[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『エクセルで開いてからフィールド分割したい』(フェンダー)
UTF8形式のCSVデータを外部で開いてから 下記のような住所のフィールドを指定してVBAで分割したいのですが どなたかご教授下さい。 因みに区切り位置からの分割以外の方法であればいいのですが・・・ 宜しくお願いします。
000-0000,똞땷場 4−16−1,012345 000-0000,똞듽땷市 4−16−1,23456
XP エクセル2007 (フェンダー)
因みにデータを開く前にスペースを利用して区切ると他のフィールドのスペースも 区切られデータが少しずつずれていってしまいます。
XP エクセル2007 (フェンダー)
どこが解らないところですか?
>フィールドを指定してVBAで分割 >区切り位置からの分割以外の方法
どのように分割して、どんな結果になれば良いのでしょうか? (momo)
すいません。 説明が不足してました。 住所のフィールドのスペースを条件判定し 下記のように 000-0000,똞땷場 4−16−1,012345 000-0000,똞듽땷市 4−16−1,23456
↓
000-0000,똞땷場,4−16−1,012345
000-0000,똞듽땷市,4−16−1,23456 となるようなデータにしたいのです。 (フェンダー)
まだよくわかっていませんが 以下のような事ですか? データの出力先はとりあえずセルにしてますが
参照設定 : Microsoft ActiveX Data Object ?.? Library
Sub test() Dim ReadBuf As String Dim tbl As Variant Dim myCSV As Variant Dim i As Long myCSV = Application.GetOpenFilename("CSV ファイル (*.csv),*.csv") If VarType(myCSV) = vbBoolean Then Exit Sub With New ADODB.Stream .Type = adTypeText .Charset = "UTF-8" .Open .LoadFromFile (myCSV) ReadBuf = .ReadText(adReadAll) .Close End With tbl = Split(ReadBuf, vbCrLf) For i = LBound(tbl) To UBound(tbl) tbl(i) = Replace(tbl(i), Split(tbl(i), ",")(1), _ Replace(Replace(Split(tbl(i), ",")(1), " ", ","), " ", ",")) Next i ActiveSheet.Range("A1").Resize(UBound(tbl) + 1).Value = _ Application.WorksheetFunction.Transpose(tbl) End Sub
(momo)
ご回答ありがとうございます。 上記の記述だとエラーでうまくいきませんでした。
もう少し詳しくご説明しますと 住所地名の途中で改行を行わないようにする(区切り△(スペース)で改行を行うようにする 例 (×)東京都△あきる野 市△1−1−1 印字ソフトの設計上、住所のフィールドを区切り△(スペース)ごとに分割しないと 上記のような例になってしまいます。
1つのセルに存在する東京都△(スペース)あきる野市△(スペース)1−1−1が下記のように
東京都,あきる野市,1−1−1
区切ることが出来れば 印字設計する際
東京都 あきる野市 1−1−1 と住所地名の途中で改行を行わないように設定可能になります。
(フェンダー)
>上記の記述だとエラーでうまくいきませんでした
>参照設定 : Microsoft ActiveX Data Object ?.? Library ↑参照設定しましたか?
(momo)
たびたびすいません。 VBAはこれから少しずつ勉強していきますので基本がまだ分からない状態です。 コンパイルエラー ユーザー定義型は定義されてませんとなってしまいます。 因みに参照設定内の Microsoft ActiveX Data Object ?.? Libraryは 6点あったのですべてにチェック入れました。 それと今回テスト使用したデータが、上記例と異なり 合計22フィールドで100件のデータになり、3フィールド目に問題の△(全角スペース)含む住所が記述されてます。 (フェンダー)
ん〜? では、これでは? レイトバインディングに変更と3フィールド目にしてみました。
Sub test() Dim ReadBuf As String Dim tbl As Variant Dim myCSV As Variant Dim i As Long myCSV = Application.GetOpenFilename("CSV ファイル (*.csv),*.csv") If VarType(myCSV) = vbBoolean Then Exit Sub With CreateObject("ADODB.Stream") .Type = 2 .Charset = "UTF-8" .Open .LoadFromFile (myCSV) ReadBuf = .ReadText(-1) .Close End With tbl = Split(ReadBuf, vbCrLf) For i = LBound(tbl) To UBound(tbl) tbl(i) = Replace(tbl(i), Split(tbl(i), ",")(2), _ Replace(Replace(Split(tbl(i), ",")(2), " ", ","), " ", ",")) Next i ActiveSheet.Range("A1").Resize(UBound(tbl) + 1).Value = _ Application.WorksheetFunction.Transpose(tbl) End Sub
最初はハングル?中国語?混じりだったのですが日本語なのですか? 元のデータがハッキリしないので検証しにくいです。 (momo)
ご回答ありがとうございます。 提案して頂いた記述でマクロ実行しましたら
今回は実行時エラー '9': インデックスが有効範囲にありません と表示されました。 デバックすると 下記が黄色枠で囲まれます。
tbl(i) = Replace(tbl(i), Split(tbl(i), ",")(2), _ Replace(Replace(Split(tbl(i), ",")(2), " ", ","), " ", ","))
因みに下記のようにハングルと日本語の混在で先頭にハングルもあれば 日本語が先頭の場合もあり 外字サーバーにマージさせ、すべて日本語で表示されるシステムになります。 それとバイトオーダーマークは無で保存してます。
札〇땷 ??区 平든四条 2−0−00 上〇郡 뗶뚬뙥 西三条北 0−0 アアアアアア−カカカカカ 똺広땷 〇12ァ ハ 2−0−0
(フェンダー)
>For i = LBound(tbl) To UBound(tbl) If Len(tbl(i)) > 0 Then '★ > tbl(i) = Replace(tbl(i), Split(tbl(i), ",")(2), _ > Replace(Replace(Split(tbl(i), ",")(2), " ", ","), " ", ",")) End If '★ >Next i
★の2行を追加してみてください。 たぶん、文末にCrLfが入っているんだと思いますので。 (momo)
ありがとうございます。 Sub test() Dim ReadBuf As String Dim tbl As Variant Dim myCSV As Variant Dim i As Long myCSV = Application.GetOpenFilename("CSV ファイル (*.csv),*.csv") If VarType(myCSV) = vbBoolean Then Exit Sub With CreateObject("ADODB.Stream") .Type = 2 .Charset = "UTF-8" .Open .LoadFromFile (myCSV) ReadBuf = .ReadText(-1) .Close End With tbl = Split(ReadBuf, vbCrLf) For i = LBound(tbl) To UBound(tbl) If Len(tbl(i)) > 0 Then ' tbl(i) = Replace(tbl(i), Split(tbl(i), ",")(2), _ Replace(Replace(Split(tbl(i), ",")(2), " ", ","), " ", ",")) End If ' Next i ActiveSheet.Range("A1").Resize(UBound(tbl) + 1).Value = _ Application.WorksheetFunction.Transpose(tbl) End Sub
上記の記述通りでマクロ実行しましたとこ、確かにカンマで区切られたのですが 私の説明が足りなかったようです。 カンマで区切られるイメージは、CSVをメモ帳やテキスト形式で見た時であり エクセル上でカンマ区切りではなく、住所のフィールドの△スペースごとに セルを分解したかったのです。 それをメモ帳でひらくとカンマ区切りになるイメージです。 説明が伝わりにくくて申し訳ございません。
(フェンダー)
それはわかっていますが、とりあえず動作確認のためにセルに書き出しました。 で、元のCSVに上書きで良いのですか?とりあえず別のファイル名にしますか? 文字コードはUTF-8N(BOM無し)ですか?それ以外ですか? (momo)
あまり時間が無いのと、次にここを見られるのが8/2なので とりあえず、UTF-8N型式で違うファイル名(元のファイル名に変換済を追加した名前)で 保存するサンプルを載せておきます。 適宜いじって頂くか、来週までお待ちください。
'===ADODB.Streamレイトバインディング用引数=== Const adTypeBinary As Long = 1 Const adTypeText As Long = 2 Const adReadAll As Long = -1 Const adReadLine As Long = -2 Const adSaveCreateNotExist As Long = 1 Const adSaveCreateOverWrite As Long = 2
Sub CsvFieldConvert() Dim myCSV As Variant Dim mySave As String Dim ReadBuf As String Dim tbl As Variant Dim i As Long Dim myByte() As Byte 'CSVファイル読み込み myCSV = Application.GetOpenFilename("CSV ファイル (*.csv),*.csv") If VarType(myCSV) = vbBoolean Then Exit Sub '保存ファイル名作成 mySave = StrReverse(Split(StrReverse(myCSV), ".", 2)(1)) & "変換済.csv" With CreateObject("ADODB.Stream") 'UTF-8型式→String型で読み込み .Type = adTypeText .Charset = "UTF-8" .Open .LoadFromFile (myCSV) ReadBuf = .ReadText(adReadAll) .Close '3フィールド目のスペースを","に変換 tbl = Split(ReadBuf, vbCrLf) For i = LBound(tbl) To UBound(tbl) If Len(tbl(i)) > 0 Then tbl(i) = Replace(tbl(i), Split(tbl(i), ",")(2), _ Replace(Replace(Split(tbl(i), ",")(2), " ", ","), " ", ",")) End If Next i 'String型で書込み .Open .WriteText Join(tbl, vbCrLf) 'UTF-8N型式に変換(Byte型で先頭3Byte目以降を取得つまりBOM取り除き) .Position = 0 .Type = adTypeBinary .Position = 3 myByte = .Read .Close 'Binaryで書き込んで保存 .Open .Type = adTypeBinary .Write myByte .SaveToFile mySave, adSaveCreateOverWrite .Close End With End Sub
(momo)
ありがとうございます。 明日、検証してみます。 別にご質問したいことがあったのですが 新規で質問ボードに記載します。
(フェンダー)
検証した結果上記記述で生成出来ました。 どうもありがとうございました。 因みに新規ボードで新たな質問しているのですが ご回答がないかもしれないです。 この他にも色々バーコード付加作業等をしたり 追加作業でデータを開くときもあるのですが 最終的にUTF8のBOM無のみの指示で保存したいのですが 分かればご教授頂けますでしょうか? 今はCSVソフトから抽出してUTF8で保存しているのですが 作業効率からして同一環境で行いたいと思いまして 追加作業で開く際に、エクセルからUTF8で保存できるようになれば非常に 助かります。 また8/2以降で構わないので アイデアがありましたらどうぞよろしくお願いします。 どうもありがとうございました。 (フェンダー)
とりあえず時間が出来たので・・・ 出来たようでなによりです。 新しい質問もあるみたいで回答も付いているようですから細かい事は省略しますが、 上のコードで出来たのであれば「ADODB.Stream」で検索して色々調べてみる事をお勧めします。 バイナリかテキストか、とか保存する場合は文字コードとかの仕様をきっちりして 調べてみればなんとかなると思います。 バーコードにしても、基本はコントロールなのでオブジェクトのメンバーがわかれば ある程度大丈夫だと思います。 ちなみに、私もADODB.Streamのコードを書くのはまだ2回目です。 調べながら書いてみました。 たぶん、内容的に新規質問がベターかと思いますので解らない事を的確に質問してみてください。 (momo)
バーコード生成ソフトが、シフトジスのみ 対応なので、郵便番号と住所数値のみシフトジスで 抽出して、バーコード情報生成したらUTF8の領域に付加する やり方で対応してます。 あと、どうしても出来ない作業や危険な作業は ベンダーに任せる予定です。 まだマクロはほとんど理解してないのですが 紹介頂いた情報のADODB.Streamも チェックしてみます。 どうもありがとうございました。 (フェンダー)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.