[[20071210103832]] 『不要行を削除しながら新規エクセルファイルに取り』(maco) ページの最後に飛ぶ

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

 

『不要行を削除しながら新規エクセルファイルに取り込むマクロ』(maco)
 いつもお世話になっております。
 過去ログから似たような事例を見つけられなかったので、質問させていただきました。

 現在、ロジックアナライザソフトを使い、波形を調べる作業をしております。
 波形の変化点を求め、グラフを作成するために下記の流れを行っております。

 @ロジックアナライザの波形をCSVファイル形式で保存する
        ↓
 A行数が800万行を超えるため全てを読み込むことができないので、そのファイルを
   行抽出ソフトを使い、1〜50000行まで→50000〜100000まで→100000〜150000まで...
   というように小分けに抽出してエクセルファイルを作成してゆく。
                ↓
 B抽出されたファイルのシート1に、変化点を求める数式を入れ、変化点のない行は
  削除する。
        ↓
 C変化点の得られたデータを元にグラフを作成。

 この流れを1ファイルずつ手作業で行っていたのですが、
 マクロの自動記録を頼りに、BCの流れをマクロで作成してボタン型のオートシェイプ
 に登録し、ボタンを押せばグラフ作成まで自動で行うようにしました。

 これで問題はなかったのですが、この作業を更に簡潔にすべく課題が出されたのです
 が、私にはどうしても解決できずお手上げになってしまったので、どなたかお力添えを
 よろしくお願いします。

 <やりたいこと>
 上記ABCの流れをマクロで行いたい。
 Aの作業で、今までと違い抽出ソフトから抽出結果が新規ファイルに
 書き込まれる時点で不要行を削除しながら書き込んでいくようにしたい。
 (理由として、小分けに抽出した各ファイルから変化点を割り出し不要行を削除した
 結果、変化点の割り出された行の合計はエクセル仕様の65536行内で納まる
 程度だったため、抽出する時点で不要行を削除していけば1つのファイルで済むから)

 長々と説明文を書きましたが、表も書きます。
 抽出ソフトで抽出すると下記のように出てきます。

      A     B       C  D  E     F    G H I J 
 1 元ファイル名 \\490.. 開始行 1 終了行 50000 
 2     1           0        1   1   1      0    1 0 1 1   
 3     2           0        1   1   1      0    1 0 1 1 
 4     3           0        1   1   1      0    1 0 1 1 
 5     4           0        1   1   1      0    1 0 1 1 
 6     5           0        1   1   1      0    1 0 0 1
 .
 .
 ※1行目は列見出しではなく、抽出元のファイル名と抽出した行が記載されているだけ。

 このシートのL〜U列に変化点を求める数式を入れる。
(例 2行目のL〜U)
 L2:=IF(B2=B1,0,1)
 M2:=IF(C2=C1,0,1)
 N2:=IF(D2=D1,0,1)
 O2:=IF(E2=E1,0,1)
 P2:=IF(F2=F1,0,1)
 Q2:=IF(G2=G1,0,1)
 R2:=IF(H2=H1,0,1)
 S2:=IF(I2=I1,0,1)
 T2:=IF(J2=J1,0,1)
 U2:=IF(SUM(L2:T2)=0,"","*")
 ※変化点がある場合にはU列に「*」が表示されるようにしている。

 数式の参照元が1行内ですんでいれば、*があるかないかによってその行を削除して
 しまえるのですが、数式は1つ上の行を必要とするため、どのタイミングで削除したら
 よいのか、そのマクロの書き方もわからなくて・・・。

 力を貸していただきたい点をまとめると、
 ★抽出ソフトから新規エクセルファイルに行抽出しながら順序よく不要行を削除し、
  「*」の表示された行のみ残してゆくマクロを作りたい。 です。

 長文になってしまった上、説明の書き方がわかりづらかったらごめんなさい。
 よろしくお願いします。


 >抽出ソフトから新規エクセルファイルに行抽出しながら順序よく不要行を削除し、
 >「*」の表示された行のみ残してゆくマクロを作りたい。

 抽出ソフトに頼らず、削除もしないやり方(アイデアだけですが、、、、、)

 1.流れ
   CSV(オリジナル) → CSV(中間ファイル) → エクセル
  
    ※中間ファイルの作成を省略しても出来ると思いますが、エクセルへの書込は時間を食うので、
    中間ファイルを作った方が結局早いと思います。

 2.処理内容
  (1) CSVオリジナルの第1行を読んでCSV(中間ファイル)に書き込む
    CSVオリジナルの第2行を読む
    前行データと比較
    転換点があればCSV(中間ファイル)に書き込み、「書き込んだデータ」を前行データとして再認識
    次の行を読む
    繰り返し

  (2) 完成したCSV(中間ファイル)をエクセルで開くか、「データの取込み」を行う

  (半平太)

 上記 2-(1) を作ってみようとしたのですが、CSVのデータ構成が分かりません。

 ほとんどエクセルに示されたものと同じだとは思いますが、
 A列にある番号は、CSVにもデータとしてあるのですか?

 それとも抽出ソフトが自動的に出している(結局は要らない)ものですか?

 (半平太)

 > 力を貸していただきたい点をまとめると、
 ★抽出ソフトから新規エクセルファイルに行抽出しながら順序よく不要行を削除し、
  「*」の表示された行のみ残してゆくマクロを作りたい。 です。

 Sub test()
 Dim fn As String, txt As String, temp As String
 Dim b(), n As Long, i As Long, x
 ReDim b(1 To Rows.Count), 1 To 10)
 fn = "c:\test.test.csv"   '<- 実際のファイル名に変更
 delim = ","    '<- delimiter (区切り文字)
 Open fn For Input As #1
 Do While Not EOF(1)
     Line Input #1, txt
     x = Split(txt, delim)
     If temp = "" Then
         temp = Join(x,";")
         n = n + 1 
         For i = 0 To UBound(x) : b(n,i + 1) = x(i) : Next
     Else
         If temp <> Join(x,";") Then
             n = n + 1
             For i = 0 To UBound(x) : b(n,i + 1) = x(i) : Next
             temp = Join(x,";")
         End If
     End If
 Loop
 Close #1
 ThisWorkbook.Sheets(1).Range("a1").Resize(n,10).Value = b
 End Sub
 (seiya)

 半平太さん、seiyaさん、ありがとうございます!!
 しばらくこちらを見ることができず、返事を書くのが遅くなってしまい申し訳ありません。

 半平太さん
 >A列にある番号は、CSVにもデータとしてあるのですか?
   はい。CSVファイルにデータとしてあるものです。
     測定した波形は、-786432から7602175までの範囲内で上がり下がりしていて、
     ロジックアナライザをCSVで保存すると-786432の波形データが一行目、
   -786431のデータが二行目、-786430のデータが三行目…というように出ます。
   A列に出るデータは、このときの-786432,-786431,-786430にあたるものです。
   説明の仕方が足りなくてすみません><

 お二人のご協力を参考に、作成にとりかかります。
 取り急ぎの返事になってしまい、すみません。
                           (maco)


コメント返信:

[ 一覧(最新更新順) ]


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