プロが教えるわが家の防犯対策術!

Txtファイルにあるデータがコンマで区切られています。並びをAからJとします。Aの前には日付が入っています。
ExcelのUserFormを使い、テキスト(拡張子Txt)のデータを列ごと取得しようと思っております。たとえば図のようにBのチェックボックスにチェックを入れ、ExecuteButton1を押すと「-509999.9987」データと日付のみ、新しいExcelファイルにデータを入れるという方法です。

並びとしましてUserForm1の中にPage1がありその中にFrame1が入って、Checkboxがあります。

どなたか簡単にできる方法を教えていただけますでしょうか。どうぞよろしくお願いいたします。

「Excel VBAでUserFormを使」の質問画像

質問者からの補足コメント

  • どう思う?

    アクセスできるかわかりませんが
    ここにファイルをUploadしてみました。
    http://prt.nu/f3/test
    http://36.gigafile.nu/0511-b9935a5d015d8b3598e1d …

      補足日時:2018/04/20 04:05
  • うれしい

    パスワードは1234

      補足日時:2018/04/20 04:06
  • うーん・・・

    Executeボタンを押したら、下記のような流れになればいいです。

    テキストオープン>新規のExcelシートを作成する>選択したタグを列で取得する>新規のExcelシートに取得したデータを詰めて張り付ける(その時日付とデータを張り付ける)。

      補足日時:2018/04/20 06:16
  • うーん・・・

    ご回答ありがとうございます。ちょっとまだ質問があります。
    ①複数のテキストファイルを持ちいります。
    ②~④どういったマクロをお考えでしょうか? 根本的にUserFormの使い方がわからないのでうまくExcelマクロと組み合わせることができないです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/04/20 22:59

A 回答 (3件)

質問者さんの例文を見ると


For i = 1 To 200
となっていますよね?
これを列の移動で考えると左から右へ処理するという意味になります.
もし回答No2の様な処理を行うとチェックの入っていない列は削除して左に詰めるという事を実行しているので,おそらく列のズレが出てくると思います.
そこで
For i = 200 To 1 Step -1
とすれば右側の列から左に向かって処理するという事になるのですが,そうすれば仮に列を削除して左に詰めたとしても列のズレは出てきません.

見当違いな回答でしたら申し訳ないのですが,どの様な問題が出ていてNGなのかを記述して貰えると助かります.
    • good
    • 0

補足を読みました.


IFとFor~Nextを利用して例文を考えると,(チェックボックスが3つと仮定)

Dim i As Integer '繰り返し演算の引数
Dim j As Integer 'Trueの個数を数える引数

For i = 3 To 1 Step -1 'ここで3がチェックボックスの数
If Me.Controls("CheckBox" & i) = False Then 'チェックが入っていない場合
Worksheets("Sheet1").Range(Cells(1, i), Cells(1048576, i)).Select
Selection.Delete Shift:=xlToLeft
Else 'チェックが入っている場合
j = j + 1
End If
Next i

上記内容でできる事はチェックボックスにチェックを入れていない列を削除し,左側に詰めるという事とチェックボックスにチェックが入っている個数を数える事ができます.

前回の回答での過程は1行毎にチェックを確認する方法で考えていたのですが,その方法だと下手に時間が掛かるので,上記の方法に修正しました.
この内容で②~④までができる様になっていると思います.
    • good
    • 0
この回答へのお礼

ありがとうございます。 テストしましたが、NGでした。
たとえばチックボックス1と4にチェックが入っていたとします。コンマの間と間のデータを取得しようとすると、1列目のデータは日付なので、2列目と5列目を取得したいと思いますがうまくいきません。 
チェックボックスの1番目にレ点があると下記のようになります。
If Me.Controls("CheckBox1").Value = True Then
If Me.Controls("CheckBox2").Value = True Then
If Me.Controls("CheckBox3").Value = True Then
して行くと、200以上のチェックボックスがある場合それを200以上作らないといけません。
また、下記のようにすると。
.......................
For i = 1 To 200
If Me.Controls("CheckBox" & i).Value = True Then
~~~~~~~~~
else
~~~~~~~~~
next i
..........................
たとえば1と4列目が正(True)の場合であっても、テキストの中身のデータを的確に2列目と5列目を取得するのが難しいです。
すみません。他にいい案はございますでしょうか?

お礼日時:2018/04/25 05:04

質問者さんの意向通りか分かりませんが,やりたい事はA列にあるテキストデータのカンマ区切りをデータ列に分けて,更にその中から抽出したいデータ列を選択するとその列のデータが残るという事で宜しいでしょうか?


また1つ確認ですが,このテキストデータというのは拡張子.txtのファイルをエクセルで読み込む場合,1つのテキストファイルなのでしょうか?それとも複数なのでしょうか?
1つならインポートで済む話ですし,複数なら別途マクロが必要になると考えています.

それでは回答についてですが,実際のマクロの記述ではなく,考え方で示したいと思います.
上記内容と重複するのですが,
①カンマ区切りのデータを一旦カンマごとに列で分ける(これはエクセルの標準機能でデータの区切り位置でできます.これのマクロは一旦マクロの記録をした状態でA列を選択し,区切りを行う事でマクロの内容を獲得できます.)
②ユーザーフォームのチェックボタンに各々引数を設定し,それがTRUEの場合に列のデータを残す,FALSEは列のデータを削除する(clearではなく,deleteを利用すると列が左に移動します)
③これをDo~Loopを利用し,例えば変数にiを用いて
i=i+1
で行の位置を出して繰り返し計算を行い,マクロを止める時は以下の方法でできると思います.
1.Range(i,1).value=0の時にExit Subでマクロを止める
2.の値が行の最終位置になった時にLoop Untilで繰り返し計算をやめる
④もしくはFor Nextを使って最終行の位置を予め出しているならその行まで繰り返す方法もあります.
最終行はCells(Rows.Count, 1).End(xlUp)で求められます.
⑤これに対して新規のブックにデータを入れるには
ActiveWorkBook(新規のブック)とThisWorkbook(データを抽出したブック)と
Copyを使えばできると思います.
⑥コピーの範囲はユーザーフォームでチェックした数(TRUEの数)を利用して必要な列数を求める

以上で如何でしょうか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!