マンガでよめる痔のこと・薬のこと

VB初心者です。よろしくお願いします。
visual basic2010expressにて作成してます
担当者の新規・更新のプログラムで テキストBOX(2)・LISTbox(1)・ボタンで構成されてます。
DBを読み込み LISTBOXに表示し
LISTBOXで セレクトされたものを テキストBOXに表示し 修正し
更新処理(DB更新・LISTBOX更新)をします。
新規の場合は テキストBOXに入力し 新規処理(DB追加・LISTBOX更新)をします。

DB更新迄はされるのですが リストボックスに反映されません。
再度 更新ボタンを押下すると 変更後の内容になります。

初心者の為 コードが分かりにくいと思いますがよろしくお願いします。

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
'**********リストボックスセット**********
LISTBOX_SET()
End Sub

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
'**********新規登録**********
'データベース接続用オブジェクト生成
Try
Dim CON As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\TEST.mdb")
'開始
CON.Open()
Dim selectcommand As String = "INSERT INTO tantousya (ta_no, ta_mei) VALUES ('{0}', '{1}' );"
Using cmb As OleDbCommand = New OleDbCommand( String.Format( selectcommand, TextBox1.Text, TextBox2.Text), CON)
cmb.ExecuteNonQuery()
End Using
'**********リストボックスセット**********
LISTBOX_SET()
End Try
End Sub

Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
End
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
'**********変更登録**********
'データベース接続用オブジェクト生成
Try
Dim CON As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\TEST.mdb")
'開始
CON.Open()
Dim selectcommand As String = "UPDATE tantousya SET ta_mei = '{0}' WHERE ta_no = {1};"
Using cmb As OleDbCommand = New OleDbCommand( String.Format(selectcommand, TextBox2.Text, TextBox1.Text), CON)
cmb.ExecuteNonQuery()
End Using     
'**********リストボックスセット**********
LISTBOX_SET()
End Try
End Sub
Private Sub LISTBOX_SET()
'**********リストボックスセット**********
'接続文字列
Dim i As Integer
'データベース接続用オブジェクト生成
Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\TEST.mdb")
Try
'開始
con.Open()
Dim SQLCom As OleDbCommand = con.CreateCommand
Dim selectcommand As String = "SELECT * FROM tantousya;"
Dim da As OleDbDataAdapter = New OleDbDataAdapter(selectcommand, con)
Dim ds As DataSet = New DataSet()
'データーセット()
da.Fill(ds)
Dim LIST As List(Of String) = New List(Of String)
      For i = 0 To ds.Tables(0).Rows.Count - 1
     LIST.Add(ds.Tables(0).Rows(i)("ta_no") & ds.Tables(0).Rows(i)("ta_mei")
Next
ListBox1.DataSource = LIST ・・・・・・・・・<ここのLISTの内容は変更になってます>・・・
Finally
'データベース終了
con.Close()
End Try
End Sub
Private Sub ListBox1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDown

TextBox1.Text = MID(ListBox1.SelectedItem,1,2)
    TextBox2.Text = MID(ListBox1.SelectedItem,3,10)
End Sub

このQ&Aに関連する最新のQ&A

A 回答 (1件)

DataSourceを変更した後は


再クエリーが必要です

ListBox1.Requery()

この回答への補足

Con.Colseが 必要だったみたいです。
正しい表示がされるようになりました
ありがとうございました。

補足日時:2011/08/01 11:59
    • good
    • 2
この回答へのお礼

回答ありがとうございました。

ListBox1.DataSource = LIST
ListBox1.Requery()としました。

'Requery'は system.windows.forms.listboxのメンバーではありません
と出てきてしまいます。


色々調べて再クエリの意味はわかったのですがどの様記述をするのかがわかりません

出来れば教えてもらえませんか、よろしくお願いします。

お礼日時:2011/07/30 19:57

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBAでユーザーフォームを再表示させたい。

ExcelのVBAでユーザーフォームを作成し、
Initializeイベントで初期化をし、コマンドボタンを
クリックしたら処理を行うように作成しました。
ところがコマンドボタンによって処理を行った後、
再度Initializeイベントを呼びたいんです。。
(コンボボックスの表示を更新する処理を
含んでいるため)
なんとかうまい方法はないでしょうか??

Aベストアンサー

まったく、トンチンカンな答えかも知れませんが・・・
> まったく、このコンボボックスの内容が変化しないんです。

UserForm4.ComboBox1.AddItem は後へ後へと追加するばかりだと思うんです。
つまり、下の方に変化した内容がありませんか?
最初から入れ直したいのであれば、コンボボックスをクリアする必要があると思うのですが。

で、3行目にクリアするのを追加してみました。

Private Sub UserForm_Initialize()
Dim i As Integer

UserForm4.ComboBox1.Clear

Worksheets("Sheet1").Select
Range("B4").Select
For i = 4 To 200
If Range("B" & i).Value <> "" Then
UserForm4.ComboBox1.AddItem Range("B" & i).Value
End If
Next i

End Sub

Q入力した値をコンボボックスにすぐに反映させる方法

テーブルでコンボボックスから選んでデータを入力したい場合、コンボボックスの内容を他のテーブルやクエリあるいは値リストから抽出する方法はわかりますが、コンボボックスの内容に該当するものが無い場合、一覧から選ばずに、手入力することにしたいと思っています。そこで、手入力した後次のレコードに移動した時にコンボボックスの内容に手入力した内容がすぐに反映するようにしたいのですが、うまい方法は無いでしょうか?私としてはいちいち他のテーブルを開いて入力したりせずにしたいのですが・・・

Aベストアンサー

同じテーブルからリストを取得する為には、一度レコードを保存する以外ないようです。そのため今まで設定した「データ入力のチェック」を"いいえ"に戻し、「リスト外入力時」のボックスから"[イベントプロジージャ]"の文字を消したうえで、「更新後処理」に設定したモジュールの中身を下記のように置き換えます。

' レコードを保存し、コンボボックスのリストを再作成します。

DoCmd.RunCommand acCmdSaveRecord
Me![(コンボボックス名)].Requery

(*)例によって同じフォーム内に、同じテーブル(クエリー)からリストを作っているコンボボックスがあるなら、その分も上記とまったく同じ構文で行を作成します。

あまり綺麗な方法ではないですが、これが一番現実的な方法のようです。

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

Qexcelのリストボックスで選択した項目をアクティブセルに入力方法

もしかしたら既出かもしれませんが・・・
フォームコントロールのリストボックスで入力範囲の指定したリストをリンクするセルをワークシート上にクリックしたセルに入力させる方法はありますか?
もし、不可能でしたら、ActiveXコントロールのリストボックスでも構いません。よろしくお願いいたします。

Aベストアンサー

そのリストボックスの、コードの表示で
Private Sub ListBox1_Click()
ActiveCell = ListBox1.List(ListBox1.ListIndex)
End Sub
と入れるだけ。
コントロールツールボックスのコントロールを、ワークシートに直接
貼り付けた場合。
WEBや解説書で、ListboxとかListindexなど調べましたか。

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

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

ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。

コンボボックスのコードで
Private Sub ComboBox1_Change()
moji1 = ComboBox1.Text
Range("A1").Value = moji1
のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。

マクロ1にて、上記と同じ
Range("A1").Value = moji1
というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。

原因をご存知の方はお教えください。

Aベストアンサー

原因については下記を参考にしてください。
http://pc.nikkeibp.co.jp/pc21/special/2007_gosa/eg5.shtml

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。

QExcelVBA でリストリストボックスに列見出しをコーディングでつける

エクセルVBAのフォームにリストボックスを作り、データーベースから読み出したデータを表示させています。

この時、各列にテーブル名とはちがう列名をつけたいのですが、シートに記述するのではなく、コーディングでつける事は出来ませんか?

ControlTipTextに「test1;test;test3;」と指定してみたりしましたが、駄目でした。

どなたかご教授、あるいは出来ません、シートに隠しか方法はありません、と全否定をしてください。

Aベストアンサー

Wendy02 です。配列で入れる方法を考えてみましたが、できませんでした。

結局、他の方法としては、ListBox の 上に、白のLabel をそれぞれのColumnにあわせて、表示するぐらいしか、思いつきません。(これは、論外でしょうね)

列見出し(フィールド)は、もともと、Excelのワークシートの、データベース用の仕様のひとつだから、Rangeオブジェクトでしか、ListBox の Header に入れることは、出来ないようです。

QExcel VBA コンボボックスの初期値の設定について

いつもお世話になっています。
Excel VBA コンボボックスの初期値の設定について教えてください。
ユーザーフォームを表示させた時、そこにあるコンボボックスには何も表示されていません。
コンボボックスのボタンを押すとちゃんと
「アジア」「ヨーロッパ」「アメリカ」等の語群が表示されます。

ユーザーフォームを表示させた時点でコンボボックスに「アジア」を表示させるにはどうすればいいか教えてください。
よろしくお願いします。

Aベストアンサー

UserForm Initialize
ComboBox1.Text = ComboBox1.List(0)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング