アプリ版:「スタンプのみでお礼する」機能のリリースについて

特定のファイル名が "normal-item-stock" を含むCSVのセル内に改行があるため、一気にexcelに取り込みすると、データがぐちゃぐちゃになります。

特定のファイル名が "normal-item-stock" を含むCSVファイルから1列目のデータをExcelのshoplistというシートのA列に取り込み、75列目をB列、82列目をC列に取り込みたいです。

Dim ws As Worksheet
Dim SelFile As Variant

SelFile = Dir(ThisWorkbook.Path & "\" & "normal-item-stock*.csv")

Set ws = Worksheets("shoplist") ' CSV のデータを取り込むシート

「特定文字を入ってるCSVの特定の列を特定」の質問画像

質問者からの補足コメント

  • 回答ありがとうございました。A1、B1、C1は正しいデータを取りこめましたが。D1からがわけわからないです。CSVを1列ごとをA列に 75列ごとをB列に、82列ごとをC列にしたいです。お願いします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/11/28 10:30

A 回答 (3件)

こんにちは



>一気にexcelに取り込みすると、データがぐちゃぐちゃになります
どのような読み方をなさっているのか不明ですが、普通に直接エクセルで読み込んだ場合の話と解釈しました。

エクセルで読めるタイプのルールのCSVであれば、セル内改行があっても問題なく読み込めるはずですので、ご質問のCSVファイルは異なるルールで記述されているものと推測されます。
どのようなルールで記述されているのかはご質問文からは不明なので、具体的な方法を記すことはできませんけれど、記述ルールを調べることで解決できるのではと思います。
文字化けはしていないようですから(=言及されていないので)、文字コードはShift-JIS等であると思いますが、そちらも念のためご確認を。

ちなみに、「エクセルで読めるタイプのルール」とは、
基本的に、セル区切りは(CSVなので)カンマ、改行(=次の行)はCrLfになっているはずです。
エクセル上でのセル内改行はLfコードで、CSVでの記述も同様です。
また、セル内改行を含むセルデータは全体をダブルクォーテーションで囲っておく必要があります。
カンマを含む文字列等も(当然ですが)クォーテーションで囲います。

この辺りの記述ルールが異なると、まとめて読み込ませた場合に別の解釈をされる可能性があり、結果として表示が乱れることになると考えられます。
そのような場合でも、TextStream等で読み込んで、そのルールに即した解釈をすれば処理は可能だと思われます。

まずは、以下あたりを中心に対象のCSVを調べてみれば、どのように対処すれば良いかがわかるでしょう。
 ・改行コードには何が使用されているか
 ・セル内改行のコードには何が使用されているか
 ・セル内改行を含む文字列はダブルクォーテーションで囲われているか
など。
(対象のCSVをテキストファイルとして開けば、だいたいはわかるでしょう)
解釈の方法がわかれば、文字コードを置換えるなり、あるいはそれに応じた読み込み方をすることで解決するものと想像します。
    • good
    • 0

でやってみてください。


Sub ImportCSVData()
Dim ws As Worksheet
Dim SelFile As Variant
Dim filePath As String
Dim rowNum As Long

' 対象のシートを設定
Set ws = Worksheets("shoplist")

' CSVファイルを選択
SelFile = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv", Title:="CSVファイルを選択")

' キャンセルされた場合は処理終了
If SelFile = "False" Then
Exit Sub
End If

' ファイルパスを取得
filePath = SelFile

' CSVファイルからデータを取り込む
With ws
' 列Aに1列目のデータを取り込む
.Columns("A").ClearContents
With .QueryTables.Add(Connection:="TEXT;" & filePath, Destination:=.Range("A1"))
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileCommaDelimiter = True
.Refresh
End With

' 列Bに75列目のデータを取り込む
.Columns("B").ClearContents
For rowNum = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
.Cells(rowNum, 2).Value = .Cells(rowNum, 75).Value
Next rowNum

' 列Cに82列目のデータを取り込む
.Columns("C").ClearContents
For rowNum = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
.Cells(rowNum, 3).Value = .Cells(rowNum, 82).Value
Next rowNum
End With
End Sub
この回答への補足あり
    • good
    • 1

スマートな方法は他にもあると思いますが、CSVをテキストファイルとして取り込み、エクセルのデータの区切り位置をカンマ指定しながら、指定のエリアを「文字列」に設定した後、必要な部分のみ残せば、まずは第一弾のデータが出来るんじゃないでしょうか。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A