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

Txtファイルにあるデータがコンマで区切られています。並びをAからJとします。Aの前には日付が入っています。複数のテキストファイルを持ちいります。
ExcelのUserFormを使い、テキスト(拡張子Txt)のデータを列ごと取得しようと思っております。たとえば図のようにBのチェックボックスにチェックを入れ、ExecuteButton1を押すと「-509999.9987」データと日付のみ、新しいExcelファイルにデータを入れるという方法です。
並びとしましてUserForm1の中にPage1がありその中にFrame1が入って、Checkboxがあります。
ここにファイルをUploadしてみました。パスワードは1234
http://4.gigafile.nu/0609-b68df8d040f5aa34546dea …
Executeボタンを押したら、下記のような流れになればいいです。
テキストオープン>新規のExcelシートを作成する>選択したタグを列で取得する>新規のExcelシートに取得したデータを詰めて張り付ける(その時日付とデータを張り付ける)。
たとえばチックボックス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列目を取得するのが難しいです。
どなたか簡単にできる方法を教えていただけますでしょうか。どうぞよろしくお願いいたします。

「ExcelUserFormをつかってTx」の質問画像

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

  • うーん・・・

    テキストファイルが新しくなり、今必要なデータはは28行目と32行目です。

      補足日時:2018/05/19 07:52

A 回答 (4件)

No.1です。


すいません。リンク先は確認していないです。どこへ飛ぶか分からないリンクはクリックしない主義なので・・・。なので、またまた独りよがりで考えてみました。
ご存知とは思いますが、Excelからテキストファイルを開くと「テキストファイルウィザード」で各種設定ができます。その中に取り込み列を削除する指定ができますが、これをVBAで設定してみました。とりあえず、MAX9列を想定して作ったので、必要に応じて増やしてください。

Private Sub CommandButton1_Click()
Dim i As Long
Dim a As Variant
a = Array(0, 0, 0, 0, 0, 0, 0, 0, 0)
For i = 1 To 9
If Me.Controls("CheckBox" & i).Value = True Then
a(i - 1) = Array(i, 1)
Else
a(i - 1) = Array(i, 9)
End If
Next i
Workbooks.OpenText Filename:="C:\Users\xxxx\test.txt", _
Origin:=932, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False _
, Comma:=True, Space:=False, Other:=False, FieldInfo:=a, _
TrailingMinusNumbers:=True
End Sub
    • good
    • 0

こんばんは。



ダウンロードしたファイルの中身のコードが未完成品ばかりでしたので、どうやら、こちらは、それを直すほど事情が分かっていないので、あえて、こちらはこちらで新たに作ったほうが早いです。人のマクロは、途中から切り出そうとしても、切り取れません。

うまくいかない理由は、様々ですが、こちらで気がついたのは、通常の方法では、20万行以上のデータを処理するのは、ハング状態になるということてす。
>1列目のデータは日付なので、2列目と5列目を取得したいと思いますがうまくいきません。
これは可能ですが、以下のコードですと、arBuf(0) =0, arBuf(1)=2, arBuf(2)=5 のように格納されます。

>テキストファイルが新しくなり、今必要なデータはは28行目と32行目です。
やって出来ない話ではないのですが、そこまで考えていません。

'/データをインポートする/

Private Sub CommandButton1_Click()
Dim arBuf()
Dim k As Long, n
Const CHKBOXCNT As Integer = 4  'チェックボックスの数
ReDim arBuf(0)
arBuf(n) = 0: n = 1
For k = 1 To CHKBOXCNT
 If Me.Controls("CheckBox" & k).Value = True Then
  ReDim Preserve arBuf(n) 'チェックボックスのTrueの番号
  arBuf(n) = k
  n = n + 1
 End If
Next k
'-----------
Dim FileName As String
Dim newBk As Workbook
Dim TextLine As String
Dim i As Long, x As Long, y As Long
Dim buf
Dim textBuf As String
Dim TextLines
Dim TextRow
Const myDATA As String = "2018" '年数

With Application.FileDialog(msoFileDialogOpen)
 .Filters.Clear
 .Filters.Add "Select text([Data_#_Test#].txt)files", "*.txt"
 .Show
 If .SelectedItems.Count = 0 Then '選ばなかった時
  Exit Sub
 Else
  FileName = .SelectedItems(1)
 End If
End With
Set newBk = Workbooks.Add '新しいブックを作る

With CreateObject("Scripting.FileSystemObject")
 With .GetFile(FileName).OpenAsTextStream
  textBuf = .ReadAll
  .Close
 End With
End With '一括でTextファイルを取得
ReDim ArText(3)
x = 3 '3行目から
TextLines = Split(textBuf, vbCrLf) '行に分ける
For i = 0 To UBound(TextLines)
 If TextLines(i) Like myDATA & "*" Then
  TextRow = Split(TextLines(i), ",")
  For Each n In arBuf
  y = y + 1
  newBk.Worksheets(1).Cells(x, y).Value = "'" & TextRow(n) '数字の桁が多い時の対処-文字化
  Next
  y = 0: x = x + 1
 End If
Next i
Beep
End Sub
    • good
    • 0
この回答へのお礼

どうもありがとうございます。 質問があります。
「Const CHKBOXCNT As Integer = 4  'チェックボックスの数」
チェックボックスの数が4なのはどういう意味でしょうか? チェックボックス数が200以上に自動で増える時もあります。
For i = 0 To UBound(TextLines)は使えますでしょうか?
使えない場合ははどうすればよろしいですか?

また下記のこの意味をもっと詳しく、教えていただけますでしょうか?。
「ReDim arBuf(0)
arBuf(n) = 0: n = 1」

「ReDim ArText(3)」

お礼日時:2018/05/30 00:34

Split関数を使うと、コンマで区切られた文字列をバラして配列に入れてくれますよ。

    • good
    • 0

こんなので、参考になりますか。



Sub sample()
Dim i As Long
Dim myRng As Range
Set myRng = Sheets("Sheet1").Cells(1, 1)
For i = 1 To 200
If Me.Controls("CheckBox" & i).Value = True Then
Set myRng = Union(myRng, Sheets("Sheet1").Cells(1, i + 1))
End If
Next i
myRng.EntireColumn.Copy
Sheets("Sheet2").Paste Destination:=Range("A1")
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。ちょっと使ってみますが、下記のExcelファイルにはTextファイルを選択するところまで作ってあります。
その続きが知りたいのですが、確認はしていただけましたでしょうか?
http://4.gigafile.nu/0609-b68df8d040f5aa34546dea …

お礼日時:2018/05/19 14:05

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