• ベストアンサー
  • すぐに回答を!

ExcelUserForm,Txtデータを列取得

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

共感・応援の気持ちを伝えよう!

  • 回答数10
  • 閲覧数373
  • ありがとう数19

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.6

判りません。とりあえず、私が最初に送ったプログラムでやってみていただけますが。 それでうまくいけば、あなたが作った前半部分に問題がある訳です。 データも、上げていただいたテストデータを使ってください。 前半部分に関しては、私には理解不能なので、協力できません。自分で対応するか、他の人に聞いて下さい。 本番データはどうなっているのですか、もし、テストデータのような数字だけなら、前半部分は不要だと思います。シフトジス以外で漢字が入っているならコード系を書いた上で、本番に近いテストデータを上げて下さい。 私は、シフトジス以外のファイルを扱った事がないので、 「VBA でUTF8のファイルを読みたい」など、他の人に聞いた方が早いです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

間違い しかし、データ張り付けの時に行が詰まってしまいます。検索すると空白の削除が出てきます。ただ上に詰めてコピーするには、どうすればいいでしょうか?  正解 しかし、データ張り付けの時に行が空白になってしまいます。ネットで検索すると空白の削除が出てきますが、ただ上に詰めてデータを張り付けていくには、どうすればいいでしょうか? 

質問者からの補足

ありがとうございます。ちょっと長い間作業が手に付けられませんでした。他のマクロも入れ、下記のようなファイルができました。 しかし、データ張り付けの時に行が詰まってしまいます。検索すると空白の削除が出てきますが、ただ上に詰めてコピーするには、どうすればいいでしょうか? どうぞよろしくお願いします。 While Not EOF(1) DoEvents Line Input #1, FileData Row = Row + 1 ISplit = Split(FileData, ",") ArrayMax = UBound(ISplit) DateData = ISplit(0) ColO = 1 ' a = a + 1 If a Mod factor_ENV = 0 Then For ColI = 1 To WorksheetFunction.Min(200, ArrayMax) If Controls("CheckBox" & ColI).Value Then ColO = ColO + 1 Cells(Row, ColO) = ISplit(ColI) Cells(Row, "A") = Format(DateData, "####/##/## ##:##:##") End If Next ColI End If

関連するQ&A

  • ExcelのUserForm,Txtデータを列取得

    Txtファイルにあるデータがコンマで区切られています。並びをAからJとします。Aの前には日付が入っています。複数のテキストファイルを持ちいります。 ExcelのUserFormを使い、テキスト(拡張子Txt)のデータを列ごと取得しようと思っております。たとえば図のようにBのチェックボックスにチェックを入れ、ExecuteButton1を押すと「-509999.9987」データと日付のみ、新しいExcelファイルにデータを入れるという方法です。 並びとしましてUserForm1の中にPage1がありその中にFrame1が入って、Checkboxがあります。 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列目を取得するのが難しいです。 どなたか簡単にできる方法を教えていただけますでしょうか。どうぞよろしくお願いいたします。

  • VBA初心者なのですが(Userformについて)

    まずは質問ご覧いただきありがとうございますm(_ _)m さっそくなのですが、次のプログラムを打つとSelect Caseのところで”指定されたオブジェクトは見つかりません”と出てしまうのですがなぜでしょうか。回答お待ちしております。 Private Sub CommandButton2_Click() Dim msg As String, i As Integer Dim ii As Integer, msg2 As String For i = 1 To 3 If Controls("CheckBox" & i).Value = True Then msg = msg & Controls("CheckBox" & i).Caption & vbCrLf End If Next i For ii = i To 2 If Controls("OptionBotton" & i).Value = True Then msg2 = msg2 & Controls("OptionBottob" & i).Caption & vbCrLf End If Next ii Select Case Controls("CheckBox" & i).Value & Controls("OptionBotton" & i).Value Case Controls("CheckBox" & i).Value = True & Controls("OptionBotton" & i).Value = False MsgBox msg & "がチェックされてます" Case Controls("CheckBox" & i).Value = False & Controls("OptionBotton" & i).Value = True MsgBox msg2 & "オン" Case Controls("CheckBox" & i).Value = True & Controls("OptionBotton" & i).Value = True MsgBox msg & "がチェックされています" & vbCrLf & msg2 & "オン" Case Else MsgBox "チェック又は、オンにしてください" End Select End Sub

  • エクセルVBA マルチページのSetFocus

    いつもお世話になっております。 ありがとうございます。 マルチページ内のエラー時に、テキストにフォーカスしたいのですが、 該当のエラーテキストではないページ(タブ)にカーソルがあった場合、 エラーとなってしまいます。 色々調べて、やってみたのですが、うまくいきません。 ご教授いただけると幸いです。 マルチページ内には、いくつかのテキストとチェックボックスがあります。 マルチページのページ数はmei_su = 5 です。 For i = 1 To mei_su Set mychk = Me.Controls("chkMei5_" & i) If mychk.Value = True Then MsgBox "チェックされていますが、入力されていません。" Set mytxt = Me.Controls("txtMei2_" & i) mytxt.SetFocus Exit Sub End If Next MultiPage1.value = 0 とか、 Me.Controls("Page" & i).enable = true とかも 入れてみたのですが、ダメでした。 よろしくお願い致します。

その他の回答 (9)

  • 回答No.10

私は、こんなプログラム組んだ覚えはありません。何で Cells(Row + 1, "A") = Format(DateData, "####/##/## ##:##:##") がループの中にあるのですか? 質問の、ExcelUserForm,Txt データを列取得には、十分答えていると思います。

共感・感謝の気持ちを伝えよう!

  • 回答No.9

新しいワークブックを作るんだったら、直接開いて、不要な部分を削除した方が良いのではないかと思って。プログラムを作ってみました。プログラムは簡単になりました。 但し、大きな数字を、セルに入れると、2.01801E+16 のような、指数表示となります。これを文字列に入れてFormatをかけると、// ::2となるので、長整数にして、1000で割る方式にしました。 質問です。どっちの方法を使うにしろ、これによりプログラムは変わります。 (1)1行目、[0,1,2,3,4,5,6,7,8,9,10]は必要なのか。(不要としました) (2)Keep every other row of data等を指定した時、どのデータを取るのか。 2行目(曜日)のデータを取り、後は指定回数-1削除としました。 例えば、Keep every 5th ...だったら、2(曜日行),7,12…行を取り、後は削除します。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

どうもありがとうございます。データが多いとやりにくいと思い、少なめにしていました。

質問者からの補足

ありがとうございます。 何回もすみません。 そこで28行目と32行目が必要なデータになるのですが、2個以上のテキストファイルの選択となると今までのマクロではうまく使えないわけです。

  • 回答No.8

テストデータを見て、最初の2行は必要ないのだと思ってしまいました。 最初の回答でで、「最初の2行は読み飛ばしました。」と明記したつもりだったですが。 これは、ループに入る前に、   Line Input #1, FileData が2行並んでいるので、それを1行にすれば、最初の 0,1,2,3,4,5,6,7,8,9,10 だけが読み飛ばされます。なくしてしまえば、最初の行も出力されます。 ただ、漢字を使うとなると、コード系が問題となります。 VBはシフトジスコードしか扱えないので、シフトジスコードなら、これで問題はありませんが、他のコード系であれば、これでは動きません。その場合、もう一度、テータを上げていただいた上で、コード系が何なのかをを書いて下さい。対策を考えます。 (最近、UTF8、UNICODE などあるので、困っています。)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

どうもありがとうございます。 Line Input #1, FileDataのデータは一行ずつ書き込んでいくわけですが、行の指定はできますでしょうか。実際28行目から必要なタイトルデータがあるので、28行目を1行目に。32行目から本格的な数値データが入っているので、そこからデータを読み込みたいと思っております。どうぞよろしくお願いいたします。

質問者からの補足

objStream.Charset だと "ascii" '"Shift-JIS" '"UTF-8"ということですよね。 objStream.Charset = "ascii" '"Shift-JIS" '"UTF-8" Set objStream = CreateObject("ADODB.Stream") はこちらへ作り始めましたが、 Roseのところがすべてのデータを拾ってしまうので分割して列のデータを拾うやり方がいまいちわからず断念しております。 そこで下記を作ってでやってみましたが、数字(番号)が出てきてうまくいきません。Stringでの使い方が、いまいちわかりません(すみません独学でやってます)。 Private Sub CommandButton1_Click() ' Dim Shape As Shape Dim FileData As String Dim ISplit As Variant Dim ISplit2 As Variant Dim DateData As String * 14 Dim Row As Long Dim ArrayMax As Integer Dim Point As Integer Dim Col As Integer Dim factor_ENV As Long Dim Count As Long ' With Application.FileDialog(msoFileDialogOpen) .Filters.Clear .Filters.Add "Select txt([Date_#_Test#].txt) files", "*.txt" ' If Not .Show Then End End If Open .SelectedItems(1) For Input As #1 End With 'Line Input #1, FileData Line Input #1, FileData Application.ScreenUpdating = False ' Cells.ClearContents ' For Each Shape In ActiveSheet.Shapes("Group 2").GroupItems ' If Not Shape.Name Like "Keep*" Then ElseIf Shape.ControlFormat = 1 Then factor_ENV = Mid(Shape.Name, 5) End If Next Shape ' Workbooks.Add Columns("A:A").ColumnWidth = 18 ' '----------------------------------------------------------------- ' Do Until EOF(1) ' DoEvents ISplit2 = Split(FileData, ",") ArrayMax2 = UBound(ISplit2) 'DateData2 = ISplit2(1) Row2 = Row2 + 1 Col2 = 1 Line Input #1, FileData For Point2 = 1 To WorksheetFunction.Min(12, ArrayMax2) If Controls("CheckBox" & Point2).Value Then Col2 = Col2 + 1 Cells(Row2, Col2) = ISplit2(Point2) End If Next ' Loop '----------------------------------------------------------------- Do Until EOF(1) ' DoEvents Line Input #1, FileData Count = Count + 1 ' If Count Mod factor_ENV = 0 Then ISplit = Split(FileData, ",") ArrayMax = UBound(ISplit) DateData = ISplit(0) Row = Row + 1 Col = 1 ' For Point = 1 To WorksheetFunction.Min(12, ArrayMax) If Controls("CheckBox" & Point).Value Then Col = Col + 1 Cells(Row + 1, Col) = ISplit(Point) Cells(Row + 1, "A") = Format(DateData, "####/##/## ##:##:##") End If Next Point End If Loop Close Me.Hide End Sub

  • 回答No.7

ファイルを拝見しました。いろいろな機能を付けたのですね。 Row が出力行です。 したがって、Ifで出力しない事があるなら、 Row = Row + 1 をIfの中に入れる必要があります。 Cells.ClearContents は、セルを全てクリアします。 Workbooks.Add をするなら必要ないし、開始画面の内容を消してしまうので、外して下さい。 Application.ScreenUpdating = Falseを入れれば若干早くなります。 DoEventsは非常用です。これを入れておけば、何かあったとき、Esc で止めることができます。若干スピードは落ちます。テスト中は入れておいたほうがいいです。本番はどうするかは判断に任せます。 For Point = 1 To WorksheetFunction.Min(12, ArrayMax) 12はボタンの個数です。もし、 For Point = 1 To UBound(ISplit) とすると、1行にデータが13個あればエラーになります。それを防ぐためです。ボタンを増やしたら増やして下さい。(本当に 200もボタンを付けるのですが、ということは、本番データは横に 200並んでいるということでしょうか。) Sheet1のオプションボタンの名前の中に、値を入れておけば、ループでできて、IFを並べる必要はなくなります。 変数名を若干変えました。 ColI ColumnInput の略だったのですが、入力データはセルではないのでColumnはおかしいです。Point にしました。 ColO Input Outputに分ける必要がなくなったので、Col にしました。 後、Set objStream = CreateObject("ADODB.Stream")… の部分はどうなりましたか? ギガファイル便、使ってみました。ヤフーボックスと違って、xlsmが使えるのがいいですね。でも、上書きできないのが不便です。 URL を記録し忘れて、行方不明となったファイルが、数本あります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

どうもありがとうございます。なるほど、まだまだ多様性がわかっていないので、お手数をおかけします。

質問者からの補足

 どうしてLine Input #1, FileDataとすることによって、テキストデータ(20180117_test.txt)の最初の部分(下記)が検出去れなのでしょうか? 0,1,2,3,4,5,6,7,8,9,10 日付,A,B,C,D,E,F,G,H,I,J 上記のデータ(日付,A,B,C,D,E,F,G,H,I,J)も入れたいのですが、出てきません。 例えばこんな風に __Date/Time|__________B|__________C 2018/1/17 1:40|______-509999.9993|______-0.005320536 2018/1/17 1:40|______-510000.0036|______-0.009062112

  • 回答No.5

 多分これで動くと思います。どうしても名前を変更しないならどうするかも、考えていたので、少し残念です。しかし、(2)~(4)のやり方は、無駄にプログラムが複雑になるので、(1)が可能なら、(1)が1番いいです。  プログラムを拝見しましたが、前半部は私が見たことのない命令ばかりで理解できません。私のようなおじんは、昔のBasic に無かったものはなかなか理解できません。Option Explicitも、最近使えるようになりました。綴りが覚えれられず、コーディングのたびにググっています(笑)。  でも、なんとなく、UTF8を読んでいるのではないかといういう感じです。テストデータは数字だけでしたが、本番は漢字もあるということでしょうか。  気になったのは、 CurDir ("C:\") です。これ、何もしませんよ。(昔のBasic ならエラーになっていました) CurDirはカレントディレクトリを取り出す関数です。   Debug.Print CurDir("C:") 又は、   PathName = CurDir("C:") のようにしないと機能しません。 カレントディレクトリを変更したいのなら、   ChDrive "C:"   ChDir "C:\" とする必要があります。 また、何かあったら書いて下さい。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 実行時エラーはでなくなりましたが、結果が、”// ::” になってしまいます。どうすれば改良ができますでしょうか?

  • 回答No.4

先ず、前回送ったプログラムにミスがありました。VBは配列が0から始まるのでこうなります。 '     If chk_A.Value Then       ColO = ColO + 1       Cells(Row, ColO) = ISplit(1)     End If '     If chk_B.Value Then       ColO = ColO + 1       Cells(Row, ColO) = ISplit(2)     End If       ︙ Excel をコピペをすると、横のセルの間には、一見スペースがあるように見えますが、Tab が入ります。Tab は、OKWAVEでは無視されます。私は必ず確認画面を見ています。 質問に、 If Me.Controls("CheckBox1").Value = True Then と書いてあったので、てっきり、名前を変更していないものと思いました。 Controls()は、Control.Nameで付けた名前で指定する必要があります。 chk_A という名前を付けているなら、 Controls("CheckBox1") ではだめで、 Controls("chk_A") とする必要があります。 対策です (1)名前をCheckBox1,2 …に戻す。私はこれが一番いいと思います。 どうしても名前と表示を一致させないと混乱するというのであれば、以下の方法が考えれれます。 (2)IF文を200 連ねる。     If chk_A.Value Then ColO = ColO + 1 : Cells(Row, ColO) = ISplit(1)  と書けば、1行ですみます。本来やっていはいけない書き方ですが、この際やむを得ません。 (3)For Eachを使って、全てのControlsを見る。チェックボックスだったら処理をする。  chk_B を作り忘れて後から作ったなど、チェックボックスを作る順番を間違えれば狂います。 (4)1→A、2→B…と変換するプログラムを作る。  Zまでなら簡単にできます。その後AAになると思うのですが、それでいいですか? どれにするか決めてご記入下さい。 ((1)、(2)なら自分でできると思います)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

どうもありがとうございます。 macro2の結果を下記に変更しました。 CommandButton1> ExecuteButton1 CommandButton2> Cancel MultiPage1 Frame1> Frame1 Frame2> Frame2 CheckBox1> A CheckBox2> B CheckBox3> C CheckBox4 >D CheckBox5> F CheckBox6>G CheckBox7>H CheckBox8>I CheckBox9>J CheckBox10>K

質問者からの補足

どうしてLine Input #1, FileDataとすることによって、テキストデータ(20180117_test.txt)の最初の部分(下記)が検出去れなのでしょうか? 0,1,2,3,4,5,6,7,8,9,10 日付,A,B,C,D,E,F,G,H,I,J 上記のデータ(日付,A,B,C,D,E,F,G,H,I,J)も入れたいのですが、出てきません。

  • 回答No.3

While ~WendをDo~Loopに置き換えても何の問題もありません。 判っていたのですが、つい、慣れている、While を使ってしまいます。 Openは以下に置き換えて下さい。(私はこの書き方しか知りません。Application.FileDialogの後ろに直接Filters.Addを書く方法は知りませんので) '   With Application.FileDialog(msoFileDialogOpen)     .Filters.Clear     .Filters.Add "Select txt([Date_#_Test#].txt) files", "*.txt" '     If Not .Show Then       End     End If     Open .SelectedItems(1) For Input As #1   End With >>今の設定はこうなっております。 これは、Macro2を実行した結果でしょうか。 ということは、チェックボックスの名前(オブジェクト名)を変更したということでしょうか。そうであればこのプログラムは使えません。(名前と表示がくっついているので、どこまでが名前か判りません。多分chk_A が名前でA が表示だと思います。今後、間にスペースを入れるなど、分かるように書いていただけたらと思います。) 名前ををCheckBox1,CheckBox2 のように元に戻すか、IF文を連ねるプログラムにするかしかありません。 For ~Nextを以下に置き換え '     If chk_A.Value Then       ColO = ColO + 1       Cells(Row, ColO) = ISplit(2)     End If '     If chk_B.Value Then       ColO = ColO + 1       Cells(Row, ColO) = ISplit(3)     End If       ︙ 大変だと思います。 名前と表示(Caption) は違っていても問題はありません。名前を変えたほうがいいと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

即答、ご返事どうもありがとうございます。 すみません。急いでしまいました。 Macro2を実行した結果が下記になりました。(Excelの結果を出し、コピペした時にはスペースがあったのですが。。。結果、左がControl.Nameで右がControl.Captionです。”>”で区切りました。 CommandButton1 >ExecuteButton1 CommandButton2 > Cancel MultiPage1 (Control.Captionなし) Frame1 > Frame1 Frame2 > Frame2 chk_A > A chk_B > B chk_C > C chk_D > D chk_F > F chk_G > G chk_H > H chk_I > I chk_J > J chk_K > K またテストして、補足コメントに入力します。

質問者からの補足

ありがとうございます。すみません。まだいろいろ試していて、初めにもらったスクリプトを自分の持っているスクリプトと足して創作中です。 下記のようにしてみましたが、「If Me.Controls("CheckBox" & ColI).Value = False Then」で同じ実行時エラーが発生しています。これから変化はできますか? 新しくもらったスクリプトを試したいと思います。 Private Sub CommandButton1_Click() Dim FileLoad As Integer Dim strfullpath As String Dim i As Integer Dim OpenFileName As Variant Dim IngCount As Long ' Dim FileData As String Dim ISplit As Variant Dim DateData As String * 14 Dim Row As Long Dim ArrayMax As Integer Dim ColI As Integer Dim ColO As Integer CurDir ("C:\") 'User selected all desired env files. Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = True 'make the file dialog visible to the user Application.FileDialog(msoFileDialogOpen).Filters.Clear Application.FileDialog(msoFileDialogOpen).Filters.Add "Select *.txt files", "*.txt" FileLoad = Application.FileDialog(msoFileDialogOpen).Show 'If files selected > 0 then continue with main code If FileLoad <> 0 Then On Error GoTo 0 Application.StatusBar = "Importing ILCH Data... Please be patient." For i = 1 To Application.FileDialog(msoFileDialogOpen).SelectedItems.Count strfullpath = Application.FileDialog(msoFileDialogOpen).SelectedItems(i) Set oFSObj = CreateObject("SCRIPTING.FILESYSTEMOBJECT") strFilePath = oFSObj.GetFile(strfullpath).ParentFolder.Path strFileName = oFSObj.GetFile(strfullpath).Name 'Data Stream Definition Set objStream = CreateObject("ADODB.Stream") objStream.Charset = "ascii" '"Shift-JIS" '"UTF-8" objStream.Type = 2 'adTypeText 'default objStream.Open '(10 Line feed only) 'adCR '(13 Carriage return only改行復帰) 'adCRLF '(-1 Default. Carriage return line feed改行復帰行送り(デフォルト))'adLF '(10 Line feed only行送り) objStream.LineSeparator = 10 objStream.LoadFromFile strfullpath objStream.Position = 0 '5771 S1 = 0 'While Not EOF(1) Do Until objStream.EOS Rose = objStream.ReadText(-1) '(adReadLine) Row = Row + 1 ISplit = Split(Rose, ",") ArrayMax = UBound(ISplit) DateData = ISplit(0) Cells(Row, "A") = Format(DateData, "####/##/## ##:##:##") ColO = 1 For ColI = 1 To WorksheetFunction.Min(200, ArrayMax) ' If Me.Controls("CheckBox" & ColI).Value = False Then ' Worksheet("Sheet1").Select GoTo continue Else 'On Error GoTo 0 ColO = ColO + 1 Cells(Row, ColO) = ISplit(ColI) End If continue: Next ColI 'Wend Loop ' Close Me.Hide objStream.Close Set objStream = Nothing Next i End If End Sub

  • 回答No.2

指定されたチェックボックスがなければこのエラーが出ます。 チェックボックスを作っているときに、削除などを行い、実際の名前と表示が合わなくなったと思います。画像の赤〇のようなことがあるのではないでしょうか。 エラーが出た時に、デバックを選択しイミディエイトで ? ColI と入力すれば、どのボタンが無いかわかります。 標準モジュールで以下のプログラムを動かせば、一覧表ができるので、確認して下さい。 ' Sub Macro2() '   Dim Control As Control   Dim Row As Integer '   For Each Control In UserForm1.Controls     Row = Row + 1     Cells(Row, "A") = Control.Name     On Error Resume Next     Cells(Row, "B") = Control.Caption     On Error GoTo 0    Next Control End Sub

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。今の設定はこうなっております。 CommandButton1 ExecuteButton1 CommandButton2 Cancel MultiPage1 Frame1 Frame1 Frame2 Frame2 chk_A A chk_B B chk_C C chk_D D chk_F    F chk_G G chk_H H chk_I    I chk_J    J chk_K K

質問者からの補足

 Open "C:\Users\MA\Desktop\My Documents\質問解答\OKWAVE\20180117_test.txt" For Input As #1 を今まで使っていた、下記に変更したいのですが、 ”For Input As #1” を追加するとそこでエラーになってしまいます。どうしたらいいでしょうか。 Application.FileDialog(msoFileDialogOpen).Filters.Add "Select txt([Date_#_Test#].txt) files", "*.txt"

  • 回答No.1

テストデータを拝見しましたが、データは10しかありませんね。 このようなプログラムでどうですか。ボタンが何個あっても、この長さで行けます。 ' Option Explicit ' Private Sub CommandButton1_Click() '   Dim FileData As String   Dim ISplit As Variant   Dim DateData As String * 14   Dim Row As Long   Dim ArrayMax As Integer   Dim ColI As Integer   Dim ColO As Integer '   Open "C:\Users\MA\Desktop\My Documents\質問解答\OKWAVE\20180117_test.txt" For Input As #1   Line Input #1, FileData   Line Input #1, FileData   Application.ScreenUpdating = False   Cells.ClearContents '   While Not EOF(1)     DoEvents     Line Input #1, FileData     Row = Row + 1     ISplit = Split(FileData, ",")     ArrayMax = UBound(ISplit)     DateData = ISplit(0)     Cells(Row, "A") = Format(DateData, "####/##/## ##:##:##")     ColO = 1 '     For ColI = 1 To WorksheetFunction.Min(200, ArrayMax) '       If Controls("CheckBox" & ColI).Value Then         ColO = ColO + 1         Cells(Row, ColO) = ISplit(ColI)       End If     Next ColI   Wend   Close   Me.Hide End Sub ファイル名の指定方法がなかったので、直接ソースに書きました。 最初の2行は読み飛ばしました。 1列目のデータは日付とありましたが、実際は17桁ありるので日付と時刻とコードであると解釈し、残りの3桁は切り捨てました。 実データは 200もあるのですか。大変ですね。作るのも大変だけど、使うのも大変だと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。しかし、実行時エラーが出まして、苦戦してますが、Excelに何かほかの設定されてませんでしょうか? 実行時エラー'-21470224809(80070057)': 指定されたオブジェクトは見つかりません。

質問者からの補足

While~Wendステートメントは、Do~Loopステートメントの前判断、While条件と同じ意味になり, できるだけDo~Loopステートメントに置き換えておくことをお勧めします。と下記のサイトにあるので変えようとしています。While~Wendステートメントが原因でエラーが発生しますか?http://home.att.ne.jp/zeta/gen/excel/c04p21.htm

関連するQ&A

  • エクセル VBA チェックボックスについて

    よろしくお願い致します。 OS:XP エクセル2003 VBAのことは、まったくの初心者です。 質問なのですが、下記のようなチェックボックス7にチェックが入れば、チェックボックス8~11に自由にチェックが入れれるようになり、逆にチャックボックス7にチェックが入ってない場合は、チェックボックス8~11のチェックはクリアされ、チェックできないものを作りました。 ここから、チェックボックス7にチェック入れたあとは、必ずチェックボックス9~11のどれかにチェックが入っている状態(ラジオボタンのような)で、チェックボックス7にチェックが入ってなかったら、8~11のチェックがクリアで尚且つ、チェックができなくなるようにするにはどうすればよいでしょうか? よろしくお願い致します。 Private Sub CheckBox7_Click() If CheckBox7.Value = True Then CheckBox8.Enabled = True CheckBox9.Enabled = True CheckBox10.Enabled = True CheckBox11.Enabled = True Else CheckBox8.Value = False CheckBox9.Value = False CheckBox10.Value = False CheckBox11.Value = False CheckBox8.Enabled = False CheckBox9.Enabled = False CheckBox10.Enabled = False CheckBox11.Enabled = False End If End Sub

  • エクセルVBA 最終行にデータを追加する

    エクセルのユーザーフォームにチェックリストを用意しました CheckBox1~CheckBox5まであり、 CheckBox1をクリック(true)にすると、セルに“あ” CheckBox2をクリック(true)にすると、セルに“い” CheckBox3をクリック(true)にすると、セルに“う” CheckBox4をクリック(true)にすると、セルに“え” CheckBox5をクリック(true)にすると、セルに“お” を反映させようと思っています たとえば、 ・CheckBox1のみクリック(true)で、A1に“あ” ・CheckBox2のみクリック(true)で、A1に“い” ・CheckBox1、CheckBox3をクリック(true)で、A1に“あ”、A2に“う” ・CheckBox2~CheckBox5をクリック(true)で、A1に“い“、A2に“う“、A3に”え”、A4に“お” といった感じで、選んだチェック項目について、A列においてA1から次々とデータを入力しようとしています そこで、 sheets1.Range("A:A").Clear If CheckBox1.Value = True Then sheets1.Cells(Rows.Count, 1).End(xlUp) = "あ" End If If CheckBox2.Value = True Then sheets1.Cells(Rows.Count, 1).End(xlUp) = "い" End If If CheckBox3.Value = True Then sheets1.Cells(Rows.Count, 1).End(xlUp) = "う" End If If CheckBox4.Value = True Then sheets1.Cells(Rows.Count, 1).End(xlUp) = "え" End If If CheckBox5.Value = True Then sheets1.Cells(Rows.Count, 1).End(xlUp) = "お" End If としました (実際は、CheckBoxの名前が1~5と数字ではないので、forは使いませんでした) すると、 CheckBox1~CheckBox5を全てクリック(true)しても、A1に“お”が反映されるだけで“あ”~”え”が入力されません どうすれば、思い通りになるのでしょうか 初歩的な質問だと思うのですが、よろしくお願いします

  • Excel VB についての質問です。

    Excel VB についての質問です。 チェックボックスのチェックデータを取得して処理をしたいです。 チェックボックスが複数ある為、FOR NEXTで チェックボックスの 名前を作ってIF文で処理しようとしてますが。うまくいきません。 Dim checkBoxName As string For i = 1 To 31 chechkBoxName = "CheckBox1_" & i '文字列的にはチェックボックス名としてある celleSe = "A" & i If chechkBoxName.Value = True Then Worksheets("Sheet2").Range(celleSe).Value = "test" End If Next

  • Excel VB のチェックボックスの処理について

    Excel VB のチェックボックスの処理について すみません。チェックボックスのチェックの状態を条件に処理をしたいです。 うまくいきません。 Dim strcheckBox As String For i = 0 To 100 strcheckBox = "CheckBox1_" & i   celleSe = "A" & i If Worksheets("test1").Controls(strcheckBox).Value = True Then Worksheets("test2").Range(celleSe).Value = "真" End If Next

  • エクセル マクロ チェックボックス

    sheet1にチェックボックスが3つあり、マクロを実行するコマンドボタンが1つあります。 チェックボックスにレ点を入れることにより、sheet4のデータからsheet2にグラフを作成しようと考えてますが、エラーが出てしまい解決できません。 どのように訂正したらいいのか教えて頂けないでしょうか。 Private Sub CommandButton1_Click() Dim GraphRange As String Dim Graph As ChartObject Dim lastRow As Long Set Graph = Sheets("sheet2").ChartObjects.Add(150, 27, 350, 200) lastRow = Sheets("sheet4").Range("A" & Rows.Count).End(xlUp).Row GraphRange = Sheets("sheet4").Range(Cells(1, 1), Cells(lastRow, 1)).Value If Sheets("sheet1").CheckBox1.Value = True Then 'CheckBox1にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 2), Cells(lastRow, 2)).Value End If If Sheets("sheet1").CheckBox2.Value = True Then 'CheckBox2にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 3), Cells(lastRow, 3)).Value End If If CheckBox3.Value = True Then 'CheckBox3にチェックがあれば GraphRange = Sheets("sheet4").Range(Cells(1, 4), Cells(lastRow, 4)).Value End If Graph.Chart.ChartWizard Source:=Sheets("sheet4").Range(GraphRange).Value, _ Gallery:=xlLine, Format:=1, PlotBy:=xlColumns, _ CategoryLabels:=1, SeriesLabels:=1, HasLegend:=True End Sub

  • エクセル VBA OptionButtonからTextBox

    すいません! OptionButtonなら 下記の記述でエラー表示を 簡単にできるのですが これがOptionButtonではなく TextBoxならどのように変化したら 良いのでしょうか? すいません、教えて下さい! Private Sub 記録_Click() Dim i As Integer Dim Cnt As Integer Cnt = 0 For i = 1 To 6 Step 1 If Me.Controls("OptionButton" & i).Value Then Cnt = i Exit For End If Next i If Cnt = 0 Then MsgBox "選択されていません" Exit Sub End If If Me.Controls("Combobox" & Cnt).Value = "" Then MsgBox Me.Controls("OptionButton" & Cnt).Caption & " の内容が選択されていません" Exit Sub End If With 記入フォーム .TextBox5.Value = Me.Controls("OptionButton" & Cnt).Caption .TextBox6.Value = Me.Controls("Combobox" & Cnt).Value End With Unload Me End Sub

  • 【Access】サブフォームの項目選択時、対応するコントロールの有効無効を制御する方法

    サブフォーム内にテーブル名tblのデータを帳票フォームで連結し、 サブフォーム内のチェックボックスをクリックすると、 対応するコンボボックスの有効無効を制御したい (ID=1のチェックボックスクリック時、ID=1のコンボボックスの有効無効を制御)と思いましたが、 どのチェックボックスをクリックしても、 ID=0~ID=2のすべてのコンボボックスが有効になったり、無効になったりしてしまいました。 【テーブル名:tbl】 ID, checkbox, combobox 0, false, A 1, true, B 2, false, C 【サブフォーム名のチェックボックスのクリックイベント】 Private Sub checkbox_Click() If Me.checkbox = True Then Me.combobox.Enabled = True Else Me.combobox.Enabled = False End If End Sub 何かしら添え字を渡す事ができれば、対応できるのではと思いましたが、 どのように記述すればよいか分かりませんでした。 その為、上記のような場合、個別で制御する方法をご存知の方がいらっしゃいましたら、 ご教示いただければと思います。 よろしくお願いします。

  • Excel VBEでActiveXコントロールの値を効率的に取得する方法

    エクセルシート状にActiveXコントロールのチェックボックス、テキストボックスを多数配したアンケートを作成しています。 <イメージ> 問題文 □回答候補1 □回答候補2 □回答候補3 自由記入欄 (テキストボックス) ※四角の部分が複数回答可のチェックボックスになっており、テキストボックスに自由記入をしてもらう形です。 複数人でアンケートを作成、改良しているため、追加や削除を加える必要から、オブジェクト名を任意に設定しています。 たとえば「TextBox11001」「CheckBox22010」といった形なのですが、問1の小問1の選択肢1、問2の小問2の選択肢10という意味であるため、番号は飛び飛びです。 電子データを配布し、回収後、全員分のデータを一覧表にするマクロを作成しています。 設問ごとに、チェックがあれば、1、なければ0、テキストはそのまま転記という形です。 (イメージ) 名前 問1-1-1 問1-1-2 問1-1-3 問1-2-1 問1-2-2 問1自由… ○○   1     0     1    0    1 コメント △△   1     1     0    1    0 コメント 集計表の見出しは設問が割り当てられており、 チェックボックス、テキストボックスがアンケートの順番に全て一行に並ぶように作っています。 開いた記入済みアンケートを次々と開いて(この部分は省略)のデータ(シート1~3がSht1~3、また集計用ブックにある集計シートがShtAと定義してある)を所定のセルへ転記するものです。 ShtA.Range("D14").Value = Sht3.TextBox321001.Text ShtA.Range("F14").Value = Sht3.TextBox321002.Text ShtA.Range("H14").Value = Sht3.TextBox321003.Text ShtA.Range("J14").Value = Sht3.TextBox321004.Text ShtA.Range("L14").Value = Sht3.TextBox321005.Text ShtA.Range("N14").Value = Sht3.TextBox321006.Text ShtA.Range("P14").Value = Sht3.TextBox321007.Text ShtA.Range("Q14").Value = Sht3.TextBox3210.Text If Sht1.CheckBox110101.Value = True Then ShtA.Range("C4").Value = 1 Else ShtA.Range("C4").Value = 0 End If If Sht1.CheckBox110102.Value = True Then ShtA.Range("D4").Value = 1 Else ShtA.Range("D4").Value = 0 End If If Sht1.CheckBox110201.Value = True Then ShtA.Range("G4").Value = 1 Else ShtA.Range("G4").Value = 0 End If 全問コピー&ペーストなどで、セル番地だけ入れ替えて作ったところ、作業自体はうまくできました。 しかし、設問や選択肢が多いため、同じような記述が300個ほど続いてしまい、非常に煩雑です。 もっと効率的に書く方法はないでしょうか。

  • 別の列のデータを検索してセルの色を変える

    Private Sub Worksheet_Change(ByVal Target As Range) If (Target.Column <> 1) And (Target.Column <> 5) Then Exit Sub If Not IsNumeric(Target.Value) Then Exit Sub Target.Offset(0, 1).Value = Now() End Sub 上記のスクリプトで 「1列目にナンバーを記入すると2列目に、5列目にナンバーを記入すると6列目に時刻が自動的にセルに入る」ようになっています。 これに追加で 「5列目にナンバーが記入されると、そのナンバーと同じものを1列目から探し出して、1列目のセルの色を薄い青にする。なければなしとアラートを出す」 ように改造したいのですが どうすればいいでしょうか? どうかお願いいたします。

  • EXCEL VBA 

    Excel VBAで アンケート集計をしたいと思い、プログラムを作ったのですが、J列までは入力がうまくいくのですが、K列にデータを入れて次の行にデータを入れると もともと存在していたKれつのデータが消えてしまします。 どう修正すれば ちゃんとデータが残ってくれるのでしょうか?  誰か教えてください Option Explicit Private Sub UserForm_Initialize() Dim チェックボックス As Control With cboBlood .AddItem "A型" .AddItem "B型" .AddItem "O型" .AddItem "AB型" End With cboBlood.ListIndex = -1 txtNo.Value = WorksheetFunction.Max( _ [Database].Resize(, 1)) + 1 txtNo.Enabled = False txtName.Text = "" optMale.Value = True txtAge.Value = 0 For Each チェックボックス In fraOS.Controls チェックボックス.Value = False Next txtName.SetFocus End Sub Private Sub cmdEntry_Click() Dim 行 As Long Dim 確認 As Integer 確認 = MsgBox("データを登録します。" _ & "よろしいですか?", vbYesNo) If 確認 <> vbYes Then Exit Sub 行 = [Database].Rows.Count + 1 [Database].Cells(行 - 1, 1).EntireRow.Insert [Database].Offset(行 - 1).Resize(1).Copy _ [Database].Cells(行 - 1, 1) [Database].Offset(行 - 1).Resize(1).ClearContents [Database].Cells(行, 1) = txtNo.Value [Database].Cells(行, 2) = txtName.Text If optMale.Value = True Then [Database].Cells(行, 3) = "男性" Else [Database].Cells(行, 3) = "女性" End If [Database].Cells(行, 4) = cboBlood.Text [Database].Cells(行, 5) = txtAge.Value If chkWin.Value = True Then _ [Database].Cells(行, 6) = "○" If chkMac.Value = True Then _ [Database].Cells(行, 7) = "○" If chkLinux.Value = True Then _ [Database].Cells(行, 8) = "○" If chkOther.Value = True Then _ [Database].Cells(行, 9) = "○" If chkOther.Value = True Then _ [Database].Cells(行, 10) = "○" Unload frmNew End Sub Private Sub cmdCancel_Click() Unload frmNew End Sub

専門家に質問してみよう