Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4698 / 13646 ツリー ←次へ | 前へ→

【55089】ファイル読み込みができません。 しげ 08/4/15(火) 9:54 質問[未読]
【55091】Re:ファイル読み込みができません。 テト 08/4/15(火) 10:16 発言[未読]
【55092】Re:ファイル読み込みができません。 VBWASURETA 08/4/15(火) 10:18 発言[未読]
【55093】Re:ファイル読み込みができません。 しげ 08/4/15(火) 10:31 発言[未読]
【55097】Re:ファイル読み込みができません。 Jaka 08/4/15(火) 11:29 発言[未読]
【55098】Re:ファイル読み込みができません。 Yuki 08/4/15(火) 11:31 発言[未読]
【55099】Re:ファイル読み込みができません。 Jaka 08/4/15(火) 11:43 発言[未読]
【55100】Re:ファイル読み込みができません。 Yuki 08/4/15(火) 11:49 発言[未読]
【55103】Re:ファイル読み込みができません。 しげ 08/4/15(火) 13:00 質問[未読]
【55104】Re:ファイル読み込みができません。 Yuki 08/4/15(火) 13:34 発言[未読]
【55105】解決しました! しげ 08/4/15(火) 14:08 お礼[未読]
【55121】Re:ファイル読み込みができません。 VBWASURETA 08/4/16(水) 9:53 発言[未読]
【55127】Re:ファイル読み込みができません。 Jaka 08/4/16(水) 13:18 発言[未読]
【55129】Re:ファイル読み込みができません。 VBWASURETA 08/4/16(水) 14:21 発言[未読]

【55089】ファイル読み込みができません。
質問  しげ  - 08/4/15(火) 9:54 -

引用なし
パスワード
   ユーザーフォームで読み込みたいファイル名(フルパス)をテキストボックスに入れ、
実行を押すとそのファイルを読み込みたいと思い、以下のように書きました。

  Dim intFF As Integer      ' FreeFile値
  Dim I(1 To 9) As Variant    ' 読み込んだレコード内容

  ' FreeFile値の取得(以降この値で入出力する)
  intFF = FreeFile
  ' 指定ファイルをOPEN(入力モード)
  Open Me.SelectFileName For Input As #intFF
  GYO = 1
  ' ファイルのEOF(End of File)まで繰り返す
  Do Until EOF(intFF)
    ' レコードを読み込む
    Input #intFF, I(1), I(2), I(3), I(4), I(5), I(6), I(7), I(8), I(9)
    ' 行を加算しA〜I列にレコード内容を表示
    Range(Cells(GYO, 1), Cells(GYO, 9)).Value = I
    GYO = GYO + 1
  Loop
  ' 指定ファイルをCLOSE
  Close #intFF

実行したところ、Input #intFF, I(1), I(2), I(3), I(4), I(5), I(6), I(7), I(8), I(9)
で「ファイルにこれ以上データがありません。」とエラーが出てしまいます。
原因がわからないのですが、どなたか教えていただけませんでしょうか?

【55091】Re:ファイル読み込みができません。
発言  テト  - 08/4/15(火) 10:16 -

引用なし
パスワード
   ファイルの中身と
>I(1), I(2), I(3), I(4), I(5), I(6), I(7), I(8), I(9)
が合ってないんじゃない?

【55092】Re:ファイル読み込みができません。
発言  VBWASURETA  - 08/4/15(火) 10:18 -

引用なし
パスワード
   ▼しげ さん:
おはようございます。

試してはないですが、テキストはCSVですか?
バイナリデータだと当然出ますが。

後、固定で配列に取ってますがその固定分のデータがあるのでしょうか?

まずその辺りを潰す方が良いかと。

【55093】Re:ファイル読み込みができません。
発言  しげ  - 08/4/15(火) 10:31 -

引用なし
パスワード
   >テトさん
>VBWASURETA さん
おはようございます。

Me.SelectFileName は間違いなく.csvでしたし、
A1からI5000まで空欄なく埋まっているファイルです。

【55097】Re:ファイル読み込みができません。
発言  Jaka  - 08/4/15(火) 11:29 -

引用なし
パスワード
   ▼しげ さん:
>で「ファイルにこれ以上データがありません。」とエラーが出てしまいます。
>原因がわからないのですが、どなたか教えていただけませんでしょうか?

CSVファイルの1行辺りのカンマ数が同じでなかったり、
最終行で、改行がされているかされていないかではないかと思います。
ワードで開くと解りやすいかも、

データ
データ
  ←  この位置にカーソルがあるかないかの違い?

あるとまずかったのか良かったのか覚えてません。
すみません。

また、改行がVBCrLfでなく、VBLfだったり。
アクセスで作ったCSVファイルだと、inputで読み込むと
エラーになることがあったような気もします。

【55098】Re:ファイル読み込みができません。
発言  Yuki  - 08/4/15(火) 11:31 -

引用なし
パスワード
   ▼しげ さん:

こんにちは。
こうしたらどうでしょう。
勘違いしていたら失礼

dim vD as variant

    ' レコードを読み込む
    Line Input #intFF, vD
    vD = Split(vD, ",")
    ' 行を加算しA〜I列にレコード内容を表示
    Cells(GYO, 1).Resize(, UBound(vD) + 1).Value = vD
    GYO = GYO + 1

【55099】Re:ファイル読み込みができません。
発言  Jaka  - 08/4/15(火) 11:43 -

引用なし
パスワード
   >    ' レコードを読み込む
>    Line Input #intFF, vD
>    vD = Split(vD, ",")
えと、

Splitは、データがこんな場合を考慮にいれると、簡単に使わないほうが良いのでは?
と、私は思ってます。

"1,000","12,345","\5,100"

【55100】Re:ファイル読み込みができません。
発言  Yuki  - 08/4/15(火) 11:49 -

引用なし
パスワード
   ▼Jaka さん:
>
>Splitは、データがこんな場合を考慮にいれると、簡単に使わないほうが良いのでは?
>と、私は思ってます。
>
>"1,000","12,345","\5,100"

こういうデータがあるときは対処方法があります。
でも、csvファイルを作成す時の条件の中にカンマの中に
カンマを入れないとすることが条件の一つですね。

【55103】Re:ファイル読み込みができません。
質問  しげ  - 08/4/15(火) 13:00 -

引用なし
パスワード
   >Yuki さん
>Jaka さん
ありがとうございます。


書き方がいけないと思い、変えてみました。

  Dim intFF As Integer
  Dim textline As String
  Dim csvline() As String
  Dim Rowcnt As Integer
  Dim ColumNum As Integer '列数
  Dim i As Integer

  '空いているファイル番号を取得
  intFF = FreeFile
  'Me.SelectFileName のファイルをオープン
  Open Me.SelectFileName For Input As #intFF
  '表の行番号の初期化 1行目から読み込んだデータを入力
  Rowcnt = 1
  Do While Not EOF(intFF)   'ファイルの終端かどうかを確認
    '1行読み込みます
    Line Input #intFF, textline
    'ダブルクォーテーションを削除
    textline = Replace(textline, """", "")
    'カンマで分離
    csvline() = Split(textline, ",")
    '配列渡しでセルに代入
    Range(Cells(Rowcnt, 1), _
       Cells(Rowcnt, UBound(csvline()) + 1)) = csvline()
    Rowcnt = Rowcnt + 1
  Loop
  'ファイルを閉じる
  Close #intFF

前のようなエラーは出なくなりましたが、
取り込んだデータが文字化けする上、
A1のセルにしかデータが入らなくなりました。

書き方にこだわりはありませんので、CSVファイルを取り込む方法が
あったらぜひ教えていただきたいです。。

【55104】Re:ファイル読み込みができません。
発言  Yuki  - 08/4/15(火) 13:34 -

引用なし
パスワード
   ▼しげ さん:

>取り込んだデータが文字化けする上、
>A1のセルにしかデータが入らなくなりました。
本当にCSVファイルですか?
メモ帳でファイルを開いて , で区切られて目で見えるファイルですか。
もしそうでしたら
1〜2行ぐらい此処に貼り付けることは出来ませんか。

【55105】解決しました!
お礼  しげ  - 08/4/15(火) 14:08 -

引用なし
パスワード
   .csvとはなっていましたが、ファイルに問題があったようです。
もう一度ファイルを作り直したら問題なく動きました。

Yukiさん、そして皆さまありがとうございました。

【55121】Re:ファイル読み込みができません。
発言  VBWASURETA  - 08/4/16(水) 9:53 -

引用なし
パスワード
   皆さんおはようございます。

この辺りは色々試したので一応記載します。
確かに以下のデータの場合、Split関数を使用しない方が良いです。
で、詳しくは調べてはないですが過去にそのような区切りで
色々検証していたのですけど、
ExcelとAccessで作った場合以下の例どちらともに区切り判定するんですよ。
区切りのコードが違う?
何故判定できるのかが、わかれば結構CSVを扱う方には参考になりそうです。


文字列"無しCSV例:1,000, あああ, テスト,B
文字列"有りCSV例:1,000, "あああ", "テスト,B"

【55127】Re:ファイル読み込みができません。
発言  Jaka  - 08/4/16(水) 13:18 -

引用なし
パスワード
   意味がちょっと解りませんでしたが、

>文字列"有りCSV例:1,000, "あああ", "テスト,B"
の場合、Inputで読み込んでやれば、Wクォテーションが優先するので、
1 000 あああ テスト,B
と4つに分けて読み込んでくれます。

ただ、Inputの場合、固定長ファイルだと不具合が出る可能性があります。
半角スペースで穴埋めをした場合、inputだと、前後の半角スペースがTrimしたような感じで削られます。

【55129】Re:ファイル読み込みができません。
発言  VBWASURETA  - 08/4/16(水) 14:21 -

引用なし
パスワード
   ▼Jaka さん:

すみません簡単に書きすぎましたね^^;

もう少し詳細に書くとAccessのテーブルから以下のCSV形式2種類を
作ったとします。(Accessのテーブルよりエクスポート)

「"」無し形式
1,000, あああ, テスト,B

「"」有り形式
1,000, "あああ", "テスト,B"


で、それをエクセルで開くと

A列:1,000、B列:あああ、C列:テスト,B


と正しくExcelが3列に別けてくれます。

但し、そのCSVを手動で生成した場合、作る方法はWriteメソッドでも
何でも良いですが。

「"」無し形式
A列:1、B列:000、C列:あああ、D列:テスト、E列:B

5列で生成されます。


「"」有り形式
A列:1、B列:000、C列:あああ、D列:テスト,B

4列で生成されます。


という具合に本来の3列データが手動生成したCSVだと更に分割されるのですが、
エクスポートした形式のCSVでは3列で開くことができます。


このことを書いていたわけですが何が違うのか不明なんですよね・・・

4698 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free