VBA初心者です。
エクセルのユーザーフォームでtextboxからの入力できる値を、1~10の整数か""(未入力)以外の場合にエラールーチンにgotoさせたいのですが、条件をすべて満足させる条件式が考えつきません。
お知恵を拝借できないでしょうか。
よろしくお願いします。

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

A 回答 (1件)

テキストボックスは、テキストボックスへのデータ入力の終了を知らせる良い仕組みが内容に思う。


(1)キー入力をした都度チェックする
これでも入力の終わりは、コマンドボタンクリックなどが、別途必要と思う。
(2)コマンドボタンを(設け、テキストボックスへ入力終了後に)クリックしたとき、テキストボックスのテキストの文字列を全桁チェックする
のような方式が考えられると思うが、初心者にはこのイベントの扱い、イベントの選択が難しいと思う。
当面勉強が進むまでは、INPUTBOXなどで対処したらどうか。
下記は十分自信はないが、一応挙げてみる。もっと良い回答(イベントの扱い方)が出れば、無視してください。
ただし(1)か(2)のどちらか一方を入れること。
ーー
テキストボックスへの入力は半角数字に限るという内容。
(1)即座チェック
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 Or KeyAscii > 57 Then
MsgBox "数字入力のこと"
SendKeys "{BKSP}"
End If
End Sub
(2)一括チェック
Private Sub CommandButton1_Click()
For i = 1 To Len(TextBox1.Text)
n = Mid(TextBox1.Text, i, 1)
If Asc(n) < 46 Or Asc(n) > 57 Then
MsgBox "数字入力のこと"
TextBox1.Text = ""
TextBox1.SetFocus
Exit Sub
End If
Next i
'(テキストを使った処理)
End Sub
    • good
    • 0
この回答へのお礼

 早速のご回答、ありがとうございます。
 やはり初心者には難解な条件のようですね (^^ゞ
 実際のフォームにはテキストボックスが5個ありますので、その都度INPUTBOXというのはあまり適していないかと思います。
 これらに入力後コマンドボタンを押すと、エラーチェックの後ワークシートに転記しますが、入力条件が面倒なのは5個のうちのひとつだけです。IF~THEN~ELSE IF とかで回避できればと思うのですが、入力内容を数字として取り込むと、""の場合が上手くいきませんし、小数の場合も別途判断が必要。文字列で取り込んでも問題があるんですよね・・・

お礼日時:2011/04/14 15:16

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

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

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

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

Qテキストボックス名を変数で指定してプロパティ設定?

Ms Access2000,2003 のVBAで
テキストボックスのプロパティを変更する時

Me.TextBoxName.Fontsize = 9

などと記述しますが、
この式の左側、テキストボックス名等を変数で処理することが出来るのでしょうか?

Aベストアンサー

ANo.1さんの回答の参照先は Visual Basic の例ですね。
AccessVBAはちょっと異なっていて癖がありますのでVBのコードをそのまま使えません。


■コントロール名(文字列型)を変数にする場合

Dim strCtl As String

strCtl = "TextBoxName"

Me.Controls(strCtl).FontSize = 9

.Controls は省略することもできます。

Me(strCtl).FontSize = 9


■コントロールオブジェクト(オブジェクト型)を変数にする場合

Dim objCtl As Object

Set objCtl = Me.TextBoxName

objCtl.FontSize = 9

Qエクセル VBA ユーザーフォーム リストボックスで選択した値をテキストボックスに自動表示

エクセル初心者です。
ユーザーフォームで検索窓を作成しリストボックスへ表示
         ↓
リストから選択すると同じユーザーフォーム内のテキストボックスに値が自動で表示
         
というフォームを作りたいのですがご教授お願いします。

A列   B列  C列   D列   E列
番号 / 品名 / 品番 / 原価 / メーカー
1    A   20×20  100  A社
2    A   20×30  150  A社
3    B   50×50  100  B社


下図のようなフォーマットで考えています。

Aベストアンサー

回答が付かないようなので、とりあえず・・・です。
シートの内容(A2:E4)をリストに表示し、そこで選択された行の内容をラベル?(A列・・・E列と表示されているところ)に表示するVBAを書いてみました。参考になりますかね?
もしかしたら、検索結果のみをリストに表示したいのでしょうか?
正直なところ、やりたいことがよくわからないので、適切な回答になっていないと思います。必要出れば追加で質問することをお勧めします。

以下、サンプルです。コードはユーザフォームの下に張り付けて下さい。
リストボックス名「ListBox1」
ラベル名「LabelA,LabelB,LabelC,LabelE」

Private Sub ListBox1_Click()
LabelA.Caption = ListBox1.List(ListBox1.ListIndex, 0)
LabelB.Caption = ListBox1.List(ListBox1.ListIndex, 1)
LabelC.Caption = ListBox1.List(ListBox1.ListIndex, 2)
LabelE.Caption = ListBox1.List(ListBox1.ListIndex, 4)
End Sub

Private Sub UserForm_Initialize()
ListBox1.ColumnCount = 5
ListBox1.RowSource = "Sheet1!A2:E4"
ListBox1.ListIndex = 0
End Sub

回答が付かないようなので、とりあえず・・・です。
シートの内容(A2:E4)をリストに表示し、そこで選択された行の内容をラベル?(A列・・・E列と表示されているところ)に表示するVBAを書いてみました。参考になりますかね?
もしかしたら、検索結果のみをリストに表示したいのでしょうか?
正直なところ、やりたいことがよくわからないので、適切な回答になっていないと思います。必要出れば追加で質問することをお勧めします。

以下、サンプルです。コードはユーザフォームの下に張り付けて下さい。
リストボックス...続きを読む

QAccess97のテキストボックスプロパティの入力規制について

質問はAccessのテキストボックスに
パスワードを入力する機能についてです。

パスワードは6桁の半角英数字のみ入力可能にしたいです。

現在、以下のことを試し、
半角英数字が6桁入力できるようになりました。

テキストボックスのプロパティで
定型入力部分に「password」と設定しテキストボックスに
パスワードが「****」で表示できるようにしました。
そして6桁にしたいので、
入力規制の部分に「like "??????"」と設定しました。

問題は半角英数字は入力できるのですが、
スペースや記号も入力できてしまうことです。
スペースや記号は入力できないように設定することは可能でしょうか?
また入力規制の部分で、半角英文字、半角数字を設定することは
可能でしょうか?

何か解決法がありましたら、教えてください。
よろしくお願いします。

Aベストアンサー

イベントプロシージャを使えば入力そのものをできなくすることができます。
Private Sub テキスト1_KeyPress(KeyAscii As Integer)
Select Case Chr(KeyAscii)
Case vbBack

Case " ", Is <= "0"
KeyAscii = 0
End Select
End Sub

のようにすれば、スペースや記号を入力しようとしてキーを押しても入力されなくなります。

QエクセルVBAユーザーフォームからブックへの入力

エクセルVBAでユーザーフォームを作成しました。
それをどうやったらブックに反映させられるのかが分かりません・・
項目が40以上あります。
シートの任意の場所へ数値を入力させるためのソースを教えて下さい。
また、そういったフォーマットを公開しているところがあれば教えて下さい!!
住所録など入力するサンプルを見たのですが、そのまま項目を変更して使えたらとっても嬉しいのですが・・・
大至急なのでどなたか力を貸して下さい!!
よろしくお願いします。

Aベストアンサー

> 1日分は1行で入り、次の日に入力したらその下の行に1行
> 追加されるようにはどうしたらよいのでしょう?

1日1行で、A列には日付が入っており、1行目には項目名などのタイトル行となっているのでしょうか。
もしそうであれば、B列から右に日報に記入する項目が入っているとして、たとえばB列で一番下に何か入力されているセルを取得するには、
Range("B65535").End(xlUP)
という式をよく使います。今日の分を反映させようとした場合、「昨日の分」ですね。この1つ下のセルを指定するには、さらに
Range("B65535").End(xlUP).Offset(1,0)
とすればいいです。

このセルを基準にOffset(0,1)などとしてセルを指定してもよいですし、Rowプロパティから行番号が指定できるので、それを変数に代入して(仮にrとすると)
Cells(r,2) = ...
Cells(r,3) = ...
などとしてもよいでしょう。

Qfor~nextを使ってテキストボックスのプロパティを変更したいのですが・・・

ヨロシクお願いします。
VB2005でコード書いています。

現状は

For i = 0 To 80

If i = j(20) Then 'And 4 And 5 And 12 Or 13 Or 14 Or 21 Or 22 Or 23 Or 27 Or 28 Or 29 Or _
' 36 Or 37 Or 38 Or 45 Or 46 Or 47 Or 54 Or 55 Or 56 Then
With textbox(i)
.BackColor = Color.Black
.ForeColor = Color.White
End With

End If
Next
このような感じになっています。上の数字を大量に並べているところがコメント化されていて少しゴチャゴチャした感じ(現状では変えたいテキストボックスの番号を配列化して試しています。)になっていますが、基本的には飛び飛びのをif文を使って抽出しその部分のみのテキストボックスプロパティ(背景色等)を変更することができたらと考えているのですが、色々試しても自分の考えているように動いてくれません。

どなたかご存知の方がおられましたら、良きアドバイスをお願い致します。

ヨロシクお願いします。
VB2005でコード書いています。

現状は

For i = 0 To 80

If i = j(20) Then 'And 4 And 5 And 12 Or 13 Or 14 Or 21 Or 22 Or 23 Or 27 Or 28 Or 29 Or _
' 36 Or 37 Or 38 Or 45 Or 46 Or 47 Or 54 Or 55 Or 56 Then
With textbox(i)
.BackColor = Color.Black
.ForeColor = Color.White
End With

End If
Next
このよ...続きを読む

Aベストアンサー

対象の物も配列化して変数確保時の初期化で書くと楽かも

Dim miArray() As Integer = {4, 5, ...}

for i = 0 to miArray.Length - 1
With textbox(j(miArray(i)))
.BackColor = Color.Black
.ForeColor = Color.White
End With
next

Qエクセルのマクロ・VBA初心者の為、お教え頂きたいです。 ユーザーフォームを作成して読み込みボタンを

エクセルのマクロ・VBA初心者の為、お教え頂きたいです。
ユーザーフォームを作成して読み込みボタンを付けました。エクセルにセルのデータを、フォームのテキストボックスに読み込む様にしたいのですがよく分かりません。
どこにどの様にプログラミングすれば良いかお教え頂けないでしょうか。
申し訳ございませんが、よろしくお願い致します。

Aベストアンサー

作ったフォームに、テキストボックス(Textbox1(仮))とボタン(CommandButton1(仮))を設置します。
ボタンをダブルクリックします。
すると、ボタンをクリックした時に実行される Sub ~ができます。
⇣こんなのね。
Private Sub CommandButton1_Click()
End Sub

この2行間に、処理書き込みます。
ご希望の処理だと、1行追加で実現可能です。

Private Sub CommandButton1_Click()
UserForm1.TextBox1 = Range("A1")
End Sub

UserForm1 の TextBox1 の中に A1セルの内容を入れる。

ではでは、この先もがんばってください。

QAccess フォーム上でのテキストボックスとテーブルの連結

フォームヴィザードからフォームを作成すると、
テキストボックスと指定したテーブルを連結させることができるのですが、デザインビューでそれをするときに、テキストボックスのプロパティのコントロールソースにテーブル名を入れれば連結できるのかと思いきや、うまく表示されません。どこを設定すればテキストボックスとテーブルを連結できるのでしょうか?

Aベストアンサー

#2です。
デザインビューの空欄スペース(グレー1色のところ、升目なし)で右クリックをするとプロパティが出てきます。また、フォームウィザードの途中で、そのフォームと連結するテーブルかクエリを選択する画面が出てきます。

QEXCEL ユーザーフォームの2つのtextboxの値で検索

久しぶりの投稿です。
今、EXCELのユーザーフォームのVBAで行き詰ってます。
お分かりの方宜しくお願いいたします。

まず、EXCELのシートが下の様にあります。
  A        B         C         D
1 得+支店 得意先コード  支店コード     得意先名
2 1030401   10304         01         XXX乳業
3 20000    20000                   XXX商事本店
4 2000001    20000          01         XXX商事 A支店
(AのセルはB&Cで)
  textbox1に得意先コード textbox2に支店コードを入力してコマンドボタンを押したら textbox3に得意先名を表示させるという事がしたいのですが 支店コードが入ってる時はよいのですが入ってない時
実行時エラー’1004’
WorksheetFunctionクラスのVLookupプロパティを取得出来ません。
となってしまいます。
VBAは下の様になってます
 Private Sub CommandButton1_Click()
  Set ADR = Worksheets("sheet1").Range("A2:C4")
TextBox3 = Application.WorksheetFunction.VLookup(TextBox1 + TextBox2, ADR, 4, False)
End Sub

久しぶりの投稿です。
今、EXCELのユーザーフォームのVBAで行き詰ってます。
お分かりの方宜しくお願いいたします。

まず、EXCELのシートが下の様にあります。
  A        B         C         D
1 得+支店 得意先コード  支店コード     得意先名
2 1030401   10304         01         XXX乳業
3 20000    20000                   XXX商事本店
4 2000001    20000 ...続きを読む

Aベストアンサー

こんにちは。
以下のように修正して試して見てください。

Private Sub CommandButton1_Click()
  On Error GoTo ExitER
  Set ADR = Worksheets("sheet1").Range("A2:D4")    '変更(A2:C4 → A2:D4)
  TextBox3.Text = Application.WorksheetFunction.VLookup(TextBox1 + TextBox2, ADR, 4, False)
  On Error GoTo 0
  Exit Sub
ExitER:
  MsgBox "一致するコードがありません"
  On Error GoTo 0
End Sub

QFlashのテキストボックスの「単一行」と「折り返しなし」の違い

FlashMX2004のテキストボックスについて質問です。
テキストボックス(テキスト入力)のプロパティにある「単一行」と「折り返しなし」の違いは何でしょうか。
単純なことかもしれませんが・・・。

Aベストアンサー

こんにちは。

「単一行」はSWFファイルのテキストボックス内に,文字を入力するとき,改行できません。

こんな感じ↓
 あいうえおかきくけこさしすせそ

「折り返しなし」は,SWFファイルのテキストボックス内に,文字を入力するとき,改行するまでずっとテキストボックスの範囲を超えて入力出来ます。

こんな感じ↓
|         | ←テキストエリア
 あいうえおかきくけこさしすせそ
 たちつてと

ちなみに「複数行」は改行出来ます。でもテキストボックスの左右エリアで自動で見た目だけ改行されます。

こんな感じ↓
|         |←テキストエリア
 あいうえおかきく
 けこさしすせそた
 ちつてと

>>「単一行」と「折り返しなし」の違い
簡単に言うと,改行出来るか出来ないかです。

QExcel2007 VBA シートとユーザーフォームの値のやり取り

1.シートからユーザーフォームを呼び出す。
2.シートからユーザーフォームへ値を渡す。
3.ユーザーフォームからシートへ値を返す。
この一連の処理を行いたいのですが。

TestSheet-----------
Dim oForm As TestForm
Set oForm = New TestForm
oForm.SetData("渡す値")
Call oForm.Show
Dim Result As String
'Result = oForm.GetResult

Set、GetメソッドはTestForm内に存在します。
しかし、ユーザーフォームでUnloadを行った時点でoFormが破棄されるらしく、Result = oForm.GetResultでエラーとなります。

変数とSet、Getメソッドを標準モジュールに記述すれば解決するのですが、スコープ範囲がこのシートとユーザコントロールに限定できないのでなるべく記述したくありません。
他にユーザフォームから値を受け取る方法はありませんでしょうか。

1.シートからユーザーフォームを呼び出す。
2.シートからユーザーフォームへ値を渡す。
3.ユーザーフォームからシートへ値を返す。
この一連の処理を行いたいのですが。

TestSheet-----------
Dim oForm As TestForm
Set oForm = New TestForm
oForm.SetData("渡す値")
Call oForm.Show
Dim Result As String
'Result = oForm.GetResult

Set、GetメソッドはTestForm内に存在します。
しかし、ユーザーフォームでUnloadを行った時点でoFormが破棄されるらしく、Result = o...続きを読む

Aベストアンサー

こんにちは。

下記内容は一例です。

ユーザーフォーム内の処理で、

  Unload Me

のように自フォームをUnloadしてしまうと、フォームのオブジェクトが破棄
されてしまうので、フォームを呼び出した側では、フォーム内のデータは
取得できなくなってしまいます。

Unloadの代わりに、ユーザーフォーム側で、

  Me.Hide

のように、Hideメソッドを使用すれば、フォームが非表示になるだけで、
フォームのオブジェクト自体は破棄されずに、フォームを呼び出した側
に制御が戻ります。(※フォームは一見、終了したように見えます。)

ユーザーフォーム側で上記のようにしておいて、フォームを呼び出す側で、

  'フォームを表示
  UserForm1.Show (vbModal)

  'フォーム上のデータ取得
  Dim vDat As Variant
  vDat = UserForm1.TextBox6.Value

  'フォームを閉じる
  Unload UserForm1

  '取得したデータを表示
  MsgBox "取得データ = " & vDat

のようにすれば、フォームを呼び出した側で、フォーム内のデータが取得
できると思います。
上記のように、フォームを閉じる処理は、フォームを呼び出した側に記述
します。

注)上記処理は、当方のExcel2000で確認してみた結果ですが、他の
 バージョンのExcelで、同様に動作するかどうかは判りません。
 もしも、上手く動作しなかった場合はすみません。

以上です。参考になれば幸いです。

こんにちは。

下記内容は一例です。

ユーザーフォーム内の処理で、

  Unload Me

のように自フォームをUnloadしてしまうと、フォームのオブジェクトが破棄
されてしまうので、フォームを呼び出した側では、フォーム内のデータは
取得できなくなってしまいます。

Unloadの代わりに、ユーザーフォーム側で、

  Me.Hide

のように、Hideメソッドを使用すれば、フォームが非表示になるだけで、
フォームのオブジェクト自体は破棄されずに、フォームを呼び出した側
に制御が戻ります。(※フ...続きを読む


人気Q&Aランキング