• ベストアンサー

TextBoxコントロールを引数として渡すには?

Public Sub MPlus(txt as TextBox) End Sub という関数があって、この関数に引数としてTextBoxコントロールを渡したいのですが、 Call MPlus(txt_MHantei)や、Call MPlus(Me.txt_MHantei)では、 TextBox.Textの値が引数として渡ってしまい型が違うというエラーが出てしまいます。 どうしたらよいのでしょうか?教えてください。

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

No.1です。 > Accessではなく、Excel2002です。 完全に思い込みで回答しました(汗) 大変失礼致しました。 さて、Excel VBAは殆ど触らないのですが・・・(汗) やってみたところ、ご質問の現象が再現できました。 どうやら、ExcelのSheetでは、「!」は対応していないようです。 ともあれ、解決策ですが、以下のようにしてみてください。 【現在】 Public Sub MPlus(txt As TextBox) 【修正】 Public Sub MPlus(txt As MSForms.TextBox)

TwinsAngel
質問者

お礼

回答ありがとうございます。 さっそく試してみたいと思います。

その他の回答 (1)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

こちらの環境(XP Pro/Access2003)で同様のものを 作成して確認した限りでは、型不一致エラーは 発生しませんでした。 推測になりますが、テキストボックスと同名の変数が 宣言されていないでしょうか。 (Option Explicitが宣言されていても、コントロールと  変数での名前重複はエラーになりません) 試しに、「Call MPlus(txt_MHantei)」の代わりに、 「Call MPlus(Me!txt_MHantei)」としてみてください。 (コントロール名と変数名が重複する場合、「.」では変数  やプロパティが優先ますが、「!」ではコントロールが  参照されますので) 参考(以前の回答): http://oshiete1.goo.ne.jp/qa4462597.html

TwinsAngel
質問者

補足

説明が足りなかったようで、すみません。 Accessではなく、Excel2002です。 テキストボックスと同名の変数は宣言されていません。 Call MPlus(Me!txt_MHantei)で、試してみたのですが、 「オブジェクトは、このプロパティまたはメソッドをサポートしていません」というエラーがでました。 Excelシート上にあるテキストボックスコントロールを、引数として渡したいのです。

関連するQ&A

  • With~EndWithの省略部分と引数指定について

    Private Sub Form_Load() With Form1.Text1   .Text = "2"   .Alignment = 2 'CENTER   Call subF(Form1.Text1, 5, 2) End With End Sub Private Sub subF(ByRef TextBox As TextBox, ByVal lngMAX As Long, ByVal lngMIN As Long)   TextBox.MaxLength = lngMAX - lngMIN End Sub With~End Withの中で指定しているオブジェクト(例の場合「Form1.Text」)のそれ自身をパラメータとして渡したい場合、 どのように記述すれば良いでしょうか? Meを指定しましたが当然エラーになります。イメージはMeに近いと思うですが。。。 どうか宜しくお願いします。 期待していない回答(1) With Form1   .Text1.Text = "2"   .Text1.Alignment = 2 'CENTER   Call subF(.Text1, 5, 2) End With 期待していない回答(2) 戻り値をMaxLengthの関数にすればよい。等々 With Form1.Text1   .Text = "2"   .Alignment = 2 'CENTER .MaxLength = functionF(5, 2) End With 期待していない回答(3) withステートメントはそもそもプロパティーの設定に使うべきであって、 そのような使い方は間違っている。等々

  • コントロールをロックしたい

    現在、VB.NETのWINDOWSアプリケーションで開発しており、DBはSqlserver2005を使用しています。 フォームLoad時に、指定したテキストボックスやボタンをロックする(readonly)共通関数を作成しようと考えています。 そこで、どのように記述すればいいか教えて下さい。 (1)フォームロード時 共通関数LookControlを実行する際、引数にコントロール名を渡したいのですが、  どのようにすればいいでしょうか?   Private Sub フォーム_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'テキストボックスの場合 Call LookControl(???, True) ←コントロール名の渡し方 'コンボボックスの場合 Call LookControl(???, True) 'ボタンの場合 Call LookControl(???, True) End Sub (2)共通関数LookControl  どのコントロールが引数で渡されてもロックができる関数を作りたい。  Module mod共通関数_表示 Public Sub LookControl(ByVal pControl As Control, ByVal pReadFlg As Boolean) Dim Textbox As TextBoxBase 'Dim Combbox As ComboBox 'Dim Bottan As Button Try For Each cldControl As Control In pControl.Controls If pControl.HasChildren = True Then LookControl(cldControl, pReadFlg) End If ' Select Case True Case TypeOf cldControl Is TextBoxBase TextBox = DirectCast(cldControl, TextBoxBase) TextBox.ReadOnly = pReadFlg Case TypeOf cldControl Is ComboBox             ??? Case TypeOf cldControl Is Button             ??? End Select Next Catch oExcept As Exception '例外が発生した時の処理 MessageBox.Show(oExcept.ToString, "例外発生") End Try End Sub End Module

  • VB2008 Formを関数の引数にする

    お世話になります VB2008で開発をしています Formを2つ作成し どちらも同じ名称のテキストBOX(TextBox1)コントロールを貼り付けています Publicの関数でそれぞれのFormに値をセットしたいのですが 「'TextBox1' は 'System.Windows.Forms.Form' のメンバではありません。」 とエラーが発生してしまいます 初歩的な質問で申し訳ありませんが ご助言頂けると助かります 宜しくお願い致します ソース: --------------------------------------------------- Module Module1 Public Sub Main() Dim Form1 As New Form1 Dim Form2 As New Form2 SetValue(Form1) SetValue(form2) End Sub Private Sub SetValue(ByVal obj As Form) obj.TextBox1 = "TEST" End Sub End Module ---------------------------------------------------

  • ExcelVBA TextBoxの値を取得できない

    Excel2010です。 2つのUserFormがあり(UserForm1・UserForm2とします)、UserForm1にはTextBox1~100を配置し、UserForm2にもTextBox1~150を配置しています。 それぞれのUserFormにおいて、そのUserForm名を変数に格納しておき、TextBoxの値を取得するコードを別のプロシージャ(「TextBoxチェック」)に書き、それを呼び出してTextBoxの値を格納しようとしましたができませんでした。 該当箇所のコードは以下のとおりです。 Public UFName As String 'UserFormの名前 Sub UserForm1処理() Const Num = 100 UFName = "UserForm1" Call TextBoxチェック(Num) End Sub Sub UserForm2処理() Const Num = 150 UFName = "UserForm2" Call TextBoxチェック(Num) End Sub Sub TextBoxチェック(Num As Integer) Dim i As Integer Dim Con As Control With UserForms.Add(UFName) For i = 1 To Num Set Con = .Controls("TextBox" & i) Debug.Print Con.Name Debug.Print .Controls("TextBox" & i).Value   (その他の処理のコードは省略) Next i End With End Sub 上のコードでは1つ目のDebug.Printの結果(TextBox名)は取得できていますが、2つ目のDebug.Printの結果(TextBoxの値)は空欄になってしまいます。 つまり、 With UserForms.Add(UFName)が、 Set Con = .Controls("TextBox" & i) では反映されているのに、 .Controls("TextBox" & i).Value では反映されていないということだと思います。 また、 Debug.Print .Controls("TextBox" & i).Value を Debug.Print UserForm1.Controls("TextBox" & i).Value とすると、UserForm1の値を取得できます。 また、 With UFName_UF を With UserForm1 にすると、 Debug.Print .Controls("TextBox" & i).Value の値は取得できます。 UserForm1とUserForm2において、TextBoxの値を取得する部分は共通しているため、その部分を別プロシージャにして呼び出して処理したいのですが、うまくいきません。 TextBoxの値を取得できない理由や、対処法が分かれば教えていただきたいです。

  • エクセル 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

  • ActiveRowをコントロール

    エクセル2007を使用しています。 ユーザーフォームのコードに以下のコードを書いてシートのセル情報をユーザーフォームに表示したいと考えています。 以下のコードでは「ActiveRow」の指定が固定になってしまうので、ユーザーフォームに「NEXT」ボタンを追加して、NEXTボタンが押されたら「AcviveRow」を一つづつ増やして表示させるという方法を教えていただけないでしょう。 VBA素人です。 よろしくお願いします。 尚、ActiveRowの初期値は「4」になります。 Private Sub UserForm_Initialize() Call Farst End Sub Sub Farst() Dim Data1 As String Dim Data2 As String Dim Data3 As String Dim Data4 As String Dim Data5 As String Dim Data6 As String Dim Data7 As String Dim Data8 As String Dim Data9 As String Dim Data10 As String ActiveRow = 4 With Worksheets("MDH,MDO") Data1 = .Cells(ActiveRow, 1) Data2 = .Cells(ActiveRow, 2) Data3 = .Cells(ActiveRow, 3) Data4 = .Cells(ActiveRow, 4) Data5 = .Cells(ActiveRow, 5) Data6 = .Cells(ActiveRow, 6) Data7 = .Cells(ActiveRow, 7) Data8 = .Cells(ActiveRow, 8) Data9 = .Cells(ActiveRow, 9) Data10 = .Cells(ActiveRow, 10) Me.TextBox1連番.Text = Data1 Me.TextBox2品番.Text = Data2 Me.TextBox3品番2.Text = Data3 Me.TextBox4品番3.Text = Data4 Me.TextBox5単価.Text = Data5 Me.TextBox6PO_NO.Text = Data6 Me.TextBox7発注日.Text = Data7 Me.TextBox8数量.Text = Data8 Me.TextBox9層.Text = Data9 Me.TextBox10備考.Text = Data10 End With End Sub

  • コントロール配列

    VB.NETでコントロール配列を行うときには、 dim txt as testbox = new textbox txt = me.textbox1 とすれば、フォーム上のtextbox1をtxtで 操作することが可能となりますが、 txt = me.textbox1というのは、me.textbox1の 参照先を代入していることとなるのでしょうか?

  • 引数にコントロール名を使用したい

    Excelのシート上にあるコンボボックスの値に応じて オートフィルタを制御したいと考えています。 コンボボックスは複数あるので、サブルーチン化した いのですが、コントロール名を引数として使用すると 「オブジェクトが必要です」と表示されます。 Sub 抽出(テーブル名,フィールド名,コントロール名) Range(テーブル名).AutoFilter フィールド名, コントロール名.Value End Sub Private Sub cb条件_Click() Call 抽出("テーブル1", 1, "コントロール1") End Sub

  • ACCESS VBA 判定に利用できる情報について

    下のようなテストプログラムを作ってみました。 サブルーチン chgcolorの中で、どちらの上位ルーチンからコールされたか で処理を切り替えたいと考えています。上位ルーチンからの引数を増やす ことなく、判定する方法はないものでしょうか。  アドバイスお願いします。 Private Sub txt1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Call chgcolor(Me.txt1) End Sub  : Private Sub txt1_DblClick(Cancel As Integer) Call chgcolor(Me.txt1) End Sub  : Sub chgcolor(a As Control) ◇txt1_MouseDownからコールされた場合(またはクリックイベントの場合) →a.BackColor = CLng("&HFF00FF") ◇txt1_DblClickからコールされた場合(またはダブルクリックイベントの場合) →a.BackColor = CLng("&HFFFFFF") End Sub

  • Excel VBA SetFocus

    環境:Excel 2002です UserForm1での質問です Flame5にTextBox14とTextBox15があります TextBox14とTextBox15のBeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)後 Flame2にあるTextBox1にSetFocusしたいのですがエラーが発生します 実行時エラー 2147467259(800004005) 異なるFlameにSetFocusする方法があるのでしょうか? Flame5の中でTextBox14及びTextBox15のSetFocusはできます TextBox14とのTextBox15のBeforeUpdateのプロシージャです Private Sub TextBox14_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox14.Text) <> 0 Then Dim a As Variant a = 100 - Val(Me.TextBox14.Text) Me.TextBox15.Text = a Dim i As Integer For i = 1 To 4 Me.Controls("TextBox" & i).Enabled = True Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色) Next i End If Me.TextBox1.SetFocus End Sub Private Sub TextBox15_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) If Len(Me.TextBox15.Text) <> 0 Then Dim a As Variant a = 100 - Val(Me.TextBox15.Text) Me.TextBox14.Text = a Dim i As Integer For i = 1 To 4 Me.Controls("TextBox" & i).Enabled = True Me.Controls("TextBox" & i).BackColor = &H80000005 '背景色(白色) Next i End If UserForm1.TextBox1.SetFocus End Sub ご支援願います