Excel VBA質問箱 IV

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

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


6925 / 13644 ツリー ←次へ | 前へ→

【42149】CSV形式の取り込み ととろ 06/9/2(土) 20:53 質問[未読]
【42150】Re:CSV形式の取り込み Ned 06/9/2(土) 21:29 発言[未読]
【42164】Nedさんへ、シートを追加せずに、、、 ととろ 06/9/3(日) 11:09 質問[未読]
【42176】Re:Nedさんへ、シートを追加せずに、、、 Ned 06/9/3(日) 20:38 発言[未読]
【42292】Nedさんへ、シートを追加せずに、、、 ととろ 06/9/5(火) 18:07 お礼[未読]
【42151】Re:CSV形式の取り込み ichinose 06/9/2(土) 21:51 発言[未読]
【42152】Re:CSV形式の取り込み Ned 06/9/2(土) 22:06 発言[未読]
【42165】Re:CSV形式の取り込み ととろ 06/9/3(日) 11:37 お礼[未読]
【42154】Re:CSV形式の取り込み Hirofumi 06/9/2(土) 22:39 回答[未読]
【42196】CSV形式の取り込み ととろ 06/9/4(月) 0:58 お礼[未読]

【42149】CSV形式の取り込み
質問  ととろ  - 06/9/2(土) 20:53 -

引用なし
パスワード
   はじめまして、たまにこちらでお世話になってる者です。
以前どこかのサイトでCSV形式のデータを取り込む記述があったので、それをそのまま使用していたのですが最近調子よくありません。
ある行からずれが生じます。
A列に来るはずのものが最終列にきます。
取り込んだあとに自分が使用するために変数の宣言を追加しました。その際にデータ型を間違えて変えてしまった可能性もあるのですが、それが原因とも思えません。
何処が間違っているか教えてください。
もしこれ以外に取り込める記述があればそれでもかまいません。
個人的には下記のものがきにいっていましたが、、。

Option Explicit
--------------------------------------------------------------------------- Sub CSV取り込み()
  Dim MYy, MYm, MYd, FileType, Prompt As String
  Dim FileNamePath As Variant
  Dim csvline() As String
  Dim i, j, k, Mycnt, Rowcnt, ColumNum As Integer
  Dim ch1 As Long
  Dim Rng1, Rng2 As Range
  Dim Mydate As Date
  FileType = "CSV ファイル (*.csv),*.csv"
  Prompt = "CSV File を選択してください"
  '操作したいファイルのパスを取得します
  FileNamePath = SelectFileNamePath(FileType, Prompt)
  If FileNamePath = False Then  'キャンセルボタンが押された
  End
  End If
  '1行あたりの項目数を取得します
  ColumNum = GetItemNum(FileNamePath)
  'csvlineを1行あたりの項目数で再割り当てます
  ReDim csvline(1 To ColumNum)
  '空いているファイル番号を取得します
  ch1 = FreeFile
  'FileNamePath のファイルをオープンします
  Open FileNamePath For Input As #ch1
  'エラーが発生したらファイルを閉じます
  'CSVのファイルは1行の項目数が正確に合っていないと読めないのですが、
  '色々なCSVがあるようなので入れておきます
  On Error GoTo CloseFile
  '表の行番号の初期化 1行目から読み込んだデータを入力します
  Rowcnt = 1
  Do While Not EOF(ch1)         'ファイルの終端かどうかを確認します。
    For i = 1 To ColumNum
    Input #ch1, csvline(i)    '1行の項目数だけ読み込みます
    Next
    '配列渡しでセルに代入 この方が早い
    Range(Cells(Rowcnt, 1), Cells(Rowcnt, ColumNum)) = csvline()
    Rowcnt = Rowcnt + 1
  Loop
 Range("A1").CurrentRegion.Font.Size = 8
CloseFile:
  'ファイルを閉じます
  Close #ch1
--------------------------------------------------------------------------
  Function SelectFileNamePath(FileType, Prompt) As Variant
 SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt)
End Function
--------------------------------------------------------------------------- Function GetItemNum(FileNamePath) As Integer
  Dim ch1 As Long
  Dim textline As String
  
  '空いているファイル番号を取得します
  ch1 = FreeFile
  
  'FileNamePath のファイルをオープンします
  Open FileNamePath For Input As #ch1

  Line Input #ch1, textline    '1行だけ読み込みます。
  
  Close #ch1
  
  GetItemNum = 1
  '1行中のカンマの数を数えます
  Do
    GetItemNum = GetItemNum + 1
    textline = Mid(textline, InStr(textline, ",") + 1)
  Loop Until InStr(textline, ",") = 0
  
End Function

【42150】Re:CSV形式の取り込み
発言  Ned  - 06/9/2(土) 21:29 -

引用なし
パスワード
   ▼ととろ さん:
こんにちは。
>もしこれ以外に取り込める記述があればそれでもかまいません。
...について。私は概ねこんな感じのを良く使います。

Sub sample()
  Dim fName
  fName = Application.GetOpenFilename("CSV ファイル (*.csv),*.csv")
  If VarType(fName) = vbBoolean Then Exit Sub
  With Sheets.Add
    With .QueryTables.Add( _
        Connection:="TEXT;" & fName, _
          Destination:=.Range("A1"))
      .RefreshStyle = xlOverwriteCells
      .AdjustColumnWidth = False
      .TextFileCommaDelimiter = True
      .Refresh False
      .Parent.Names(.Name).Delete
      .Delete
    End With
  End With
End Sub

[外部データの取り込み]-[テキストファイルのインポート]を
マクロ記録されてみてはどうでしょうか。

【42151】Re:CSV形式の取り込み
発言  ichinose  - 06/9/2(土) 21:51 -

引用なし
パスワード
   こんばんは。
提示されたコードを理解されていないなら
Nedさんのサンプルが良いと思います(マクロの記録で大筋のコードを作ってくれるので)が、
うまくいかない原因を探るつもりがあるのなら・・・、


>以前どこかのサイトでCSV形式のデータを取り込む記述があったので、それをそのまま使用していたのですが最近調子よくありません。

ということは正常に作動していたということですね?

つまり、Csvファイルのデータの内容によって
正常に作動したり、しなかったりするということですよね!!

ならば、正常に作動するCSVファイルのデータ例(5行ぐらいでよいです)
うまく作動しないファイルのデータ例を記述しましょう!!

そうしないと誰もがうまくいかない事例を体験できません!!

>ある行からずれが生じます。
>A列に来るはずのものが最終列にきます。

うまくいかないCSVファイルのデータには、

"(ダブルコーテーション)で囲っているようなデータがありませんか?
また、その中に「,」が使われていませんか?

123、"ととろさん,ichinoseです",1212,123

↑こんなデータです。


ざっと、見た限り上記のようなデータがCSVファイルにあると
正しく作動しそうもありません。

代替案は貴重ですが、せっかくこんな事例にめぐり合えたのに
何故を残しておくのは、もったいないと思いますが・・・。

検討してみてください。

【42152】Re:CSV形式の取り込み
発言  Ned  - 06/9/2(土) 22:06 -

引用なし
パスワード
   ▼ichinose さん:
こんにちは。
>うまくいかない原因を探るつもりがあるのなら・・・、
空白行があったり、列数が違うデータが途中にあったりするとずれるようですね。
1行だけ読み込んでカンマの数で取得用の配列のサイズを固定してますから...

【42154】Re:CSV形式の取り込み
回答  Hirofumi  - 06/9/2(土) 22:39 -

引用なし
パスワード
   [#41872] Re:csvファイルにて 
 
  Hirofumi - 06/8/24(木) 19:08 - 

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=41872;id=excel

でCsvファイルの読み込みコードをUpしています

【42164】Nedさんへ、シートを追加せずに、、、
質問  ととろ  - 06/9/3(日) 11:09 -

引用なし
パスワード
   適切なアドバイスをいただき、ありがとうございます。
ただ現時点での私のスキルでは下記の記述も何となくしか分りません。
そこでもう一つ質問したのですが、
あらかじめ用意されたシートに取り込む記述を知りたいです。

二度手間で申し訳ありません。

【42165】Re:CSV形式の取り込み
お礼  ととろ  - 06/9/3(日) 11:37 -

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

アドバイスありがとうございます。

自分が記述したのを私自身があまり理解していないまま利用していた
のが問題だと思います。
ただ今の自分ではそれを理解するのは難しいところがあります。

たしか同じ列でデータの種類が違う場合でも問題なく取り込めるよう記述だという
説明がありました。

取り込むCSVは問題ないようですが、私は同じシートにいろんデータを上書き状態
で取り込んでるのでそれが問題だったのでしょうか。

Nedさんの記述は何とか分りそうなので、とりあえずそれを理解するようにします。

どうもありがとうございました。

【42176】Re:Nedさんへ、シートを追加せずに、、、
発言  Ned  - 06/9/3(日) 20:38 -

引用なし
パスワード
   ▼ととろ さん:
こんにちは。
>With Sheets.Add

With Sheets("sheet1")
などにすればいいだけなのですが...

以下、今後の参考と、あくまで私見ですが、書いておきます。
>マクロ記録
と書いたように、ある程度自分でも工夫できると思うのです。
1)マクロの自動記録
2)VisualBasicEditorでの[F8]キーでの1ステップずつの実行。
3)同じくVBEでコード上にマウスキャレットをあてて[F1]キー。状況依存Help。
4)変数がある場合は[ローカルウィンドウ]を表示させて変数をチェック。
5)google検索。
特にExcelVBAに関しては、上記5項目を駆使すれば、
Q&A掲示板の半分の質問は自己解決できる内容だと考えています。
失敗してもいいじゃないですか。
まずは『自分でいろいろと試してみる』事です^ ^

【42196】CSV形式の取り込み
お礼  ととろ  - 06/9/4(月) 0:58 -

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

>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=41872;id=excel

正直、俺にとってはここのはレベル高いです。
でもわざわざ教えていただきありがとうございます。
仕事ではほとんど使わないので独学(趣味のため)ですがこれからもがんばります。

【42292】Nedさんへ、シートを追加せずに、、、
お礼  ととろ  - 06/9/5(火) 18:07 -

引用なし
パスワード
   Ned さんへ

お返事が遅くなりまして申し訳ありません。

私のVBAのレベルが低いことが判明してしまいました。
おっしゃる通りで自分で判明できるものは多いかもしれません。
苦手意識が分るはずのものまで分らないと思わせるのでしょうか。
なにぶん独学の上に今は仕事でも使用することがなく、趣味のために
勉強してるだけですので月に何度か必要な時に専門書を見たりするだけです。

これからは身に付けることをもう少し意識し勉強していきたいと思います。

いろいろとためになるアドバイスを頂きありがとうございました。

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