VBA初心者のための変数表示に関するエラー解決方法

このQ&Aのポイント
  • VBA初心者の方が変数に取得した値をテキストボックスやコンボボックスに表示させるために実装したコードで、「実行時エラー'13'; 型が一致しません。」というエラーが発生しています。
  • 同じような方法で他のテキストボックスには値が表示されることが確認されていますが、特定のテキストボックスに値を表示させる際にエラーが発生します。
  • エラーの原因は型の一致しない部分があるため、変数の型を確認し、正しい型に変換することでエラーを解決できる可能性があります。
回答を見る
  • ベストアンサー

変数に取得した値をテキストボックスやコンボボックスに表示させた

アクセスで、変数に取得した値をテキストボックスやコンボボックスに表示させたいと思っています。例えば、まずクエリをひとつ作成します。そのクエリのレコードをループで配列変数に取得していきます。フィールド(IDと名前)レコード(件数は2件とします) public ID(2) as String public 名前(2) as String Sub temp() Dim Db As Database Dim rs As Recordset Dim I As Integer Set Db = CurrentDb Set rs = Db.OpenRecordset("Q_クエリ", dbOpenDynaset) rs.MoveFirst For I = 1 To 2 If IsNull(rs![ID]) = False Then ID(I) = rs![ID] If IsNull(rs![名前]) = False Then 名前(I) = rs![名前] rs.MoveNext Next I rs.Close Db.Close End Sub (この時点で変数に値は入っているようです。) フォームで作成したテキストボックスやコンボボックスに実行ボタンをクリックすると表示するというコードは下記のように記述してみました。 Private Sub 実行_Click() Call temp (標準モジュールを呼び出す) ID = ID(1)     名前 = 名前(1) (2)省略 End Sub すると、かならず「実行時エラー'13'; 型が一致しません。」とエラーが出ます。なにぶんVBA初心者になりますので、ご教授お願い致します。ちなみに同じような方法で、同一フォーム内に2つテキストボックスを用意し、片方に値を入力して実行するともう一方のテキストボックスにその値が表示すると言う実験は成功しています。もっと他に良いコードがあれば教えて下さい。お願いします。

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

  • ベストアンサー
  • laputart
  • ベストアンサー率34% (288/843)
回答No.2

ID = ID(2) 名前 = 名前(1) でエラーになります ID(2)という変数を宣言しているので ID が使えないのです。 Me!ID = ID(2)という事の出来ますが 混同しやすいので Dim XID(2) とか別の変数名を使う方が わかりやすいでしょう。 別回答 変数を使わずに直接フォームモジュールで データベースの値を取得する事も可能です。 Public Db As Database Public rs As Recordset で宣言しておいてから Private Sub 実行_Click() Set Db = CurrentDb Set rs = Db.OpenRecordset("Q_クエリ", dbOpenDynaset) rs.movefirst ID = rs!ID 名前 = rs!名前 End Sub

simple-t
質問者

補足

ありがとうございますm(__)m 表示しました!!そこで追加でお聞きしたいんですが、フォームで表示する際に何件かレコードがあるので、フォームの2件目にレコード2件目を、フォームの3件目に3個目のレコードをと言う風には出来ますでしょうか?

その他の回答 (1)

  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 配列変数の名前とテキストボックスやコンボボックスの名前が同じなのはよくないと思います。 ID = ID(1) とした場合に、左辺の「ID」は配列変数と認識されているのではないでしょうか。 その場合、左辺が配列で、右辺が単独の変数なのでエラーになるのではないでしょうか? したがって、テキストボックスやコンボボックスの名前を変更するか、 Me!ID.Value = ID(1) のようにプロパティを付ければ、いいと思います。 「名前」の方も同様です。

simple-t
質問者

補足

返答ありがとうございます。名前も変えて試してみたのですが、やはり同じエラーが出ます。標準モジュールで実行している間はきれいに配列変数に値が代入されているのですが、それをフォームで使おうとするとそこで型が一致しないというエラーになるようです。

関連するQ&A

  • コンボボックスの値取得について

    テーブルはAccess2003で作成 VBは6を使用しています。 Access2003で作成したテーブル(t_KEN)の県名をコンボボックス(cmbKen)に表示させ、選択したひとつの県名とその県コードを テキストボックス(txtKENMEI.text、txtKenCode.text)に格納したいと思います。 以下の様にコンボボックスに県名を表示する所までは できたのですが、そこから選択した県名と県コードをそれぞれの テキストボックスに格納する所がわかりません。 初歩的過ぎるのかもしれませんが、初心者であり何卒ご教授頂けます様 お願いいたします。 テーブル(t_KEN) KENCODE KENMEI 1 北海道 2 青森県 3 岩手県 4 秋田県 ・  ・ ・  ・ ・  ・ Private Sub cmbKen_GotFocus() Dim DB As Database Dim RS As Recordset Set DB = OpenDatabase("c:\TEST\jdb.mdb") Set RS = DB.OpenRecordset("t_KEN") Do Until RS.EOF Me.cmbKen.AddItem RS.Fields("KENMEI") RS.MoveNext Loop 'ここ以降の記述が困ってます。 txtKENMEI.Text=・・・ txtKenCode.Text=・・・ RS.Close Set RS = Nothing DB.Close Set DB = Nothing End Sub

  • フォーム内で複数のレコードを表示

    アクセスで、表形式のサブフォーム(S_フォーム)を作成し、データを入力するとテーブル(T_明細)に追加されるようになっています。これをサブフォームのテキストボックスに入力するのではなく、別のクエリ(Q_クエリ)にあるデータを実行ボタンを押すことでサブフォームのテキストボックスに表示するようにし、テーブルのレコード(何件もある)を入力させていきたいと思っています。下記のようにコードをまず作成してみました。 Public Db As Database Public rs As Recordset Private Sub 実行_Click() Dim Temp_count As Integer Dim I As Integer Set Db = CurrentDb Set rs = Db.OpenRecordset("Q_クエリ", dbOpenDynaset) Temp_count = DCount("ID", "Q_クエリ") For I = 1 To Temp_count If IsNull(rs![氏名]) = False Then 氏名テキスト = rs![氏名] If IsNull(rs![住所]) = False Then 住所テキスト = rs![住所] rs.MoveNext Next I End Sub すると、ループした内容が全て同じテキストボックスに上書きされていき、結局1つのレコードしか追加できない状態です。入力操作でENTERしていくとサブフォーム内で複数のレコードが入力出来るように、出来ないでしょうか??良い記述があれば教えてください。お願い致します。

  • access テキストボックスへSetFocus

    QRコード読み込み後にDBに書込み、テキストボックスへ戻るプログラムを作成しているのですが、SetFocusが聞きません。 【実装したいこと】 QRコード内に、カンマ区切りのデータが入っており、QRスキャン後Sprit関数で区切りDBに登録しております。 でその際に、連続して読取出来るようにするために、「AfterUpdate」しております。 【処理】 1.txtsTiket(テキストボックス)にQR読取データを挿入 2.Sprit関数で、データを区切りDBへ書込み 3.txtsTiket(テキストボックス)へ戻る 2.までは問題ありませんが、3.のtxtsTiketへ自動で戻りません。 ○コード Private Sub txtsTiket_AfterUpdate() 'DB変数 Dim db As Database Dim rs As Recordset '変数定義 Dim tID As Integer Dim aly As Variant Dim t店舗CD As Integer Dim t開局日 As Date Set db = CurrentDb() '店舗ID取得 Set rs = db.OpenRecordset("T_ステータス", dbOpenDynaset) rs.Filter = "登録日 " = Date t店舗CD = rs("店舗CD") rs.Close: Set rs = Nothing 'チケットテーブルオープン Set rs = db.OpenRecordset("T_sTiket", dbOpenDynaset) 'チケットID生成 If rs.EOF Then tID = 1 Else tID = DMax("sTiketID", "T_sTiket") + 1 End If 'QRデータ分割 aly = Split(txtsTiket, ",") rs.AddNew rs("sTiketID") = tID rs("店舗CD") = t店舗CD rs("Day-S-No") = aly(0) rs("部門CD") = aly(1) rs("科目CD") = aly(2) rs("チケット名") = aly(3) rs("宿泊日") = aly(4) rs("予約通番") = aly(5) rs("登録日") = Date rs("登録時間") = Time rs.Update Me.txtsTiket.Value = Null ここから ' Me.txtsTiket.SetFocus ' DoCmd.GoToControl "txtsTiket" ここまで rs.Close: Set rs = Nothing db.Close: Set db = Nothing End Sub 下記手法を試しましたが、両方ともうまくフォーカスが移動してくれません。 Me.txtsTiket.SetFocus DoCmd.GoToControl "txtsTiket" また、上記メソッドを、外部プロジージャーにしても動作しません。 DB書込み処理が終わった後、自動的にテキストボックスへ移動する方法はどうしてら良いでしょうかお教え頂けたら幸いです。

  • テキストボックスに変数を表示させたい

    access2003です。 フォーム1にテキスト0を配置し vbaで Private Sub Form_Open(Cancel As Integer) Dim 文字列 As String 文字列 = "a" End Sub と作成しました。 このときフォーム1をダブルクリックして開いた時に テキスト0に文字列に代入した変数を表示させるにはどうすればいいのでしょうか? テキスト0のコントロールソースに =[文字列] とやっても #Name? になってしまいます。 どうすれば読み取った変数をテキスト0に表示させることが可能なのでしょうか? よろしくお願い致します。

  • テキストボックスの表示について

    いつもお世話になります。VBAで質問があるのですが、ユーザーフォームを作り、コマンドボタンとテキストボックスを配置します。 Private Sub CommandButton1_Click() Dim i As Long  For i = 1 To 30   TextBox1.Text = i & "を入力しました"   Worksheets("Sheet1").Range("A1").Value = i & "回目です"  Next i End Sub と入力して実行すると、セルには1~30回まで順に書き込みがありますが、テキストボックスには最後の「30を入力しました」しか表示されません。 これを「1を入力しました」、「2を入力しました」、「3を・・・」というようにテキストボックスに順に表示させるにはどのようにしたらよいのでしょうか? よろしくお願いします。

  • VBA コンボボックスで選んだ値を取得するには

    ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。 コンボボックスのコードで Private Sub ComboBox1_Change() moji1 = ComboBox1.Text Range("A1").Value = moji1 のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。 マクロ1にて、上記と同じ Range("A1").Value = moji1 というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。 原因をご存知の方はお教えください。

  • 変数の値について

    変数の値について教えてください。 VB2010 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim A As Single A = 2.0 MsgBox(A) End Sub 上記のプロシジャを実行するとメッセージボックスに2と表示され 2.0と表示しません。 2.0と表示させるには、どのようにすればよいなでしょうか。

  • コンボボックスで選択された値の取得

    使用しているオブジェクトは Combo1,Text1,Command1です。 General Declarations ----------------------------    Dim Sent()    Dim Count_no() ------------------------------------------------- Private Sub Command1_Click() --------------------    Dim i    Dim Hyouji    For i = 1 To 3     If Combo1.Text = Sent(i) Then     Text1.Text = Count_no(i)     *******************************     Else     Text1.Text = Combo1.Text     *******************************     End If    Next i End Sub ------------------------------------------------- Private Sub Form_Load() -------------------------    Dim Sentence As String    Dim i    ReDim Sent(1 To 3)    ReDim Count_no(1 To 3)    For i = 1 To 3      Sentence = "Sentence" & i      Sent(i) = Sentence      Count_no(i) = i      Combo1.AddItem (Sent(i))    Next i End Sub ------------------------------------------------- 以上のソースを書いています。 もし"Sentence2"が選択・Command1クリックされたらText1には"2"が表示され、 (ここまでは出来ました) "12345"と入力・クリックされたら"12345"と表示されるようにしたいのですが、 配列以外の文字を入力した場合の条件(ソースの***内)を加えた途端 Combo1.TextがText1に表示されてしまいます。 条件の書き方が悪いのでしょうか? ややこしい説明ですみませんが、わかる方、回答お願いします。

  • プロシージャーの外で宣言した変数の値の破棄の仕

    プロシージャーの外で宣言した変数の値の破棄の仕方について教えてください。 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i End Sub ++++++++++++++++++ を実行すると、どんどん値が増えていきますが、 回避するには、 ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i i = 0 End Sub ++++++++++++++++++ とするしかないのでしょうか? ++++++++++++++++++ Dim i As Long Sub test() i = i + 10 MsgBox i Set i = Nothing End Sub ++++++++++++++++++ としたら、エラーになりました。

  • ループで呼び出しながら、追加クエリでテーブルに追加

    IDをループで呼び出しながら、追加クエリでテーブルに追加したいのですが、 値が入りません。 エラーなく動くのですが、テーブルに値が入っていないのです。 何がたりないのでしょうか? ――――――――――――― Public Sub CYUSYUTU_SEIKYUID2() Dim CYUSYUTU_SEIKYUID As String Dim recCount As Long recCount = DCount("*", "作業用請求先ID") Dim ID As String Dim DB As DAO.Database Dim RS As DAO.Recordset Dim i As Integer Dim strSQL As String Set DB = CurrentDb Set RS = DB.OpenRecordset("作業用請求先ID") RS.MoveFirst Do Until RS.EOF RS.Edit For i = 1 To recCount CYUSYUTU_SEIKYUID = RS.Fields("請求先ID(13)").Value DoCmd.RunSQL _ "INSERT INTO [作業用_▲入金DB] SELECT * FROM ▲入金 WHERE ▲入金.請求先ID='& CYUSYUTU_SEIKYUID &';" Next i RS.Update RS.MoveNext Loop RS.Close: Set RS = Nothing DB.Close: Set DB = Nothing End Sub

専門家に質問してみよう