CSVファイルを既存のExcelファイルに追加するには?

解決


imuya  2002-06-07 00:21:25  No: 75707

初めてカキコします。

CSV形式(tab区切りの,テキスト区切りなし)のファイルを
VBを用いてExcelファイルに貼り付けようとしてるのですが
どうも上手くいかないんです。

[VB側の処理]
 既存ファイルにインポートをしてから別名で保存
というようにしてるのですが
保存されたExcelファイルをみると、
既存のExcelファイルにあったデータが消えて
インポートされたデータしか残ってない状態なんです。

やり方がまずいと思っているのですが
まわり年輩の男性ばかりで人に聞けなくて・・・。
それでネットで探してここを見つけました。

不明な点があれば質問してください。
よろしくお願いしま〜すぅ。


Say  2002-06-09 22:39:56  No: 75708

同一WorkSheetに対し、上書きしているのでは?


imuya  2002-06-10 22:31:00  No: 75709

予め空のワークシートを用意しておいて
そこにデータをインポートしようとしています。
ですから
同一worksheetに上書きしてるつもりはないのですが…。

(現事象)
    Sheet1(データ有り),Sheet2(データ無し),Sheet3(データ無し)
    このときにCSVファイルをSheet3にインポートしたいのですが、
    実際にインポート処理を行ってみると
    Sheet3だけしかない状態で保存されてしまってる状態なんです。

もし他にお気づきの点があれば教えて下さい。
よろしくお願いしまーす。


ぢゃわ  2002-06-11 23:39:36  No: 75710

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


imuya  2002-06-12 02:06:05  No: 75711

ぢゃわさん  ありがとうございます。
カンマ区切りであるファイルでやってみたら上手くいきました。

ですが、ホントすいませーん。
あたしが求めてたのはタブ区切りの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”が格納されました。
      ( --- 略 --- )

タブを判断できる方法等があるのでしょうか?

再度  宜しくお願いしまーす。


ぢゃわ  2002-06-12 02:42:36  No: 75712

実際にタブ区切りのCSVファイルでやったことは
ありませんが、単純にCSVファイルの読み方の
問題ではないでしょうか。

今はCSVの内容を単純にInput関数で拾ってますが、
Input関数はカンマやリターンを勝手に認識して
くれているので、カンマ区切りの場合は何も考え
ずに項目ごとに拾えています。

タブ区切りの場合はLine Inputとかで行単位で
データを拾っておいて、其のデータをタブ文字
ごとに区切ってセルにセットする、というような
ロジックを組んであげればできるはずです。

ゴールは目前なのでがんばってください^^


imuya  2002-06-17 20:06:59  No: 75713

ぢゃわさん  またまたありがとうございます。
お返事、遅くなって申し訳ありません。
本当にもう少しのところまできました。。。 (^^)v

もう一つ教えて下さい。

> タブ区切りの場合はLine Inputとかで行単位で
> データを拾っておいて、其のデータをタブ文字
> ごとに区切ってセルにセットする、というような
> ロジックを組んであげればできるはずです。

一行取得したデータをタブ文字毎に区切るためには
ロジックをどのように組めばいいのでしょうか?
タブを判断できる手法を教えて下さい。

お願いしまーす。


ぢゃわ  2002-06-17 23:21:34  No: 75714

>一行取得したデータをタブ文字毎に区切るためには
>ロジックをどのように組めばいいのでしょうか?

ここまでくれば簡単な文字列操作命令の組み合わせなので自分でコーディング
したほうが為になると思います。

一番単純な方法は、1行分のデータをmidコマンドで1文字ずつチェックする
方法です。
最初にLenコマンドで文字長を調べておき、その文字数分
midコマンドをForからNextでループします。

midコマンドでは読み取った1行分のデータのn文字目(nはループカウント)
から1バイト(1文字)を取得・・・というようなかんじにしておきます。
この取得した1文字がTAB文字でなければ、次の文字をチェック。
TAB文字ならそこまでのデータをセルに書き込んで、セルのX位置を1つ増やす。
これを文字長文繰り返して、全文字チェックできたらセルのY位置を1つ増やし
次のレコードを読み込む、といったかんじになります。

TABの判定はVBの定数でvbTabというのがあるのでこれと比較すればいいでしょう。

わかりずらい説明かもしれなくてすみません。
どうしてもわからなければコーディングを組んで掲載しますが、まずはがんばって
みてください。


oku  URL  2002-06-18 08:16:38  No: 75715

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で表示しているだけですが。

もし  すっとんきょん事書いてたら、ごめんなさい。


ぢゃわ  2002-06-18 19:52:07  No: 75716

split関数・・・使ったことなかったです。
こんな便利な関数があったとわ。
これから多用しそうです(^^;

今回の手段としてもこの関数で問題ないはずです。
僕の提示した方法よりシンプルになりますね。
取得した各項目をmsgboxに出すかわりに
セルにおいていけばいいだけですね。

むぅ、勉強になりました^^    (オイオイ


imuya  2002-06-18 23:23:49  No: 75717

okuさん、ぢゃわさん  ありがとうございます。
おかげさまでCSVファイルの取り込みが出来ました。

ぢゃわさんへ、、、
  TABの判定がvbTabということがわからなかったもので助かりました。
  何回もレスありがとうございます。

okuさんへ、、、
  Split関数  こんなにいいものがあったんですね。

本当にありがとうございました。 (o*。_。)o


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加