[[20230309190422]] 『csv データ整理』(かたじん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『csv データ整理』(かたじん)

10行2列で一つのブロックのデータが何行も連なっております。
時刻歴のグラフを作成したいので、要素毎にデータを整理したいです。

具体的には元データ
CASE NO . = 1
要素1 150
要素2 140
要素3 135
要素4 165
要素5 132
要素6 150
要素7 120
要素8 220
要素9 180
要素10 150
TOTAL 160
CASE NO . = 2
要素1 151
要素2 141
要素3 136
要素4 166
要素5 133
要素6 151
要素7 121
要素8 221
要素9 181
要素10 151
TOTAL 161
… …

整理後
CASE NO . = 要素1 要素2 要素3 要素4 要素5 要素6 要素7 要素8 要素9 要素10
1 150 140 135 165 132 50 120 220 180 150
2 151 140 135 165 132 50 120 220 180 150

以上の様に整理したいです。
Caseは600ほど、要素数は4-10の間で変わります。
VBAで何とかならないでしょうか。Powerqueryで対応しても大丈夫です。
何卒よろしくお願いいたします。

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


    Sub 想像で()
        Const CSV_NAME = "C:\xxx\20230309.csv"
        Dim h As Range, a As Range, l As String, v, r(0 To 10) As Variant, i As Long
        Set h = [A1].Resize(, 11)
        h.Value = [{"CASE NO","要素1","要素2","要素3","要素4","要素5","要素6","要素7","要素8","要素9","要素10"}]
        Set a = h
        With CreateObject("Scripting.FileSystemObject").OpenTextFile(CSV_NAME)
            Do Until .AtEndOfStream
                l = .ReadLine
                If l Like "CASE NO*" Then
                    If r(0) Then a.Value = r
                    Erase r
                    Set a = a.Offset(1)
                    v = Split(l, "=")
                    r(0) = CLng(v(1))
                ElseIf Not l Like "TOTAL*" Then
                    v = Split(l)
                    For i = 1 To 10
                        If v(0) = h.Cells(1, i + 1).Value Then Exit For
                    Next
                    If i > 0 And i < 11 Then r(i) = v(1)
                End If
            Loop
            .Close
        End With
    End Sub

(白茶) 2023/03/09(木) 20:04:23


 ていうか、中味が全然csvじゃないという... ^^;

(白茶) 2023/03/09(木) 20:06:15


白茶様

コメントありがとうございます。
回したところ、
r(0) = CLng(v(1))
の位置でエラーが出ます。
型が一致しないとのことなので、
vをVariantで定義しなおしましたが、同じ症状が出てしまいます。
(かたじん) 2023/03/10(金) 13:43:01


 これ、差分で元の書き込み確認したら=と数字の間タブになってるけども実際のデータもスペースではなくタブになっているんだろうか?
(ねむねむ) 2023/03/10(金) 13:56:29

 あー、すんません。レス見落としてましたwww
 まぁ何で分割するかくらいは、ご自分でご判断頂けると思いますので、私からは↓だけ。

VBA関数:指定文字で分割して配列にする(Split) | Excel作業をVBAで効率化
https://vbabeginner.net/split/

(白茶) 2023/03/10(金) 23:19:05


 横から失礼します。
 (1)提示のデータはExcelに読み込んだあとですか?
    A列         B列
    CASE NO . =   1
    要素1       150
    要素2       140
    要素3       135
    と正確に列の位置を示したほうがよいと思う。
 (2)元のファイル形式は何でしょうか。文字通りのカンマ区切りなら、
   CASE NO . =,1
   要素1,150
   要素2,140
   ですか?それともタブ区切りデータなら、そのように書いてください。

 (3)提示いただいたコードについては、区切り文字を明確にして、
   Split関数のところをそれに沿ったものに変更する必要があります。
   また、最後のブロックの書き出しを追加したほうがよいと思います。

   なお、元のファイルがSHIFT-JISなのか、UTF-8なのかによってファイル読み込みが変わってきます。
   もしUTF-8なら下記が参考になるでしょう。
   http://officetanaka.net/excel/vba/file/file10.htm

 (4)提示のものがシートに既にあり、それを出発点にするなら、
   ピボットテーブルを使うのもアリかと思います。
   A列にNo列を挿入し、簡単な式でNoを設定できます。
   (CASE NO . =が現れる都度、Noを更新する処理を入れるだけです。)
   あとは、ピボットテーブルの基本的処理で求める表が作れます。
   もちろんVBAにすることもできるでしょう。
  
(γ) 2023/03/11(土) 06:55:31

皆様コメントありがとうございます。
確認遅れまして申し訳ありません。

白茶様 CASE NOをフックにしてブロックを分割しているのですね、
参照先確認しまして、split関数の意味が少し理解出来ました。
ありがとうございます。

ねむねむ様、γ様 (1) 提示データはエクセルでカンマ区切りで開いた後のものになります。
掲示板での質問の仕方が不確かなもので申し訳ありません。

(2)カンマ区切りです。

(3)最後のブロックはTOTALのことでしょうか。
不要なので飛ばしていただければ幸いです。
形式はUTF-8です。

(4)ピボットテーブルにてNoの列を追加
"CASE NO"をcountifしていく関数をセルに追記する形でよろしいでしょうか。
(かたじん) 2023/03/16(木) 19:39:58


 | (3)最後のブロックはTOTALのことでしょうか。
 | 不要なので飛ばしていただければ幸いです。
 CSVを直接コードで操作しない方針であれば不要の議論ですが、
 念のため当方の趣旨だけを以下に書いておきます。
 提示されたコードは、CASE NOがあったときに、それまでに保持していたものを書き出す実装なので、
 最後の10個のデータはCASE NOに出会わないので書き出される機会を失っていますね、という指摘でした。

 CSVを読み込む段階で処理するのではなく、読み込む部分は現行どおりで、
 そのあとに操作する方針だということですね。

 それなら、繰り返しになりますが、ピボットテーブルがよいかと思います。
 | "CASE NO"をcountifしていく関数をセルに追記する形でよろしいでしょうか。
 (私は計算量のもっと少ない別の方法を考えていましたが、
  特にこだわりはなく、その方式でよいと思います)
  
(γ) 2023/03/16(木) 20:35:45

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.