Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


717 / 13645 ツリー ←次へ | 前へ→

【78760】エクセルの指定セルをテキストデータに書き出したい かわかみまめお 17/1/16(月) 21:02 質問[未読]
【78761】Re:エクセルの指定セルをテキストデータに... γ 17/1/17(火) 7:29 発言[未読]
【78764】Re:エクセルの指定セルをテキストデータに... かわかみまめお 17/1/17(火) 19:18 発言[未読]
【78772】Re:エクセルの指定セルをテキストデータに... かわかみまめお 17/1/23(月) 1:10 質問[未読]
【78774】Re:エクセルの指定セルをテキストデータに... γ 17/1/23(月) 7:09 回答[未読]
【78791】Re:エクセルの指定セルをテキストデータに... γ 17/1/24(火) 7:09 回答[未読]
【78792】Re:エクセルの指定セルをテキストデータに... かわかみまめお 17/1/25(水) 0:56 お礼[未読]
【78762】Re:エクセルの指定セルをテキストデータに... β 17/1/17(火) 9:41 発言[未読]
【78763】Re:エクセルの指定セルをテキストデータに... β 17/1/17(火) 9:53 発言[未読]
【78765】Re:エクセルの指定セルをテキストデータに... かわかみまめお 17/1/17(火) 19:20 発言[未読]
【78773】Re:エクセルの指定セルをテキストデータに... かわかみまめお 17/1/23(月) 1:13 質問[未読]

【78760】エクセルの指定セルをテキストデータに書...
質問  かわかみまめお  - 17/1/16(月) 21:02 -

引用なし
パスワード
   お世話になっております。
かわかみまめおと申します。

1. 下記のようなエクセルファイル(A)があったとします。
      A    B      
 1   文字  文字(3行)  
  2   文字  文字(3行) 

2.選択した範囲の一番左上をファイル名として、テキストファイルに書き出すコードとして、WEBで調べていたら、下記のコードを書いてる方がいらっしゃいました。

======
Sub selection_save_txt()
'
'選択範囲の左上のセルの値をファイル名にして、選択範囲をTXTとして出力する
'保存先はカレントフォルダ
'

Dim i, j As Integer
Dim d, SaveD As String
Dim start_row, start_column, end_row, rows_count, columns_count, end_column As Long
Dim File_name As Variant

'範囲を調べる
  start_row = Selection.Row                '開始行
  start_column = Selection.Column             '開始列
  end_row = start_row + Selection.Rows.Count - 1     '終了行
  end_column = start_column + Selection.Columns.Count - 1 '終了列
  rows_count = Selection.Rows.Count            '範囲行数
  columns_count = Selection.Columns.Count         '範囲列数
  
'左上のセルの値をファイル名にする
  File_name = Cells(Selection.Row, Selection.Column).Value
   
   
'ファイルの読み込みと出力
  Open File_name & "_j.txt" For Output As #1
  
  For i = start_row To start_row + Selection.Rows.Count - 1
    For j = start_column To end_column
      d = Cells(i, j)
      SaveD = SaveD & d & vbTab   '1列ごとにTABコード追加
      'Debug.Print SaveD
    Next j
    SaveD = SaveD & vbCrLf       '1行ごとに改行を追加
  Next i
  
  Print #1, SaveD
  Close #1
End Sub

===================

3.ご教示頂きたいこと

(1)上記のFor 以下の記述において、
■SaveD = SaveD & d & vbTab 
■SaveD = SaveD & vbCrLf 
の構文(?)の意味がよくわかりませんでした。
(変数とセルとタブを&でつなげる?)

また、最後に、
■Print #1, SaveD
とありますが、printは記入することだと調べました。
ループして最後にprintするのでしょうか。1つのセルごとにprintする必要があるのではないのか、と思いました。

なぜ、これで、上手に動作するのか理解できませんでした。
どなたかご教示頂けないでしょうか。


(2)なお、B1のセルは、セル内での改行を利用しており、テキストファイルにおいても、行が分かれるようにしたいのですが、いかがすればよろしいでしょうか。

御教示どうぞよろしくお願いいたします。

【78761】Re:エクセルの指定セルをテキストデータ...
発言  γ  - 17/1/17(火) 7:29 -

引用なし
パスワード
   うーん、
SaveDという文字列変数に
・一行の中の各セルの値を、タブ記号を挟んで連結し、
・行と行の間は改行記号を挟んで連結
しておき、それをまとめてファイルに書き込んでいるわけで、
どのあたりが不明ですか?

タブ記号というのが何かは分かりますか。

「改行」というのがある種の動作とイメージされているのに、
「単に改行記号という文字を連結することである」といった
あたりが理解しにくいのかなあ。

ステップ実行というのは知っていますか?
一行毎に実行して、SaveDにどんな値がセットされるかを
ローカルウインドウで確認してみると実感が湧くと思います。

> ループして最後にprintするのでしょうか。
> 1つのセルごとにprintする必要があるのではないのか、と思いました。
なぜ纏めて書き込むとまずいのでしょうか?
セル毎に書き込むこともできるのでしょうが、
そうしないといけないわけでもありません。

-----------------------
(2)は、
いったん、表示上の一行単位で、
一セルを複数行に分割していくとよいのでしょう。

ただし、あくまで例のようで、
コードを出しても、いやいや実際はこうです、
ということになりそうなので、少し待ちます。
まずは、最初の点に取り組むことから初めて下さい。
それが出来ない限り、二つの目のテーマに取り組んでも無駄ですから。

# 日中はアクセスしませんので、返事を頂いても反応は夜以降になります。

【78762】Re:エクセルの指定セルをテキストデータ...
発言  β  - 17/1/17(火) 9:41 -

引用なし
パスワード
   ▼かわかみまめお さん:

γさんからポイントをついたレスがでていますので蛇足です。

●まず、作成したいテキストファイルなんですが、

 ・単に各列のセルの値を単純につなげたものを1行として扱う形のファイルですか?
 ・各列のセルの項目間にタブを挟んだものを1行にした形のファイルですか?

 アップされたコードで作成しているファイルは後者です。

 違いは、このファイルをエクセルからブックとして開いたときに

 前者は各セルの値が連結されて、すべて A列に表示されます。
 後者は各セルの値が各列に分かれて、いかにもエクセルブックらしく表示されます。

 両者をメモ帳で開いても、その違いがわかると思います。

 後者のファイルを タブ区切りのテキストファイルと呼んだりします。
 (作成したいのはこちらのほうだと思いますが?)

●たとえば A1 に aaa 、B1 に bbb、C1 に ccc という3列のセルの1行だけを
 テキストファイルとして書きこんだ時に、できあがったファイル
 をバイナリーエディターソフトで調べると、

 前者 は aaabbbccc改行
 後者 は aaaタブbbbタブccc改行

 こんなようになっていることがわかります。
 エクセルでブックとして開いた場合、タブコードがあれば、セルがわかれます。
 行の最後の改行コードは、その行は、そこでおしまいということを意味します。
 もし、この後にもデータが続けば、そのデータはエクセル上の次の行に表示されます。

● Print ステートメント

 これについては ネット で Printステートメント を検索語にして検索し
 h tps://msdn.microsoft.com/ja-jp/library/office/gg264278.aspx 等、
 でてきたページのわかりやすいものを選んで、読んでおかれることをおすすめします。

 Print 文字列  とやると 文字列の最後に改行が付加された形で書きこまれます。
 文字列は、1行毎のものでもいいですし、全行分を改行コードを適切にいれた形の文字列にして
 その全行分文字列を一挙に書きこんでもOKです。
 アップされたコードでは、各行の最後に改行をつけた全行分の文字列を1回で書きこんでいます。

●エクセルのセル内での改行処理

 セル内で改行されている各行を分解して取り出すということについては、いろいろ方法が
 あります。そこは、いかようにでもできます。

 その改行コードのことをメモします。

 アップされたコードでも使っている vbCRLF 、これが Windows の標準の改行コードです。
 値は2桁、CR(13)とLF(10)が合わさったものです。

 一方、エクセルのセル上で、文字をタイプして、Alt/Enterで入力した時にセットされるコードは
 1桁のLF(10) です。

 念のため、セル内の改行コードが LF でセットされているのかその他の改行コードになっているのかを
 確認しておかれたらいいと思います。

 たとえば、B1 がセル内改行で3行になっていたとします。
 どこかのセルに =LEN(B1) といれます。そのとき表示された数値が、見た目の文字列合計の長さより
 2桁多ければ 1桁の改行コード、4桁多ければ 2桁の改行コードが使われているということになります。

 で、別のセルに =CODE(MID(B1,ROW(A1),1) と打ち込みます。
 これを =LEN(B1) で表示された数値分、下にフィルコピーします。
 そこででてくる文字コードを見ます。10 とか 13 とかといった改行コードも現れますので
 セル内で使われている改行コードが実際にはどんな値なのか(どんな値の組み合わせなのか)が
 わかると思います。

 それを教えてもらえれば、セル内改行を処理する具体的なコード例の回答もよせられると
 思います。

【78763】Re:エクセルの指定セルをテキストデータ...
発言  β  - 17/1/17(火) 9:53 -

引用なし
パスワード
   ▼かわかみまめお さん:

↑ で =CODE(MID(B1,ROW(A1),1)  と書きましたが
=CODE(MID($B$1,ROW(A1),1) に直してください。

【78764】Re:エクセルの指定セルをテキストデータ...
発言  かわかみまめお  - 17/1/17(火) 19:18 -

引用なし
パスワード
   γ様

お世話になります。
かわかみまめおです。
ご丁寧に御教示ありがとうございます。
あまりに自分が勉強不足でしたので、いただた内容をもう少し自分で勉強致します。
お時間を頂いて、またご質問させていただくことになるかと思いますが、
その際は宜しくお願いいたします。

【78765】Re:エクセルの指定セルをテキストデータ...
発言  かわかみまめお  - 17/1/17(火) 19:20 -

引用なし
パスワード
   β様

お世話になります。
かわかみまめおです。

β様も、ご丁寧に御教示ありがとうございます。
β様にも申し訳ないので、いただた内容をもう少し自分で勉強致します。
お時間を頂いて、またご質問させていただくことになるかと思いますが、
その際は宜しくお願いいたします。

【78772】Re:エクセルの指定セルをテキストデータ...
質問  かわかみまめお  - 17/1/23(月) 1:10 -

引用なし
パスワード
   γ様、ありがとうございます。
その後、少しずつですが、自分でも調べました。

(1)ステップ実行をして、イミディエイトウインドウを見ながら、
SaveDの変化を確認しました。考えてようやく、理解できました。
(自分では、saveD の値が、AAA、次が、AAAタブBBB 次が、AAAタブBBBタブCCC
と累積していく場合に、前の分を書き込んでからでないと、コンピュータは、忘れてしまうのではないか、という考えがあったもので、このような質問をしてしまいました。)

(2)セルの複数行についても、β様からの御教示もあり「タブに関する、エクセルとwindows の違い」なども参考にしました。今の自分では、ちょっと難しいので、
元のエクセルの雛型を以下のようにしました。
  
      A列                B列
1行目 ファイル名となる文字列(XXX) テキストに書き出す内容(セル内複数行)
2行目 ファイル名となる文字列(YYY) テキストに書き出す内容(セル内複数行)

そして、セルの指定は、複数セルの「範囲」ではなく、セル「B1」しか選ばず、XXXファイルを作成する、ことににしました。そのために、
Print #1, SaveD を
Print #1, Replace(SaveD, vbLf, vbCrLf) へ変更することにより、最低限の目的は達成できました。(次の目標は、「B1:B2」を選んで、一気にXXX とYYYのファイルを作成することです。)

本当にどうもありがとうございました。

(3)γ様、もう一点教えて頂きたいことが出てきました。
今回は、テキストファイルが、カレントフォルダに作成されますが、これを常時、元のエクセルがあるフォルダと同じフォルダ内に作成するためには、どのような構文を書き加えたらよろしいでしょうか。

【78773】Re:エクセルの指定セルをテキストデータ...
質問  かわかみまめお  - 17/1/23(月) 1:13 -

引用なし
パスワード
   β様、ありがとうございます。
γ様へのお礼(返信)と重複しますが、その後、少しずつですが、御教示に従い、自分でも調べました。

タブですが、頂いた、=CODE(MID(B1,ROW(A1),1) で、元のエクセルのセル内を調べたところ、全て「10」という値になりました。
そこで、
Print #1, SaveD を
Print #1, Replace(SaveD, vbLf, vbCrLf)に変更すること、また、そもそものエクセルのっ雛型を自分でも処理できるように変更して、なんとか最低限の目標を達成することができました。 エクセルのVBAもよくわかっていない自分が、エクセル以外のものを操作するということの難しさを改めて感じました。

どうもありがとうございました。


なお、甘えてしまって恐縮ですが、追加で御教示頂きたいのですが、テキストファイルが、カレントフォルダに作成されますが、これを常時、元のエクセルがあるフォルダと同じフォルダ内に作成するためには、どのような構文を書き加えたらよろしいでしょうか。

【78774】Re:エクセルの指定セルをテキストデータ...
回答  γ  - 17/1/23(月) 7:09 -

引用なし
パスワード
   > 元のエクセルがあるフォルダと同じフォルダ内に作成するためには、

そのマクロが記載されているブックのフォルダは
ThisWorkbook.Path
で得られます。

テキストファイルの操作にあたって、
「フォルダ名を付けたファイル名」(フルパス名)を使うことです。
間の"\"を忘れないようにしてください。

【78791】Re:エクセルの指定セルをテキストデータ...
回答  γ  - 17/1/24(火) 7:09 -

引用なし
パスワード
   '左上のセルの値をファイル名にする
  File_name = Cells(Selection.Row, Selection.Column).Value '余り感心しないが
  File_fullpath = ThisWorkbook.Path & "\" & File_name & "_j.txt"
  
'ファイルの読み込みと出力
  '''Open File_name & "_j.txt" For Output As #1
  Open File_fullpath For Output As #1

ということです。(変数宣言の追加は省略しました)

【78792】Re:エクセルの指定セルをテキストデータ...
お礼  かわかみまめお  - 17/1/25(水) 0:56 -

引用なし
パスワード
   γ様

御教示どうもありがとうございます。

1.1つ前のγ様の投稿で頂きましたアドバイスを元に自分で試行錯誤の上、

Open File_name & "_j.txt" For Output As #1

Open ThisWorkbook.Path & "\" & File_name & "_j.txt" For Output As #1

に変更したところ、うまく動きました!


2.しかしながら、今回、γ様の投稿で頂きました、
先に、 
File_fullpath = ThisWorkbook.Path & "\" & File_name & "_j.txt"
としておき、後で、
Open File_fullpath For Output As #1
として使う、という記述方法の方が、今後複雑になったときのことを考えると、
応用も効き、より適切なのだと思いました。

次につなげたいと思います。

お陰様で、今回必要なことが自動できるようになりました。
ご丁寧に、御教示頂きどうも有難うございました。

717 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free