現在マクロで「設定ファイル」に書かれている内容をXMLファイルに変換したい、という作業をしています。設定ファイルにシートが複数あり、テキストボックスにシート名を入力しそれをマクロ実行時に参照して中身を持ってくる、というやり方をしているのですがテキストボックスに記述しても取得ができません・・教えてください・・・。
Private Sub TextBox1_change() Dim Name As String Name = Worksheets("Sheet1").Forms.TextBox.Text End Sub Sub XML() ~(略) sheetname = TargetWorkbook.Worksheets(i).Name If _ sheetname = "Name" _ Then Set SaveWorkSheet = ActiveSheet ~(略)
初心者でごめんなさい・・。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
ベストアンサー
提示のコードや説明から推測すると、下記のような状況でしょうか。
ワークシート「Sheet1」上にActiveXのテキストボックスが配置してある。
そのテキストボックスの名前は「Textbox1」である。
このテキストボックスに入力してあるテキストをVBAから取得したい。
これであってますか。
テキストボックスはリボンの挿入タブにある「テキストボックス」オブジェクトの可能性もありますが、Private Sub TextBox1_change()
というコードがあることからActiveXのテキストボックスのことと推測しました。
上記の推測があっているなら、
Worksheets("Sheet1").Textbox1.Text
で取得できます。
ちなにみ、提示の下記のコードは無意味ですね。
(.Forms.TextBox.Text
の間違いを .Textbox1.Text
に修正したとしても、)
vba
1Private Sub TextBox1_change() 2Dim Name As String 3 Name = Worksheets("Sheet1").Forms.TextBox.Text 4End Sub
プロシージャローカルの変数 Name に代入しても、他から参照することはできないので。
変数の適用範囲(スコープ) | ExcelのVBA入門
ご希望のことが、
vba
1 If _ 2 sheetname = "Name" _ 3 Then
の"Name"
にテキストボックスの入力値を入れたいのなら、
vba
1 If sheetname = Worksheets("Sheet1").Textbox1.Text Then
となります。
おまけ
他の人の回答で提案されているコンボボックス(プルダウン)を使う方法も紹介しておきます。
ワークシート上にActiveXのコンボボックスを配置します。名前は、ComboBox1 と自動でつきます。
そのワークシートのモジュールに下記のコードを記述します。
vba
1Private Sub Worksheet_Activate() 2 Dim ws As Worksheet 3 4 With ComboBox1 5 .Clear 6 For Each ws In TargetWorkbook.Worksheets 7 .AddItem ws.Name 8 Next 9 End With 10End Sub
これで対象ワークブック(TargetWorkbook)のワークシート名がドロップダウンリストから選択できます。
投稿2018/03/17 01:38
編集2018/03/17 09:33総合スコア34328
0
Worksheetにはるテキストボックスっていくつかの種類がありますよね。
どれでしょう?
挿入の図形にあるテキストボックスはShapesとして管理されています。
Debug.Print Worksheets("Sheet1").Shapes("テキスト ボックス 1").TextFrame2.TextRange.Text
ActiveXコントロールのテキストボックスを張っている場合には、次の様な記述になります。
Debug.Print Worksheets("Sheet1").TextBox1.Text
ちなみにコントロールの名称は、コントロールを選択すると名前ボックス(ワークシートシート左上のドロップダウンテキストボックス)に表示されます。編集するときに、そこに入力してください。
投稿2018/03/17 00:54
総合スコア472
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
worksheets,formsのように複数形になっているものは、worksheetやformの単体ではなくcollection(集まり)です。
集まりの中から1つを特定するためにindex(順番)、id、name(名前)といったものを指定する必要があります。
例えば、Worksheets("Sheet1")は、worksheetの集まりの中から"Sheet1"という名前で特定している訳です。
ところが、質問のコードでは、Forms のままなのでFormが特定されません。ここが問題だと思います。
Private Sub TextBox1_change() Dim Name As String Name = Worksheets("Sheet1").Forms.TextBox.Text End Sub
Worksheets("Sheet1")には Formが1つしかなくて、そのFormの中にはTextBoxが1つしかないと仮定すると、下記のように最初を意味するindexである (0)を付け加えることで動作するようになると思います。
Private Sub TextBox1_change() Dim Name As String Name = Worksheets("Sheet1").Forms(0).TextBox(0).Text End Sub
投稿2018/03/16 07:46
総合スコア6919
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
なぜテキストボックス?という疑問が他の回答者さんから出ていて私もそう思いますが、ここは純粋に回答してみたいと思います。
テキストボックスはActiveXコントロールのものしか使えないようなので、それを使っているものと思います。
開発メニューからデザインモードを選択した後、テキストボックスで右クリック→プロパティを選択してください。
プロパティウィンドウが開くのでオブジェクト名を確認してください。
例えばTextBox21のようになっていると思います。
あとはこの名前でコード上から参照すればよいだけです。
VBA
1Debug.Print TextBox21.Text
投稿2018/03/16 07:39
総合スコア17000
0
なぜテキストボックス??
入力規則のプルダウンで十分では?
それか、シート上のボタンを押すと、シート名の一覧を表示して、
ユーザーに選択してもらうとか。
5年間の開発経験では、シート名をテキストボックスに入力するという、
使いにくい仕様は考えた事もないですね・・・
※Excelの機能(今回ならプルダウン)を有効活用しないと、
Excelで開発するメリットが無くなります。。。
あと、↓ のような改行は非常に読みにくいです。。。
If _
sheetname = "Name" _
Then
※下記が推奨
If sheetname = "Name" Then
[インデント][処理]
Else
[インデント][処理]
End if
前途多難ですが、頑張ってください~学生さん
投稿2018/03/16 07:17
総合スコア1175
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。