• 締切済み

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個ほど続いてしまい、非常に煩雑です。 もっと効率的に書く方法はないでしょうか。

みんなの回答

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

こういった場合は、集計セルとコントロールの対応表を作成しそれを利用するのがベターでしょう。 設問の追加削除、コントロール名の変更などにもVBAコード自体に手を加えることなく簡単に対応できると思いますが。。。   集計ブックに対応表シートを作成する。 例えば、以下のように。 集計セル___コントロールのあるシート名___コントロール名__ _C4_______Sheet1________TextBox1101__ _D4_______Sheet1________CheckBox1102__ _E4_______Sheet2________TextBox2101__ _F4_______Sheet2________TextBox3102__      ・・・・・・      ・・・・・・ 以上。  

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

繰り返しのパターン(規則性)を見つけて、ループすればよいと思います。 >ShtA.Range("D14").Value = Sht3.TextBox321001.Text >ShtA.Range("F14").Value = Sht3.TextBox321002.Text >ShtA.Range("H14").Value = Sht3.TextBox321003.Text この部分、列は1列置きで、TextBoxのインデックスは連続のようですから Dim i As Long Dim j As Long For i = 4 To 18 Step 2   j = j + 1   ShtA.Cells(1, i).Value = Sht3.OLEObjects("TextBox" & 321000 + j).Object.Value Next というように出来ると思います。 >If Sht1.CheckBox110101.Value = True Then >ShtA.Range("C4").Value = 1 >Else >ShtA.Range("C4").Value = 0 >End If こちらは、CheckBoxのインデックスは連番のようですが 値の転記先Rangeの列番号にはどのような規則性があるか分かりますか? セル番地が繰り返されるパターンがどうなっているのか、実際例を提示してみてください。

回答No.1

>同じような記述が300個ほど続いて とは   「ShtA.Range("D14").Value = Sht3.TextBox321001.Text」 の文中の「Range("D14")」「TextBox321001」 のことですか? アンケートの種類は何種類くらいですか? 問題文の「回答候補」は3つあるのに、IF文では「TRUE」「ELSE」の2つに絞られている理由は? 「回答候補1」~「回答候補3」 の3つの評価はどこに表示されるのですか? 「問1-1-1 問1-1-2 ~ 」 の欄の個数はいくつですか? IF文の「ShtA.Range("C4").Value ~ ShtA.Range("G4").Value」 と 「ShtA.Range("D14").Value = Sht3.TextBox321001.Text ~ ShtA.Range("Q14").Value = Sht3.TextBox3210.Text」との関連は? >所定のセルへ転記 の「所定のセル」はどのセルを指すのですか? 何度読み返しても全体像が見えて来ない(概念は理解できる)のは、私だけですかね? 何も知らない相手に分かるように、具体的にどうしたいのかの説明がなされないと、回答したくてもできませんよね。

関連するQ&A

  • 条件判定について

    下記のようなコードを作成しましたが、チェックボックスがオンでもオフでもTextBox4.Valueの値が返ります。どこがいけないでしょうか。 Private Sub CommandButton2_Click() If CheckBox1.Visible = True Then Worksheets("sheet1").Range("a1") = TextBox4.Value Else Worksheets("sheet1").Range("a1") = TextBox3.Value End If End Sub

  • checkboxの値を取得する方法について

    チェックボックスをひとつ用意しています。 チェックがされていれば1、チェックされていなければ0を 取得し、最終的には更新処理を行いたいと思っていますが すべてチェックされている状態で更新処理(1)がされてしまいます。 $ABC = $_POST['AAA']; If($ABC[$count] = "1"){ SQL = "1" }else{ SQL = "0" } <input type = "checkbox" checked name="abcKbn[]" id = "AAA" value = "1"> SQLに問題がないと思うので、省略させて頂きます。 value値を配列abcKbn[]に値をセットし、If文でチェックを 行っていますが、この場合だとvalue = "1"のため すべての値が1となり、配列に格納されるかと思っています。(違ったらすいません) そのためIf文もすべて1になるかと・・・。 チェックがされていれば1、チェックがされていなければ0を value値に設定することは可能なのでしょうか? それ以外でもし良いやり方があれば アドバイスお願い致します。

    • ベストアンサー
    • PHP
  • ユーザーフォームのデータ

    ユーザーファームを2つ作成しました。 そのユーザーフォームのデータを表の最終行に追加をしたいのです。 Range("A65536").End(xlUp).Offset(1,0).select を使おうと思っていますが、うまくいきません。 どなたか教えてください。 <ユーザーフォーム1> Private Sub CommandButton1_Click() Sheet2.Range("H7") = TextBox1 Sheet2.Range("I7") = TextBox2 Sheet2.Range("J7") = TextBox3 Sheet2.Range("K7") = TextBox4 Sheet2.Range("L7") = TextBox5 Sheet2.Range("P7") = TextBox6 If CheckBox1.Value = True Then Worksheets(2).Range("M7") = "0:30" Else Worksheets(2).Range("M7") = "0:00" End If If CheckBox2.Value = True Then Worksheets(2).Range("R7") = "1000" Else Worksheets(2).Range("R7") = "0" End If If CheckBox3.Value = True Then Worksheets(2).Range("S7") = "3000" Else Worksheets(2).Range("S7") = "0" End If If CheckBox4.Value = True Then Worksheets(2).Range("T7") = "1500" Else Worksheets(2).Range("T7") = "0" End If Unload Me End Sub <ユーザーフォーム2> Private Sub CommandButton1_Click() Sheet2.Range("V7") = TextBox1 Sheet2.Range("W7") = TextBox2 Sheet2.Range("X7") = TextBox3 Unload Me End Sub

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

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • CheckBoxとTextBoxの値を貼付る方法

    よろしくお願いします。 Dim n As Long Dim r As Range Dim C, buf As String n = Cells(Rows.Count, "A").End(xlUp).Row + 1 Range("A" & n).Select For Each C In Controls If TypeName(C) = "CheckBox" Then If C.Value Then buf = buf & C.Caption & vbCrLf End If Next C ActiveCell.Offset(-1, 16).Value = buf & TextBox9.Value ’buf=チェックされている複数のCheckBoxのCaption ’この時のActiveCell.Offset(-1, 16).ValueにはbufとTextBox9の値も表示されています。 End If で、セルに入力して ActiveCell.Offset(0, 7).Value = ActiveCell.Offset(-1, 16).Value で、セルに貼り付けようとすると、bufの値のみ表示されてTextBox9の値が表示されません。 bufの値とTextBox9の値と両方をコピー表示する方法をお教えください。

  • tifを表示するマクロを教えてください。

    現在エクセル2003を使用していますが、以前は95・97を使用していました、その時に使用していたマクロがエラーを起こすようになりました。誰かお力添えをお願いします、マクロはこんな感じでした。 Private Sub CommandButton3_Click() TifPath = "P:\正式図\Mirror\コピー ~ test" For Each Cell In Range("M2") 'M列にファイルパスが書かれている場合 On Error Resume Next ActiveSheet.Hyperlinks.Add Anchor:=Cell, Address:=TifPath + Cell.Value, TextToDisplay:=Cell.Value On Error GoTo 0 Next If Range("M2") = "" Then MsgBox "図面ファイルを選択して下さい。", vblnformation, "チェック確認" Else Range("M2").Select Selection.Hyperlinks(1).Follow NewWindow:=True, AddHistory:=True '図面ファイルを開く End If Range("M2").Clear 'M2をクリアー CheckBox1 = False 'CheckBox1をクリアー CheckBox2 = False 'CheckBox2をクリアー CheckBox3 = False 'CheckBox3をクリアー TextBox1.Text = "" 'TextBox1をクリアー TextBox2.Text = "" 'TextBox2をクリアー TextBox3.Text = "" 'TextBox3をクリアー TextBox4.Text = "" 'TextBox4をクリアー End Sub

  • エクセルVBAもし同じ値なら!!

    エクセルVBAもし同じ値なら!! 開いているBookのFormから違うBookのSheet1のA列にDATAを入力することはできます。 例)TextBox1の値があれば次の列に入れることはできます。 悩んでいるのは (1)TextBox1と違うBookの"Sheet1”のA列が同じ値なら  MsgBox "既に登録済みです。"と表示させて  ElseでDATAを入力させたいです。 '使用行を格納 lngYcnt_K = SH1.UsedRange.Rows.Count For lng = 1 To lngYcnt_K 'TextBox1と同じ値を見つけてテキストボックスの値を入力。 If CStr(TextBox1.Text) = CStr(SH1.Cells(lng, 1)) Then MsgBox "既に登録済みです。" Else 最終行 = SH1.Range("a65536").End(xlUp).Row TextBox1.Text = SH1.Cells(lng, 1) TextBox2.Text = SH1.Cells(lng, 2) End If Next lng どのようにすれば良いのでしょうか?? 教えて下さい!

  • 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の計算について教えてください。

    お世話になります。 VBA超初心者です。 教えて頂けると助かります。 ユーザーフォームにテキストボックス1、2、3を作成し、それらを計算させて テキストボックス4に表示をさせたいと考えています。 テキストボックスに入力するパターンは以下の2種類です。 (1)すべてのテキストボックスに数値が入る (2)テキストボックス3のみに数値が入る 行いたい計算は、“(テキストボックス1 × テキストボックス2) + テキストボックス3”です。 曲りなりに作成してみましたが、テキストボックス3の数値を変えた時や削除した時などに、 テキストボックス4に入っている数値が残っていたりと、思うようにできません。 作成したものを掲載しておきます。 何卒よろしくお願いします。 テキストボックス1を変更したとき 1、3に数値が入っていれば、以下の計算を。 それ以外は“0”をテキストボックス4へ Private Sub TextBox1_Change() If TextBox1.Value = True And TextBox3.Value = True Then TextBox4 = Val(TextBox1.Text) * Val(TextBox2.Text) + Val(TextBox3.Text) Else TextBox4 = 0 End If End Sub テキストボックス2を変更したとき 2、3に数値が入っていれば、以下の計算を。 それ以外は“0”をテキストボックス4へ Private Sub TextBox2_Change() If TextBox2.Value = True And TextBox3.Value = True Then TextBox4 = Val(TextBox1.Text) * Val(TextBox2.Text) + Val(TextBox3.Text) Else TextBox4 = 0 End If End Sub テキストボックス3を変更したとき 1、2、3に数値が入っていれば、以下の計算を。 1か2に数値がなく、3に数値があれば、3の数値をテキストボックス4へ。 それ以外は“0”をテキストボックス4へ Private Sub TextBox3_Change() If TextBox1.Value = True And TextBox2.Value = True And TextBox3.Value = True Then TextBox4 = Val(TextBox1.Text) * Val(TextBox2.Text) + Val(TextBox3.Text) ElseIf TextBox1.Value = False or TextBox2.Value = False And TextBox3.Value = True Then TextBox4 = Val(TextBox3.Text) Else texbox24 = 0 End If End SubEnd Sub

  • Excel フォームコントロール オプション

    いつもお世話になってます。 ActiveXのOptionButtonやChekcBoxは複製Windowでは働かないので、フォームコントールを使おうと思います(フォームコントロールは動作します)。 例えばVBAなら,次のようにすればCheckBox2はoffになります。 これをフォームコントロールのチェック(ボックス)でやりたいのですが? Sub CheckBox1_Click() If CheckBox1.Value = True Then CheckBox2.Value = False" End Sub

専門家に質問してみよう