VBAユーザーフォームについて質問
- エクセルのユーザーフォームでコンボボックスで選択した値に応じてテキストボックスの内容を別のセルに転記したいです。
- プルダウン選択せずにテキストボックスに数字を入力した場合にエラーメッセージを表示したいです。
- VBAのコードを一部載せます。
- ベストアンサー
vba ユーザーフォームについて
勉強のためにvb勉強中です。エクセルのユーザーフォームについて質問です。 コンボボックス 01 02 のどちらかを選択すると、テキストに入力した数字は、01を選択したら11行、02を選択したら12行に転記できるようにしたいのですが、if文を使うのだろうと思うのですが、教えていただけないでしょうか。 私が途中まで作成した載せておきます。よろしくお願い申し上げます。 Private Sub CommandButton1_Click() Dim rc As Long Dim retu As Long Dim Ctrl As Control If Me.txtComboBox1.Value = "" Then MsgBox "社員名を選択してください!", vbOKOnly Me.txtComboBox1.SetFocus Exit Sub End If rc = MsgBox("件数を入力しますか?", vbYesNo) If rc = vbYes Then MsgBox "実行する" Else MsgBox "中止しました" Exit Sub End If retu = Cells(3, Columns.Count).End(xlToLeft).Column + 1 Cells(3, retu).Value = Me.txtComboBox1.Value ←社員を選択 Cells(4, retu).Value = Me.txtsuzuki.Value ←売れた件数 Cells(5, retu).Value = Me.txttoyota.Value ←売れた件数 Cells(6, retu).Value = Me.txthonnda.Value ←売れた件数 For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" End If Next Ctrl End Sub また、テキストボックスに数字だけ入力して、プルダウン選択してないとエラ~メッセージも出るようにしたいです...
- Visual Basic
- 回答数4
- ありがとう数1
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>星の部分がいまいちどのようにコードにすればよいかわかりません >ちなみに行は変数で指定はしていません。 '// Ifの次はElseが普通ですが、 '// TextBox1が未入力の場合に備えて、ElseIf '// にしています。未入力のケースを忘れるのが多いです。 If TextBox1.Text = "01" Then Cells(11, retu).Value = Me.仮1.Value ElseIf TextBox1.Text = "02" Then Cells(12, retu).Value = Me.仮2.Value End If '// TextBox1の場合分けが多い場合は、 '// 次のような書き方が有効です Select Case TextBox1.Text Case "01" Cells(11, retu).Value = Me.仮1.Value Case "02" Cells(12, retu).Value = Me.仮2.Value Case "03" Cells(13, retu).Value = Me.仮3.Value Case "04" '// 同様に続ける Case Else '// 未入力やおかしなデータへの対応です。 '// Elseが必要と思っている人は少ないですね。 '// 1行空行を作って、処理は書かないでいいでしょう。 End Select でしょうか。TextBox1は、01、02を入力するテキストボックス名です。 エディタに打ち込んだだけです。スペルミスなどがあるかもしれません。 Excel VBAの勉強をされているそうですが、 Excel VBA 入門講座へようこそ!! http://excelvba.pc-users.net/ MOUGモーグ https://www.moug.net/tech/exvba/ などを見られてはどうでしょうか。急がば回れです。 ご参考に。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17068)
画像も出てないし、やりたいことがはっきりしない。 「マルチメディアファイルは削除されたか見つかりません。」 ーー 小生が、勝手に想像して作ってみた。 質問者のコードや既回答と違うので、良くも悪くも参考になるのでは。 ーー ・ユーザーフォームを1つ挿入。(操作) ・そこにテキストボックスを1つ貼り付け(操作) ・またコンボボックスを1つ貼り付け(操作) ・そこにアイテムを2つ追加 (VBA)デザインモードでのユーザーフォームのコードの表示をクリックして出る画面に) Private Sub UserForm_Initialize() UserForm1.ComboBox1.AddItem "01" UserForm1.ComboBox1.AddItem "02" End Sub ・コマンドボタンを1つ貼り付け。(操作) フォームへの入力が(1人分)終わったことをしらせるため、必要かと思う。 ・コマンドボタンのクリックイベント(VBA)デザインモードでのコマンドボタンをダブルクリックしてして出る画面に) Private Sub CommandButton1_Click() ’MsgBox UserForm1.ComboBox1.Text Select Case UserForm1.ComboBox1.Text Case "01" Range("A11") = UserForm1.TextBox1.Text Case "02" Range("A12") = UserForm1.TextBox1.Text End Select End Sub == 実行について Sub/UserFormの実行 シートにユーザーフォームが現れる。 テキストボックスに「山田」と入力 コンボボックスで「01」を選択 コマンドボタンをクリック A11に「山田」がセットされる ーー ’次に テキストボックスに「佐藤」と入力 コンボボックスで「02」を選択 コマンドボタンをクリック A12に「佐藤」がセット == 雑感 >if文を使うのだろうと思う いろいろあずぜよ。わざとCaseにした。 >Meキーワードについて Googleで検索して、よく勉強してください。 「excel vba Meキーワード」」 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12134815137 私は、今のところなるべく使わない。 ーーー 質問者は、そばに指導者が居ないようで、なんとなく危なっかしい感じ。
- nishi6
- ベストアンサー率67% (869/1280)
元の転記する行を「gyou = 4」としています。 TextBox1に入力があれば、01、02に対応して、11、12行に書き込みます。 TextBox1に入力がない時どうしたいか書いてないので、初期値の「gyou = 4」の4行目を使いました。コード中のコントロール名は実情に合うように変更してください。 Dim retu As Integer Dim gyou As Integer retu = Cells(3, Columns.Count).End(xlToLeft).Column + 1 gyou = 4 '// 元の書き込む行(何か定義してる?) If ComboBox1.ListIndex = -1 Then MsgBox "選択していませんよ" Else If TextBox1.Text = "01" Then gyou = 11 ElseIf TextBox1.Text = "02" Then gyou = 12 End If Cells(gyou, retu) = "書きたいデータ" End If
補足
回答いただきましてありがとうございます。もう1点質問なのですが Cells(3, retu).Value = Me.txtComboBox1.Value ←社員を選択 Cells(4, retu).Value = Me.txtsuzuki.Value ←売れた件数 Cells(5, retu).Value = Me.txttoyota.Value ←売れた件数 Cells(6, retu).Value = Me.txthonnda.Value ←売れた件数 *Cells(11, retu).Value = Me.仮1. Value *Cells(12, retu).Value = Me.仮2.Value 星の部分がいまいちどのようにコードにすればよいかわかりません^^; ちなみに行は変数で指定はしていません。 ご回答いただけましたら大変助かります。よろしくお願い申し上げます。
- nishi6
- ベストアンサー率67% (869/1280)
>テキストに入力した数字は、01を選択したら11行、02を選択したら12行に転記できるようにしたい どの列に入力するか書かれていないので、retuとし、テキストをTextBox1とすると、 Dim rw As Long Const retu = 2 If ComboBox1.ListIndex <> -1 Then If ComboBox1.Text = "01" Then rw = 11 ElseIf ComboBox1.Text = "02" Then rw = 12 End If Cells(rw, retu) = TextBox1.Text End If でしょうか。質問の意味を把握できていない気がします」。 >テキストボックスに数字だけ入力して、プルダウン選択してないとエラ~メッセージも出るようにしたいです テキストボックスとは、コンボボックスの選択窓のことでしょうか。 コンボボックスのStyleプロパティが「fmStyleDropDownCombo」の場合、Listにないデータを入力できます。Listからのみの選択にする場合は「fmStyleDropDownList」にする必要があります。 fmStyleDropDownLisにしています。未選択は、ListIndexでチェックしています。 If ComboBox1.ListIndex = -1 Then MsgBox "選択していませんよ" Else MsgBox ComboBox1.Text & "を選択しました" End If
補足
回答ありがとうございます! 質問が下手で申し訳ありません。 イメージ画像を追加しておきます。 ちなみに列は変数で宣言しております。 retu = Cells(3, Columns.Count).End(xlToLeft).Column + 1 1つのテキストボックスに選択により さらに転記するセルを変えたいのです。 01だとしたら、11行 02だとしたら12行 よろしくお願いします
関連するQ&A
- vba ユーザーフォームにて質問
勉強のためにvbaにユーザーフォームを作っています。 画像のとおり青色が塗られている箇所に、ユーザーフォームで社員名、件数を 転記したいです。 ユーザーフォーム 社員名 件数 を入力したら範囲はC3からC15転記されます。 転記終わったら、D3からD15に転記。この作業をH列まで行いたいのですが、 C3の列以降転記できません。 お答えできる方いればよろしくお願いします。 Private Sub CommandButton1_Click() Dim rc As Long Dim retu As Long Dim Ctrl As Control If Me.txtComboBox1.Value = "" Then MsgBox "社員名を選択してください!", vbOKOnly Me.txtComboBox1.SetFocus Exit Sub End If rc = MsgBox("件数を入力しますか?", vbYesNo) If rc = vbYes Then MsgBox "実行する" Else MsgBox "中止しました" Exit Sub End If retu = Cells(2, Columns.Count).End(xlToLeft).Column + 1 Cells(3, retu).Value = Me.txtComboBox1.Value ←社員を選択 Cells(4, retu).Value = Me.txtsuzuki.Value ←売れた件数 Cells(5, retu).Value = Me.txttoyota.Value ←売れた件数 Cells(6, retu).Value = Me.txthonnda.Value ←売れた件数 For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" End If Next Ctrl End Sub
- ベストアンサー
- Visual Basic
- VBA ユーザーフォーム
VBA初心者です。以下の様なソースを見つけました。この場合は、文字を検索するとD1 にその該当番号が表示されます。 ※A列には番号、B列には文字列 そうではなく、そのクリックした行のA列にセルが移動し、ユーザーフォームが閉じられる様にできますでしょうか? よろしくお願い致します。 Private Sub ListBox1_Click() Sheets("Sheet1").Range("D1").Value = ListBox1.Value End Sub Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) Dim v() As Variant Dim c As Range Dim k As Long ListBox1.Clear With Sheets("Sheet1") With .Range("A1", .Range("A" & .Rows.Count).End(xlUp)) ReDim v(1 To 2, 1 To .Rows.Count) For Each c In .Cells If c.Offset(, 1).Value Like TextBox1.Value & "*" Then k = k + 1 v(1, k) = c.Value v(2, k) = c.Offset(, 1).Value End If Next If k = 0 Then MsgBox "指定の値は存在しません" Else ReDim Preserve v(1 To 2, 1 To k) ListBox1.List = WorksheetFunction.Transpose(v) End If End With End With End Sub
- ベストアンサー
- Excel(エクセル)
- エクセル 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
- ベストアンサー
- オフィス系ソフト
- Excel VBAで検索(Win2000 Excel2000)
現在、下記のようなコードを書いています。データテーブルの縦と横の検索値を探してその列数と行数を返したいのですが、下記の Sub検索1 と Sub検索2 を1つのSubで実行させるにはどうしたらよいのでしょうか?よろしくお願い致します。 ----------------------------------------- Sub 検索1() Worksheets("Data").Activate Dim x As Integer For x = 3 To 22 If Cells(2, x).Value >= 12 Then MsgBox x Exit Sub End If Next MsgBox "見つかりません" End Sub --------------------------------------------- Sub 検索2() Worksheets("Data").Activate Dim i As Integer For i = 4 To 42 If Cells(i, 2).Value = "A" Then MsgBox i Exit Sub End If Next MsgBox "見つかりません" End Sub
- ベストアンサー
- オフィス系ソフト
- エクセル ユーザーフォームでVLOOK
ユーザーフォームのテキストボックスで、ご教示お願いいたします。 現在、以下のようなコードこちらで教えていただきセルに入力をしております。 テキストボックス5に値を入れ、 listのシートから該当する文字をテキストボックス6に表示させたいと思っております。 ■現在のコード '// Private Sub CommandButton1_Click() Dim LastRow As Long 'ここはキャメル形式やパスカル形式にします/大文字は定数です。 Dim i As Long '/テキストボックスに値があるか調べる For i = 1 To 7 Next i '/セルに書き込み With Worksheets("Sheet1") LastRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1 For i = 1 To 7 .Cells(LastRow, i).Value = Me.Controls("TextBox" & i).Value Next End With '/TextBox1-7をクリア If MsgBox("テキストボックスを空にしてよろしいですか?", vbQuestion + vbYesNo) = vbYes Then For i = 1 To 7 Me.Controls("TextBox" & i).Value = "" Next i End If 'TextBox1にフォーカスを移動 Me.TextBox1.SetFocus End Sub ■付け足したいコード Private Sub textbox5_change() Dim temp, x temp = Me.textBox5.Value If IsNumeric(temp) Then temp = Val(temp) x = Application.VLookUp(temp, Sheets("list").Range("a1:b20"), 2, False) If Not IsError(x) Then Me.TextBox6.Value = x Else MsgBox Me.TextBox5.Value & " はリストにありません" End If End Sub 【質問内容】 付け足したいコードは上記の通りですが、どのように付け足せばいいのかが分からず、 困っております。 度々で申し訳ありませんが、テキストボックス5の値を見て、 テキストボックス6に表示させるやり方をご教示お願いいたします。
- 締切済み
- その他MS Office製品
- エクセルのユーザーフォームでご教授ください
マクロの知識はほぼなく、調べながらエクセルの入力用のユーザーフォームを作りましたが、うまく作動しません。 UserForm1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Option Explicit Private Declare Function ReleaseCapture Lib "user32" _ () As Long Private Sub UserForm_Initialize() Me.Show End Sub Private Sub Button_cxl_Click() Me.Hide End Sub Private Sub ok_Click() Dim RowNum As Long Dim Ctrl As Control RowNum = Cells(Rows.Count, 1).End(xlUp).Row + 1 Cells(RowNum, 1).Value = Me.txt_date Cells(RowNum, 2).Value = Me.txt_guest Cells(RowNum, 3).Value = Me.txt_person Cells(RowNum, 4).Value = Me.txt_begin Cells(RowNum, 5).Value = Me.txt_finish For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" RowNum = 0 End If Next Ctrl Me.Hide ReleaseCapture UserForm2.Show vbModal End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ UserForm2 ~~~~~~~~~~~~~~~~~~~~~~~~~ Option Explicit Private Declare Function ReleaseCapture Lib "user32" _ () As Long Private Sub UserForm_Initialize() End Sub Private Sub ButtonEnd_Click() Unload Me UserForm1.Hide End Sub Private Sub ButtonNext_Click() Unload Me ReleaseCapture UserForm1.Show vbModal End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ Module1 ~~~~~~~~~~~~~~~~~~~~~~~~~ Sub ユーザーフォーム() UserForm1.Show End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~ UserForm1を開き、Button_cxlで閉じず、もう一度Button_cxlをクリックで閉じる。 UserForm1を開き、Button_okでUserForm2を出し、ButtonEndをクリックでUserForm1にもどる(1と2を数度行き来しても同じ) UserForm1を開き、Button_okでUserForm2を出しButtonNextをクリックでUserForm1にもどりButton_cxlをクリックで閉じず、もう一度クリックしても閉じず、三回目で閉じる。 現状、エクセルを開いた直後のみで発生してます。 一度ユーザーフォームを出し、閉じたあとは意図通り動き、再度エクセルを開くまで発生しません。 ちなみにUserForm2の Private Sub ButtonEnd_Click() Unload Me UserForm1.Hide End Sub 部分の、UserForm1.HideをUnload UserForm1にすると、「オブジェクト変数または With ブロック変数が設定されていません」と出てデバックでModule1の UserForm1.Show が黄色になります。 どこが悪いか教えてください。
- ベストアンサー
- その他MS Office製品
- VBAで教えてください。
データがないときはExitSubしたいのですが、何処に記述すれば良いでしょうか? Sub 削除() Dim i As Long If MsgBox("データを削除します。よろしいですか?", vbYesNo) = vbYes Then Sheets("リスト").Select i = 5 Do Until i = 200 If Cells(i, 5).Value = Sheets("マスタ登録").Range("D5") Then Cells(i, 1).EntireRow.Delete End If i = i + 1 Loop Else Exit Sub End If End Sub
- ベストアンサー
- オフィス系ソフト
- Excelのユーザーフォームで別のファイルに転記
Excel2007です。 マクロを含んだデータファイルがあるのですが、マクロブックとデータブックは分割した方がよいと言われて今分割の方法を試しています。 「マクロブック.xlsm」にマクロを記述し、「商品在庫Data.xlsm」にデータが格納されています。 (まだ試験中で完全に分割できていないのでデータブックもxlsm形式ですが) マクロブックのユーザーフォームから「商品在庫Data.xlsm」ファイルの「商品マスタ」というシートに転記したいのですが、どうやっても「商品在庫Data.xlsm」で「商品マスタ」シートを指定して転記できません。 ユーザーフォームのコードは下記のような内容です。 「HinTouroku」コマンドボタンを押した時に商品マスタシートに内容が転記されるようになっています。 Option Explicit Private Sub HinTouroku_Click() '商品登録 Dim lRow As Long Dim s1 As String, s2 As String Dim Ctrl As Control With Workbooks("商品在庫Data.xlsm") Worksheets ("商品マスタ") lRow = .Range("A" & Rows.Count).End(xlUp).Row s1 = .Cells(lRow, "A").Value s2 = txtHinId.Text If s1 = s2 Then MsgBox "商品IDが重複しています" Exit Sub End If lRow = lRow + 1 .Cells(lRow, "a").Value = txtHinId.Text .Cells(lRow, "b").Value = txtSyohinmei.Text .Cells(lRow, "c").Value = txtHinRyaku.Text End With For Each Ctrl In Me.Controls If Ctrl.Name Like "txt*" Then Ctrl.Value = "" End If Next End Sub Private Sub TourokuClr_Click() '入力フォームのクリア Dim myCtrl As Control For Each myCtrl In Controls If TypeName(myCtrl) = "TextBox" Then _ myCtrl.Value = vbNullString Next End Sub Private Sub TourokuCls_Click() 'フォームを閉じる Unload Me End Sub http://vbaexcel.seesaa.net/category/7604114-2.html このサイトを参考にしながら書いてみたのですがどうしてもシートの指定ができず… どのように記述すればよいのでしょうか?
- ベストアンサー
- オフィス系ソフト
- ユーザーフォームの値の重複登録を中止するには
UserForm1の登録ボタン(CommandButton2)を押したときに、フォーム上の会社番号及び注文番号の二つの数値を参照して、Sheet1上の会社番号と注文番号の列から、すでに同じ会社番号で同じ注文番号が登録されてないか確認します。 例えば、フォーム上の会社番号2で注文番号104は、シート上でも会社番号2で注文番号104があるため、msgbox "既に登録済みです"を表示させて登録を中止するにはどうすれば良いでしょうか。 現状、登録ボタンを押しと時に実行させる処理は以下の通りです。 Private Sub CommandButton2_Click() Dim rc As Integer rc = MsgBox("記録を保存しますか?", vbYesNo + vbQuestion, "保存") If rc = vbYes Then If TextBox1.Value = "" Or TextBox2.Value = "" Or TextBox3.Value = "" Or TextBox4.Value = "" Then MsgBox "未入力な項目があります。" Else Dim tr As Range Set tr = Sheet1.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) tr.Offset(0, 0).Value = UserForm1.TextBox1.Value tr.Offset(0, 1).Value = UserForm1.TextBox2.Value tr.Offset(0, 2).Value = UserForm1.TextBox3.Value tr.Offset(0, 3).Value = UserForm1.TextBox4.Value MsgBox "保存しました。" End If Else MsgBox "キャンセルしました。" End If End Sub
- ベストアンサー
- Excel(エクセル)
- ExcelVBAでのユーザーフォームについて
ご回答ありがとうございました。 これといった資料がなく(探し方が悪いのかもしれませんが)、少ない経験値で複雑なというか面倒な処理のマクロ(VBA)を組まされることになり、困っているところです。当初の話だと「勉強しながらでよい」ということだったのですが、いろいろと仕事が次々と舞い込んできて、そんな余裕もなくせっぱ詰まり少ない知識で必死にやっています。 先にご回答いただいた内容で是非アドバイスをいただきたいと思い、新たに質問させていただきました。 ユーザーフォームでマルチページを作っています。そこでもコンボボックスを使うのですがそこの記述方法をアドバイス下さい。やっぱり記述場所がおかしいのか、クリックするとリストの内容がコンボボックスをクリックした分だけ繰り返してしまうことがあります。 ////////////////////////////////////////////////////// Private Sub UserForm_Initialize() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("対象年") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// とまぁ、結局コードは同じなのですが。 それと、結果をラベルに出させる場合には回答で記述いただいた ////////////////////////////////////////////////////// Private Sub ComboBox1_Change() Dim vTgYear As Variant vTgYear = ComboBox1.Value Label1.Caption = vTgYear - 1 & "~" & vTgYear + 1 & "年" End Sub ////////////////////////////////////////////////////// で、よいでしょうか? よろしくお願いいたします。
- ベストアンサー
- Visual Basic
お礼
色々と丁寧に教えてくださりありがとうございます。