Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
ファイルの結合
投稿日時: 21/05/08 15:37:24
投稿者: masawa
メールを送信

こんにちは。
VBA初心者です。リストボックスに表示されたテキストファイルを結合し一つのテキストファイルにしたいのですが方法が分かりません。また、結合する時、TEST2.txtにある変数を、TEST1.txtの所定の場所に代入するというような結合の仕方です。何方か教えて頂ければ幸いです。
 
TEST1.txt
$A
1234
$B
5678
$C
9101112
 
TEST2.txt
(SDFG)
(AAA,BBBB,CCCCC)
123456
789610
1818122
98714123
 
$AのところにAAAが、$BのところにBBBBが、$CのところにCCCCCが入るような繋ぎかたです。
よろしくお願い致します。

回答
投稿日時: 21/05/08 16:39:56
投稿者: simple

ルールがよく分かりませんねえ。
まずそのケースでは、どういう結果が得たいのですか?
 
両者の変数?の対応関係はどういうルールですか?
変数AAAの値はどれですか?
 
もう少し丁寧に説明ください。

投稿日時: 21/05/08 17:01:17
投稿者: masawa
メールを送信

メール有難うございます。
結果ですが、以下のようになればと思います。
 
AAA
1234
BBBB
5678
CCCCC
9101112
(SDFG)
(AAA,BBBB,CCCCC)
123456
789610
1818122
98714123
 
です。
よろしくお願い致します。

回答
投稿日時: 21/05/08 17:24:42
投稿者: simple

ご返事ありがとうございました。
 
考え方としては、
・テキストファイルを開き、同時に書き込み用のファイルも開いておきます。
・一行読んでは、それを書き込み用ファイルに書き込みます。
 これを繰り返せばよいわけです。
 
テキストファイルの読み書きについては、以下のサイトが参考になるでしょう。
http://officetanaka.net/excel/vba/file/file08b.htm
http://officetanaka.net/excel/vba/file/file08c.htm
 
基本的には以上で尽きています。
まずはご自分でトライしてください。
そのうえで詰まったところを具体的に質問してください。
ここは、リクエストしてコードを受け取るところではないんです。
 
なお、
$A とAAA
$B とBBBB
$C とCCCCC
が対応しているというのは、どこかに情報として持っているんですか?
 
それとも同じアルファベットで始まるものが対応するんですか?
その辺のルールを明確にしてください、と申し上げています。
 
その3つしかないなら手作業で修正したほうが早い。
 
いや、それは単なる例示というなら、
貴方の頭にあるルールを説明しないと、どの回答者もコメントできませんよ。

回答
投稿日時: 21/05/08 17:34:36
投稿者: simple

追記します。
 
VBAにこだわらず、"コマンドプロンプト"を使って、

COPY test1.txt + test2.txt  test3.txt
とすれば、
test1.txt と test2.txt を結合した test3.txtを作成してくれます。
 
これに変換の修正したほうがてっとり早いでしょう。

回答
投稿日時: 21/05/08 18:09:19
投稿者: simple

$がついたところが置き換えすべき個所はわかるが、
何に置換するのかが不明。
(SDFG)
はなぜ置換の候補にならないのか。

回答
投稿日時: 21/05/09 13:29:37
投稿者: simple

繰り返し発生するものであれば、議論を進めてマクロを作る意味があるでしょうが、
一時的なものなら手作業でやってしまったほうが早いです。
 
前者であれば、こんな方法ですね。
1.test2.txtを全文一括して文字列変数に読み込み、
2.この中から、置き換えるべき文字列を取得
  (仕様が提示されないので不明。何行目と固定なのか、カッコで囲まれた文字列ということなのか)
3.test1.txtを、一行ごとに読み込み、
  $で始まっていれば、2.で求めたものに置き換えたうえで、
  test3.txtに書き込む。
4.上記3.を繰り返して、test1をすべて処理する。
5. 1.で作成したものを最後にtest3.txtに書き込む
ということでしょう。
私はこれで区切りとします。

投稿日時: 21/05/10 08:44:35
投稿者: masawa
メールを送信

おはようございます。
貴重なアドバイス、本当にありがとうございました。
 
私の説明が分かり難いもので申し訳ありません。
実際にどのようにしたいかを具体的に書いてみます。
工作機械を動かすプログラムで、いくつかに分割されたプログラムを中間のプログラムを挿入して
一つのプログラムにするというものです。
以下は二つのプログラムを繋いでいます。
 
%
(69K-1104-F1.NCD)
( V55 )
(ATC,T15,H15,S6500)
M08
M97
G05P10000
G91
G00X8807Y10375
Z-115000
G40G01X2894Y6578
Z-150F100
G41D66X-2894Y6577F300
G05P0
%
(T TIME=001:54:26SEC)
 
%
(69K-1104-F2.NCD)
( V55 )
(ATC,T13,H13,S6500)
M08
M97
G05P10000
G91
G00X8807Y10375
Z-115000
G41D85X-2894Y6577
G03X-4606Y-6577I2394J-6577
I7500
X4606Y-6578I7000
G03X-4606Y-6577I2394J-6577
G05P0
%
(T TIME=001:54:00SEC)
 
先頭部、中間部、最後の三つのプログラムを挿入して一つにします。
 
先頭部
$T
M06
$N
G90G00$GX0Y0
G43$HZ0
M03$S
$M
$M97
G91
 
中間部
G91
M09
M05
G28Z0
G49
M06
$N
G90G00$GX0Y0
G43$HZ0
M03$S
$M
$M97
G91
 
最後
G91
M09
M05
G28Z0
G49
G28X0Y0
M30
 
結果
%
(69K-1104-F1.NCD)
( V55 )
(ATC,T15,H15,S6500)
T15
M06
T13
G90G00G54X0Y0
G43H15Z0
M03S6500
G91
M08
M97
G05P10000
G91
G00X8807Y10375
Z-115000
G40G01X2894Y6578
Z-150F100
G41D66X-2894Y6577F300
G05P0
(T TIME=001:54:26SEC)
(69K-1104-F2.NCD)
( V55 )
(ATC,T13,H13,S6500)
G91
M09
M05
G28Z0
G49
M06
T99
G90G00G54X0Y0
G43H13Z0
M03S6500
G91
M08
M97
G05P10000
G91
G00X8807Y10375
Z-115000
G41D85X-2894Y6577
G03X-4606Y-6577I2394J-6577
I7500
X4606Y-6578I7000
G03X-4606Y-6577I2394J-6577
G05P0
(T TIME=001:54:00SEC)
G91
M09
M05
G28Z0
G49
G28X0Y0
M30
%
 
というようなものです。
現在はソフトメーカーに作らせたアプリで運用していますが
汎用性が悪いため社内でソフトを作れないかトライしているところです。
小規模の会社のため、専門部署がありません。また知識のある人間もいませんので
自分たちで何とかしようと思っているのですが、なかなかうまくいきません。
差し支えなければもう少し教えてください。
よろしくお願い致します。

回答
投稿日時: 21/05/10 09:38:11
投稿者: WinArrow
投稿者のウェブサイトに移動

>現在はソフトメーカーに作らせたアプリで運用しています
工作機械を動かすプログラムに関しては、
回答者は、もっと素人です。
ソフトメーカに希望を説明して、相談したほうがよいと思います。

投稿日時: 21/05/10 09:44:08
投稿者: masawa
メールを送信

有難うございました。
 
よろしくお願い致します。

回答
投稿日時: 21/05/10 12:23:15
投稿者: simple

私も同感です。
こちらはド素人ですから、NCのなんたるかもまるで分かっていません。
また、仮に今回のものが解決できたとしても、それで終わる話ではないので、
きちんとした組織的対応を検討する必要があるでしょう。
 
さて、どうやら$がついた変数を、予め定めた文字列で置き換える話ですが、
今回提示されたケースについて、
回答者、閲覧者の理解が進むように、
$がついたすべてのもの(例ではなく、すべてです)について、
・その置き換える内容
・それがどこで定義されているか
を漏れなく、一覧として纏めてもらえませんか?
 
そうすれば、皆さんからコメントが寄せられる可能性が高まります。

投稿日時: 21/05/10 15:00:06
投稿者: masawa
メールを送信

メール有難うございます。
そうですね。
見てもよく分からないですね。
 
変数     意味     接続するファイルのコメント部
$T    一番最初の工具番号     69K-1104-F1.NCD
                                   (ATC,T15,H15,S6500)
 
$N    次のPGで使う工具番号 69K-1104-F2.NCD    
                                   (ATC,T13,H13,S6500)
 
$G    ワーク座標系     コメントの中には無く、UserForm1
                                   のコンボボックスで指示される
 
$H    このPGで使用する 69K-1104-F1.NCD
        工具長補正番号 (ATC,T15,H15,S6500)
 
$S    このPGで使用する 69K-1104-F1.NCD
        主軸回転数 (ATC,T15,H15,S6500)
 
$M    このPGで使用する
        クーラント(切削油)オン M08あるいはM07
 
$M97    天井シャワーオン     M08とM97はセットで出力
                                   M07の場合はM97は出力せず
        
                      中間部        
変数     意味     接続するファイルのコメント部
$N    次で使用する工具の番号
        次のPGがない場合はT99
        を選択。
    
$G    ワーク座標系     コメントの中には無く、UserForm1
                                   のコンボボックスで指示される
 
$H    このPGで使用する 69K-1104-F2.NCD
        工具長補正番号 (ATC,T13,H13,S6500)
 
$S    このPGで使用する 69K-1104-F2.NCD
        主軸回転数 (ATC,T13,H13,S6500)
 
$M    このPGで使用する
        クーラント(切削油)オン M08あるいはM07
 
$M97    天井シャワーオン     M08とM97はセットで出力
                                   M07の場合はM97は出力せず
 
 
             

回答
投稿日時: 21/05/10 15:29:21
投稿者: simple

何に置換されているかの情報が無いので、不完全ですね。
 
$T は、T15に補間されていて、これは、
同じアルファベットで始まる T15 と想像つきますが、
 
T13に補間されている$N は、どういう理屈で、
69K-1104-F2.NCD の (ATC,T13,H13,S6500)の T13 と
紐付くのですか。ぶっ飛んでいませんか?
 
基本的な話として、
挿入する先頭部、中間部、最後などのファイル名は
指定する必要がありますが、
それが
69K-1104-F1.NCD
69K-1104-F2.NCD
ということなんですか?
最後の部品には指定は要らないのですか?
 
>見てもよく分からないですね。
それを他人にやらせようとしていますよね。
 
まだまだルールを明らかにしていかないとコードには落とせません。
そちらで、完全なものが出来てからにして下さい。
こちらが質問して話をドライブしていく義務も何もありません。
 
こういう基本的なことも説明されないということは、
何もトライされていない、ということなんでしょうか?
少なくともトライしてから、困っているところだけを
具体的に質問されたほうがよいのではないですか?
 
暫くROMに回ります。

投稿日時: 21/05/10 15:41:42
投稿者: masawa
メールを送信

返信ありがとうございました。
トライしてみます。
有難うございました。