初めてカキコします。
CSV形式(tab区切りの,テキスト区切りなし)のファイルを
VBを用いてExcelファイルに貼り付けようとしてるのですが
どうも上手くいかないんです。
[VB側の処理]
既存ファイルにインポートをしてから別名で保存
というようにしてるのですが
保存されたExcelファイルをみると、
既存のExcelファイルにあったデータが消えて
インポートされたデータしか残ってない状態なんです。
やり方がまずいと思っているのですが
まわり年輩の男性ばかりで人に聞けなくて・・・。
それでネットで探してここを見つけました。
不明な点があれば質問してください。
よろしくお願いしま〜すぅ。
同一WorkSheetに対し、上書きしているのでは?
予め空のワークシートを用意しておいて
そこにデータをインポートしようとしています。
ですから
同一worksheetに上書きしてるつもりはないのですが…。
(現事象)
Sheet1(データ有り),Sheet2(データ無し),Sheet3(データ無し)
このときにCSVファイルをSheet3にインポートしたいのですが、
実際にインポート処理を行ってみると
Sheet3だけしかない状態で保存されてしまってる状態なんです。
もし他にお気づきの点があれば教えて下さい。
よろしくお願いしまーす。
CSVを読み込む際に新規にEXCELオブジェクトを作成してしまって
いるのではないでしょうか?
XLSを開いたオブジェクトでWorkSheetを指定して、そこに
CSVを展開すれば出来ると思いますよ。(というか実績あり^^;)
'======================================================
Set objExlApp = GetObject(strXlsFileIn, "Excel.Sheet")
strExlSheet = "Sheet3" 'ブックのシート名
Open strCsvFile For Input As #1 Len = 32000
j = 1
k = 3 'CSV項目数
With objExlApp.Worksheets(strExlSheet)
.Cells.Delete 'シートのクリア
Do Until EOF(1)
For i = 1 To k
Input #1, rec
.Cells(j, i).Value = rec
Next
j = j + 1
Loop
End With
Close #1
ぢゃわさん ありがとうございます。
カンマ区切りであるファイルでやってみたら上手くいきました。
ですが、ホントすいませーん。
あたしが求めてたのはタブ区切りのCSVファイルなんですね。
タブ区切りだとSheetにセットされてはいるのですが
上手くセットされていない状態なのです。
(現象)
1 c 3 2 3 1 2
2 b 5 6 2 1 2
3 a 2 7 1 1 2
4 f 7 5 4 1 2
5 b 3 9 5 1 2
6 a 1 2 7 1 2
7項目×6レコードのCSVファイルを用いてやってみましたら
Cell(1,1)には“1”が格納されたのですが、
Cell(1,2)には残りの“c 3 2 3 1 2”が格納されました。
Cell(1,3)には次のレコードの“2”が格納され、
Cell(1,4)には残りの“b 5 6 2 1 2”が格納されました。
Cell(1,5)には次のレコードの“3”が格納され、
Cell(1,6)には残りの“a 2 7 1 1 2”が格納されました。
Cell(2,1)には4レコード目の“4”が格納され
Cell(2,2)には残りの“f 7 5 4 1 2”が格納されました。
( --- 略 --- )
タブを判断できる方法等があるのでしょうか?
再度 宜しくお願いしまーす。
実際にタブ区切りのCSVファイルでやったことは
ありませんが、単純にCSVファイルの読み方の
問題ではないでしょうか。
今はCSVの内容を単純にInput関数で拾ってますが、
Input関数はカンマやリターンを勝手に認識して
くれているので、カンマ区切りの場合は何も考え
ずに項目ごとに拾えています。
タブ区切りの場合はLine Inputとかで行単位で
データを拾っておいて、其のデータをタブ文字
ごとに区切ってセルにセットする、というような
ロジックを組んであげればできるはずです。
ゴールは目前なのでがんばってください^^
ぢゃわさん またまたありがとうございます。
お返事、遅くなって申し訳ありません。
本当にもう少しのところまできました。。。 (^^)v
もう一つ教えて下さい。
> タブ区切りの場合はLine Inputとかで行単位で
> データを拾っておいて、其のデータをタブ文字
> ごとに区切ってセルにセットする、というような
> ロジックを組んであげればできるはずです。
一行取得したデータをタブ文字毎に区切るためには
ロジックをどのように組めばいいのでしょうか?
タブを判断できる手法を教えて下さい。
お願いしまーす。
>一行取得したデータをタブ文字毎に区切るためには
>ロジックをどのように組めばいいのでしょうか?
ここまでくれば簡単な文字列操作命令の組み合わせなので自分でコーディング
したほうが為になると思います。
一番単純な方法は、1行分のデータをmidコマンドで1文字ずつチェックする
方法です。
最初にLenコマンドで文字長を調べておき、その文字数分
midコマンドをForからNextでループします。
midコマンドでは読み取った1行分のデータのn文字目(nはループカウント)
から1バイト(1文字)を取得・・・というようなかんじにしておきます。
この取得した1文字がTAB文字でなければ、次の文字をチェック。
TAB文字ならそこまでのデータをセルに書き込んで、セルのX位置を1つ増やす。
これを文字長文繰り返して、全文字チェックできたらセルのY位置を1つ増やし
次のレコードを読み込む、といったかんじになります。
TABの判定はVBの定数でvbTabというのがあるのでこれと比較すればいいでしょう。
わかりずらい説明かもしれなくてすみません。
どうしてもわからなければコーディングを組んで掲載しますが、まずはがんばって
みてください。
Excelにデータを送るはやったこと無いのでわからないのですが、
単純にTABごとに分割するのだったらSplit関数で出来ますよ。
Dim intIndex As Integer
Dim intFileNo As Integer
Dim strText As String
Dim strArray() As String
intFileNo = FreeFile
Open "C:\a.txt" For Input Access Read As intFileNo
Do Until EOF(intFileNo)
Line Input #intFileNo, strText
strArray = Split(strText, vbTab)
For intIndex = 0 To UBound(strArray)
MsgBox strArray(intIndex)
Next intIndex
Loop
Close intFileNo
読み込んだデータをTABごとに分割して
分割された内容をMsgboxで表示しているだけですが。
もし すっとんきょん事書いてたら、ごめんなさい。
split関数・・・使ったことなかったです。
こんな便利な関数があったとわ。
これから多用しそうです(^^;
今回の手段としてもこの関数で問題ないはずです。
僕の提示した方法よりシンプルになりますね。
取得した各項目をmsgboxに出すかわりに
セルにおいていけばいいだけですね。
むぅ、勉強になりました^^ (オイオイ
okuさん、ぢゃわさん ありがとうございます。
おかげさまでCSVファイルの取り込みが出来ました。
ぢゃわさんへ、、、
TABの判定がvbTabということがわからなかったもので助かりました。
何回もレスありがとうございます。
okuさんへ、、、
Split関数 こんなにいいものがあったんですね。
本当にありがとうございました。 (o*。_。)o
ツイート | ![]() |