ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Excel(エクセル)活用コミュのdatファイルの読込みと書き替え

  • mixiチェック
  • このエントリーをはてなブックマークに追加
csv読込みのトピと重複する部分があるのですが、やりたいことは以下の通りです。

拡張子がdatのファイルを拡張子指定して読込み
datファイルの保存場所はケースバイケース
スペース区切りで読込み

読み込むと以下のようになります

A B C D E
1 aaa 番号1 X座標値 Y座標値
2 Z座標値
3 aaa 番号2 X座標値 Y座標値
4 Z座標値
以下同じように番号3000ほど続く
(Max番号はファイルによって異なる)
aaaデータの後にbbbデータがきます

このZ座標値をEに移動させ、移動後空欄になった行(2,4)は削除

これを全てのaaaの番号に実行し、「読込みファイル名_new.dat」という名前で保存

以上をエクセルシート上に設定したボタン1つで完了させる

この内容で通じるでしょうか。
VBA初心者向けの本と格闘しましたが、???でした。ご教授願います。

コメント(34)

全く難しいところはないと思いますが、どこがわかりませんか?
>>[1]
全てです。

とりあえずマクロの記録をして、職場の類似マクロの文を参考に行列の指定や命令文を書き替えようと思ったのですが、
職場のマクロが行列ともに数字で書かれた文で、dim?がいっぱいだったので流用できる箇所がどこまでで書き替えるべき場所がどこなのかわからず
それを調べるために初心者向けの本とにらめっこしているうちに就業時間終了となりました。

なのでどこがわからないかと言われると、すみません、全てです…

職場はデータ持ち出し禁止、撮影禁止、我が家にエクセルがない為状況が説明できず、申し訳ありません。
>>[2]

VBAは全くわからないということですね。
作るのは簡単ですけど、できたものを見ても理解できないということであれば使えないですよね。

流れとしては
・もとのファイルを開く
・配列にデータを読み込む
・データを並べ替え、別の配列に書き込む
・新しいファイルとして書き出す
これだけなんですけど…
こういうテキストデータを
100 1 1.1 2.1
3.1
100 2 2.2 3.1
1.0
100 3 3.0 1.1
2.5
200 1 2.4 3.2
1.5
200 2 1.7 3.2
4.5

こう並べ替える
100 1 1.1 2.1 3.1
100 2 2.2 3.1 1.0
100 3 3.0 1.1 2.5
200 1 2.4 3.2 1.5
200 2 1.7 3.2 4.5

ということでいいですよね?
>>[5]
やりたいことはその通りです。

そしておっしゃる通りVBAは全くわかりません。職場にあるものを編集しますが、エクセルの書式変更によるVBAの行列値変更とかその程度で、文の作成はサッパリです。
(簡単な編集をしていたがためにこのマクロ作成もやってねとなりました)

今日も合間にチャレンジしましたが、データ読み込むならOpenfileを使うとして、そこにスペース区切りでという条件を追加するには…?となり

値の移動と削除を繰り返すならForかDoでループさせるのだろうけどどこまでという指定もわからず、変数?もよくわかりません。
この場合Z座標値のこと?でそれをどうすれば???
で時間切れでした。

ここに質問すればこのようなやりとりで私は何がわからなくて何からやればいいのかわかるかなと思って投稿しています。
>>[6]

>スペース区切りでという条件を追加するには…?となり

単純に1行目と2行目を1セットで読み込み、1行目の内容+スペース+2行目の内容で吐き出せばいいのでは?

>値の移動と削除を繰り返すならForかDoでループさせるのだろうけどどこまでという指定もわからず、変数?もよくわかりません。

「入力データが終了するまで」の条件でいいと思いますが。

なまじExcelで考えようとするからややこしくなるんじゃないでしょうか。
「入力データが終了するまで単純にデータを2行ずづ読み込み、1行目と2行目の内容を間に半角スペースを入れてそのまま出力する」で出来上がるでしょ。
>>[2]
多分、まだ構文も全くわからないという段階なのではと思います。
まずは初心者向けの本をはじめから順番に読んで、プログラム例を実行してみるのが良いかと思いますよ。
>>[7]

入力データが終了するまでデータを二行づつ読込み

一度全て読込んでから、ではないということですか?
二行づつ読込み修正していくということですか?

あと入力データが終了するまでだとちょっと困ります。修正したいのはaaaだけでbbbはそのままでよいです。

なので、5のミスキタさんの質問の回答は100は修正するけど200は修正しない、ということになります。
ミスキタさんの質問もちゃんとわかってなかったです、すみません。
>>[8]
そうなんですよね、最初は順番にやっていたのですがメインの仕事が進まなくなるので、かいつまんでやろうとしてこの有り様です。ジレンマです。
>>[10]
全部読まなくても、今回やりたいことなら変数のくだりとIF文、For文くらいでいいと思います。
あとはマクロの記録したりでなんとなく理解できると思うので。
>>[9]

まず。コメントもらったら、「ありがとうございます」が基本だと思いますが。


>一度全て読込んでから、ではないということですか?
>二行づつ読込み修正していくということですか?

Excelのシートを使わず、読み込んだデータをそのまま出力ファイルに吐き出せばいいでしょう。

>あと入力データが終了するまでだとちょっと困ります。
>修正したいのはaaaだけでbbbはそのままでよいです。

であれば、1行目の頭3文字が"aaa"かどうかを判定し、真なら1行目+半角スペース+2行目を1行として出力。
偽なら1行目と2行目をそのまま2行のデータとして出力。

で問題無いでしょう。終了条件は「入力データが終了するまで」でいいかと。
>>[11]
ありがとうございます!そこに絞ってやってみます。
>>[12]
すみません、読み解くのに必死すぎて抜けてました。ありがとうございます!

何度もすみませんが、
エクセルのシートを使わず、読み込んだデータをそのまま出力ファイルに吐き出す

とはどういうことでしょうか。エクセルのシートを使わずどこに読み込んでいるのでしょう…私がエクセルを使う方法しかわからないからピンとこないのでしょうか。

終了条件の件は理解しました!
>>[14]

>エクセルのシートを使わずどこに読み込んでいるのでしょう…
VBAの変数に読み込んで、そのまま吐き出します。

>私がエクセルを使う方法しかわからないからピンとこないのでしょうか。
でしょうね。

とりあえず動く形にすると

Public Sub テキストデータを一定条件で1行にまとめる()

Dim Filename_IN As Variant
Dim Filename_OUT As Variant
Filename_IN = Application.GetOpenFilename _
("datファイル (*.dat), *.dat", , "ファイルの選択", , False)
Filename_OUT = Dir(Filename_IN)

Open Filename_IN For Input As #1

Open Left$(Filename_OUT, Len(Filename_OUT) - 4) & "_new.dat" For Output As #99

Do While Not EOF(1)

Input #1, WK01$
Input #1, WK02$

If Left$(WK01$, 3) = "100" Then
Print #99, WK01$ & " " & WK02$
Else
Print #99, WK01$
Print #99, WK02$
End If

Loop

Close #1
Close #99

End Sub

中身が単純なので追っかければわかるでしょう。
昔々に作ったテキスト加工のVBAを修正してるので、いろいろアラがありますが。
テストデータにはコメント5のミスキタさんのデータを利用してます。(条件=100)


しかし、実務レベルで考えると、条件に応じて1行にまとまったデータと2行そのままのデータが出来上がるってのはありえないような気がしますが。

本当に
>修正したいのはaaaだけでbbbはそのままでよいです。
で合ってますか?
>>[15]
めちゃ早いですね、ありがとうございます。
作っていただいた中身は現在読みとき中ですのでコメントできませんが…

先にbbbの件について
aaaは座標値ですがbbbは座標値ではありません。四種の数字が並ぶことにかわりないのですがこちらは途中で改行されてなく一行でおさまっているのでaaaだけで大丈夫です。

むしろ何故aaaがZ座標値だけ改行されているのか謎で(座標値の桁数が多すぎる?)、datを作るソフトの性質っぽいのですが。
>>[12]
bbbは一行におさまっている

と回答したので、
偽なら二行のまま、ということはないですね。失礼しました。

残りは全てそのまま出力
でしょうか。

VBAの変数に読み込んでそのまま吐き出す
何となくイメージつきました。ありがとうございます。
でも構文だとよくわからないです。#99はどういうことでしょう?
>>[17]

前提条件が間違ってないかは、最初に必ず確認して下さい。
後で「そうじゃなかった」と言われると、全部ロジック見直しになります。

「これをこうしたい」って内容を完全に理解してますか?
そこがあやふやだと、誰が回答しても解決しませんよ。

ということで、書き直し。

Public Sub テキストデータを一定条件で1行にまとめる2()

Dim Filename_IN As Variant
Dim Filename_OUT As Variant
Filename_IN = Application.GetOpenFilename _
("datファイル (*.dat), *.dat", , "ファイルの選択", , False)
Filename_OUT = Dir(Filename_IN)

Open Filename_IN For Input As #1

Open Left$(Filename_OUT, Len(Filename_OUT) - 4) & "_new.dat" For Output As #99

Do While Not EOF(1)

Input #1, WK01$

If Left$(WK01$, 3) = "100" Then
Input #1, WK02$
Print #99, WK01$ & " " & WK02$
Else
Print #99, WK01$
End If

Loop

Close #1
Close #99

End Sub


#99は出力ファイルに紐づけている番号です。意味はありません。
今回入力ファイルが#1(Filename_IN)、出力ファイルが#99(Filename_OUT)です。
>>[18]
最初に提示すべき必要情報が少なかったですね。すみません。

修正ありがとうございます。

何となくしかわからない文について、花姉さんに教えていただいたように初心者本の例題をなぞることにします。

質問なんですが、最初考えていたエクセルで読み込む場合スペース区切りが〜と話しましたが、変数に読み込む場合はその処理は不要なんですよね?
>>[19]

>変数に読み込む場合はその処理は不要なんですよね?

今回は入力データをそのまま吐き出すので不要です。

例えばある条件の時(A列が100)にB列を加工(加減算等)する必要があれば、入力データを区切り文字で振り分け、加工後、元のフォーマットに編集して出力する必要があります。
>>[20]

今回は不要

理解しました。

必要な場合、読み込むファイルの選択が
("datファイル(*.dat),*.dat","ファイルの選択",Space:=true)
になるのでしょうか。自力でやろうとしていた時ココもよくわからなかったので気になっています。
>>[21]

>必要な場合、読み込むファイルの選択が
>("datファイル(*.dat),*.dat","ファイルの選択",Space:=true)
>になるのでしょうか。

なりません。
ここは入力ファイルの拡張子を選択しているだけです。

入力のファイル名が一意であれば、単純に
Filename_IN = ”入力データ.dat"
等の記述でいいのですが、マクロ実行時にファイル名を選択出来るようにここは記述しています。
実際にマクロを実行させると、拡張子が.datになっているファイルをダイアログで選択出来るようになってます。

スペースで区切り等をつけるのであれば、入力データのどこにスペースがあるかを逐次判定し分割する必要があります。
入力データの区切り文字がカンマであれば、input文で変数を羅列すれば各変数に入っていくので簡単に処理出来ますから、処理する前にExcelやテキストエディタ等でスペースをカンマに変える方がいいかもしれません。
横から失礼します。

スペース区切りで何か処理を行う必要があるなら、Split関数で分割、対象を加工後にJoin関数で結合で良いのではないでしょうか
>>[22]
入力データのどこにスペースがあるかを逐次判定し分割

思ってたより複雑でした…。
今回は必要ないので、まずは自分がやるべき中身を理解してから勉強することにします。ありがとうございます。
>>[23]

そのようにすれば少しは簡単…というかスマート?ということでしょうか。
今回は不要ですが他に応用できるかもと思うところがあるので、いずれ勉強したいです。
ありがとうございます。
最終的にはDATファイルを読み込んでシート上に展開するような気がするので、配列に読み込んでから操作したほうがいいような気がする。
>>[18]
本日試してみました。
ほぼそのままで書き替えできました。ありがとうございます。

が、元のdatファイルは一行に書き込める文字数が決まっているのか、座標値の桁数が多い箇所は一行におさまらず改行のままでした。

VBA関係なくエクセルに読み込んで、手動で直して吐き出すと一行におさまるのですが、今度はその吐き出したdatファイルをdatファイル用のソフトで開けませんでした。
エクセルで読むことで何か書式を変えてしまいダメなのかもしれません。

行直せるようにしてと頼まれ、それくらいならできるやろと思っていましたが、datファイル奥が深かったです。調査して出直します。
ご協力いただいたのに申し訳ありません。

私は大変勉強になりました。変数やっと意味がわかってきました…。ありがとうございました。
>>[26]
エクセルに読み込んで直したほうがよい、ということでしょうか。

27であげたようにエクセル使うとダメな部分があったのですが、どうしてダメなのか調査して直せるようにしたいです。
>>[27]

そのDATファイルはほぼ間違いなくテキストデータだと思いますので、一行に書き込める量に制限はありません。
メモ帳で開いて内容を確認してみてください。
>>[28]

> エクセルに読み込んで直したほうがよい、ということでしょうか。
違います。
最終的にはエクセルで解析等の作業をするのではないかと思ったのです。
なにか特定のソフトに読み込ませて利用するのですか?
>>[26]
>>[29] ミスキタさん
>>[30] ミスキタさん

横槍失礼。
DATファイルはテキストデータで制限が無くても、それを利用するソフトには仕様や制限があるのではありませんか?

>なにか特定のソフトに読み込ませて利用するのですか?

トピ主が27番のコメントで
>今度はその吐き出したdatファイルをdatファイル用のソフトで開けませんでした。

と書かれているので、そのデータをdatファイル用のソフトで再利用するってのは安易に想像出来ますが。

逆に
>最終的にはDATファイルを読み込んでシート上に展開するような気がするので、
>配列に読み込んでから操作したほうがいいような気がする。

>最終的にはエクセルで解析等の作業をするのではないかと思ったのです。

は、あなたの思い込みでしょう
>>[27]

ということで、DATファイルはテキストデータですが、利用しているソフトで仕様や制限があると思われます。

DATファイルが奥が深いというわけではなく、そのソフトの仕様に合わせてあげる必要があるということです。
>>[30]
エクセル以外のソフトで解析します。

datを扱える解析ソフトが4つあるのですが、ソフト1から吐き出したdatはソフト2を通さなければソフト3、4で読み込めません。
ソフト2でdatを読込み、なんの作業もせずdatを吐き出すという作業がわずらわしくて、マクロで直せるならそっちのほうが早いだろうというのが今回の狙いでした。

Z座標値の改行が問題というのがわかったのでそこに絞って対策しようとしたのですが他にも問題があったようで、調査が甘かったなと。
>>[32]
そうですね。
書き込み内容ばかりを気にしていました。ショックです。
また調査します。
ありがとうございます。

ログインすると、残り1件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Excel(エクセル)活用 更新情報

Excel(エクセル)活用のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。