• ベストアンサー

入力の簡略化

前回の質問させていただいたものですが、今だに完成できて いないので、もう一度書き込みさせていただきます。 kurodai2様にご丁寧に返答いただいたのですが、 いかんせん小さい脳みそで。。質問も閉じてしまいましたので今一度。 ツアーNo.、ツアータイトル、ツアー情報、入力者氏名 があります。 現在、フォームを開く際に小さなフォームが出てきて、 「入力者の氏名」を入力します。格納する不可視の テキストBOX「非入力者」があり、「入力者氏名」は そこを見に行き、新しいレコードを開くたびに自動で氏名が 反映されます。のはずです。説明難しいですが。。 フォームで「ツアーNo.」を入力し、更新したら、「ツアータイトル」 と「ツアー情報」が自動で出てきます。これは前もって ツアー情報テーブルで登録しています。 そこで、毎回同じ「ツアーNo.」、「ツアータイトル」、「ツアー情報」 の場合、入力の際ミスが出ますので、入力者氏名と同じ方法で 格納して反映しようと思っています。 まぁkurodai2様の教えなんですけど^^; メモリーに格納ってのは難しかったのでこちらの方法でいこうと 思います。 自分なりにいじってみたんですけど、 Dim Textname As TextBox Dim strmsg As String Dim varname As Variant Set Textname = Me.入力者表示 strmsg = "入力者氏名を入力して下さい" varname = InputBox(strmsg) '入力なき時は、フォームオープンをキャンセルします。 If varname = "" Then Cancel = True End If Textname = varname Set Textname = Me.ツアーNo strmsg = "ツアーNoを入力して下さい" varname = InputBox(strmsg) '入力なき時は、フォームオープンをキャンセルします。 If varname = "" Then Cancel = True End If Textname = varname では、ツアーNo.に値は入れれませんとエラーがでます。 非連結のテキストボックス「非ツアーNo.」を作り、それを指定したら 入りました。 非連結のテキストボックス「非ツアーNo.」にツアーNo.を入れ、 保存ボタン押したら「非ツアーNo.」から「ツアーNo.」へ値を 反映させるようにしたのですが、ボタンを押した時点では反映 されているのに、レコードが切り替わったらブランクに なってしまいます。たぶんそういう設定にしているのでしょうけど、 どこをいじっていいのか。。 しかもツアーNo.へ値を反映させても値のみが反映され、 「ツアータイトル」と「ツアー情報」が空白のままになって しまいます。 もうなにがなんだか。。 知識と文章力のなさで、暗号を解くみたいになりましたが、、、。 ご理解いただける方、宜しくお願いいたします。

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

  • ベストアンサー
  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.3

いろいろとやり方はありますが、 保存ボタンクリックのソースが出てますので その中だけで、現在の値を保存、新レコードにして画面上の部品に 退避した値をセットするように書いてみました。 Private Sub 新規データ保存_Click() Dim 保存ツアーNo As Integer Dim 保存ツアータイトル As String Dim 保存ツアー情報 As String 保存ツアーNo = Me!ツアーNo 保存ツアータイトル = Me!ツアータイトル 保存ツアー情報 = Me!ツアー情報 Me.入力者書込み.Value = Me.入力者表示.Value Dim strmsg As String strmsg = "データの保存が完了しました。" CkPoint = False 'CKPointをFalseに変更します。 MsgBox strmsg, vbInformation DoCmd.GoToRecord , , acNewRec Me!ツアーNo = 保存ツアーNo Me!ツアータイトル = 保存ツアータイトル Me!ツアー情報 = 保存ツアー情報 DoCmd.GoToControl "自宅電話番号" End Sub 登録と同時に、新規レコード上に該当項目がセットされます (無条件に、入力状態になります それが不味ければ、保存用の変数をフォームモジュールの 上部へもって行き、 Private Sub Form_BeforeInsert(Cancel As Integer) 内で、部品上にセットする。 このときは、どれかの項目を入力した瞬間に、セットされる。 しかしながら、この処理があります Private Sub ツアーNo_AfterUpdate() If Me![招待者ID] = 0 Then Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 End If 招待者IDの扱いがわかりませんが、自動でセットすると、この部分は処理しないと思います。 意味合いが見えませんが、適時必要な箇所へ同等の処理を記載する必要があるかもしれません。

Armadillo5
質問者

補足

回答ありがとうございます! これはこのままコピペでいけるんですかね? 保存ツアーNo = Me!ツアーNoの場所で型が一致しませんって出ました。 ツアーNoって名前はあってるんですけど。。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.7

もともと >If Me![招待者ID] = 0 Then >Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 >End If は、ツアーNOを入力した時に、処理されているのです。 今回、自動でセットした関係でこの処理を通らないのが問題だったのですが・・ もしかしたら、別なところで同様の処理があるのかもしれないですね。 >あっても問題ないなら残しておいたほうがいいのでしょうか。 ツアーNoを入力し直した時には、処理されます。 現在ある処理ですので 置いておいた方が無難ですね。 私には、システムそのものが見えませんので、正確な判断は付きませんので 最終的には 色々テストされ 登録されるデータでご判断ください。

Armadillo5
質問者

お礼

了解しました! なんか、ほんまにありがとうございます。 わからないなりにもできた時の感動はすごいですね。 またいろいろと質問させていただくことがあるかと思いますが、その節は宜しくお願いいたします。 ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.6

空白で、エラーにかからないようにしても問題ないとは思います。 なぜならば、現に空白でも ボタンが押せてその処理を通るわけですから たぶん、テーブルの必須項目かなにかで、登録できないのではないかと考えます。 もともとそうだったので、追加した部分で発生するエラーは、 対応した書き方でも、よいと思います。 それよりも、本来ツアーNOを入力をした時の If Me![招待者ID] = 0 Then Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 End If この処理ですね・・ ツアーNOを入れたときに、招待者IDが0であれば、旅行招待者管理テーブルの招待者ID+1の値を 採番して画面上にセットしていますね。 以降、招待者IDを触ることが無いのであれば、同じく Private Sub 新規データ保存_Click() の最初に持って行ってもよいでしょうが・・ (クリックするまで、招待者IDは自動採番されないので0のままですが) 全体がわからないので、こうあるべきと言う判断は付きませんが 何れにしても、この3行を無視するわけにはいかないと思いますので 対応は必要ですね。

Armadillo5
質問者

お礼

f Me![招待者ID] = 0 Then Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 End If ためしにこれを削除してやってみたのですが、とくに問題がなさそうなんです。。団体IDはちゃんと連番になりますし。 あっても問題ないなら残しておいたほうがいいのでしょうか。

Armadillo5
質問者

補足

なんなんでしょうか。。。 一応招待者IDはオートナンバーで連番になっているんです。 今回の改造をした後も普通に連番でいけているのですが。 実はこれいらないとかいうオチでしょうか。。。

全文を見る
すると、全ての回答が全文表示されます。
  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.5

>一番最初にタイトルが空白の状態で保存ボタンを押すとNullが不正だとでます。これの対処の仕方をお願いいたします! ツアーIDを入力すると、タイトル・情報が参照表示される。 (でたらめなツアーIDを入力すると”該当データがありません。確認してください”) とメッセージが、表示されるようになっていたので 必ず正しいツアーIDを入力するものと思いましたが? また、本来最初に入力しようとしたのも その意味では無かったのでしょうか? よくわかりませんが、タイトル・情報が空白の場合もあるとして 保存ツアータイトル = iif(isnull(Me!ツアータイトル),"",Me!ツアータイトル) 保存ツアー情報 = iif(isnull(Me!ツアー情報),"",Me!ツアー情報) もしかして、一番最初に このボタンを押して入力状態ですかね・・

Armadillo5
質問者

お礼

いや、おっしゃるとおりです^^; よくわからんこと言いました。。 フォームを開いた最初の画面では、タイトルと情報はブランクとなっています。普通ならちゃんとしたNo.を入力して保存するのですが、バイトが大勢で入力をするので、誤ってエラー出してコードの画面を見せたくないって思ったのです。 でもブランクの状態で保存ができたら本末転倒ですね^^;すみません。 ほんとにわけわからない文章にお付き合いいただきありがとうございました。貴重なお時間感謝いたします!

全文を見る
すると、全ての回答が全文表示されます。
  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.4

>保存ツアーNo = Me!ツアーNoの場所で型が一致しませんって出ました。 ツアーNoのコントロールソースに対応する項目は テーブルでは どのデータ型になっていますか? NOなので、短絡的に数値と判断したのですが、もしテキスト型であれば Dim 保存ツアーNo As Integer を Dim 保存ツアーNo As String にしてください。 他の型であれば、それにあった型で宣言してください。

Armadillo5
質問者

お礼

うそです!!!! できました!”1!! 一番最初にタイトルが空白の状態で保存ボタンを押すとNullが不正だとでます。これの対処の仕方をお願いいたします!

Armadillo5
質問者

補足

クリアしました! つ、次は 保存ツアータイトル = Me!ツアータイトル でNullの使い方が不正ですとなります。 ほんまにすみません。。 Private Sub ツアーNo_AfterUpdate() If Me![招待者ID] = 0 Then Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 End If DoCmd.SetWarnings False '警告メッセージをオフにします。 DoCmd.OpenQuery "ツアー情報抽出テーブル削除クエリ" ' 削除クエリーを実行します。 ' 追加クエリーを実行します。 DoCmd.OpenQuery "ツアー情報抽出テーブル作成クエリ" DoCmd.SetWarnings True '警告メッセージをオンに戻します。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim stCri As String Set cn = CurrentProject.Connection rs.Open "ツアー情報抽出テーブル", cn, adOpenDynamic, adLockOptimistic '文字列型データ検索 stCri = "[ツアーNo]='" & ツアーNo & "'" rs.Find stCri '該当するレコードが無い場合は、メッセージボックスを表示し、抜け出す If rs.EOF Then MsgBox ("該当データがありません。確認してください!!") Else Me!団体名 = rs!団体名 Me!ツアータイトル = rs!ツアータイトル End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub これと何か関係があるのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • kurodai2
  • ベストアンサー率38% (77/202)
回答No.2

kurodai2です。 前回のは、難しかったですか・・ >非連結のテキストボックス「非ツアーNo.」にツアーNo.を入れ、 >保存ボタン押したら「非ツアーNo.」から「ツアーNo.」へ値を >反映させるようにしたのですが、ボタンを押した時点では反映 >されているのに、レコードが切り替わったらブランクに >なってしまいます。たぶんそういう設定にしているのでしょうけど、 >どこをいじっていいのか。。 この切り替わったら・・と言うのは 新しいデータの入力になったら と言うことですか? そうであれば、当然そうなります。 なぜならば、保存のときにツアーNOを入れていますので 新しいデータになった時には、空の状態ですね。 新しいデータの入力状態になったときに、ツアーNOが入っている ようにするには、保存ボタンを押したときではなく(このイベント時に ほかにどのような操作をしているのかも不明ですね) Private Sub Form_BeforeInsert(Cancel As Integer) のタイミングですね。 >しかもツアーNo.へ値を反映させても値のみが反映され、 >「ツアータイトル」と「ツアー情報」が空白のままになって >しまいます。 そもそも、ツアーNOを入力すると言うことから考えると 「ツアータイトル」「ツアー情報」の情報がマスタ化されてるのでしょう。 そうなると、画面上の「ツアータイトル」と「ツアー情報」は表示 されているだけで、入力項目でも、データとして格納される項目でもないと 思うのですが・・ ツアーNOの入力間違いがあると言うことであれば、コンボボックスではない と考えます。 そうなると、ツアーNOを入力したときに、ツアーマスターを 参照して、「ツアータイトル」「ツアー情報」を取得している場所が あるのではないですか? 新規データ入力になった時にツアーNOをセットするようにすれば その処理を通るのか?  通らないのであれば、セットした時にその処理をしてやるようにすれば よいと思いますが ただ・・コードだけ入力して、名称を参照表示させているとしても 間違っていれば、表示されないか 他の名称が表示されるので 基本的には入力時に即 気がつくと思うのですが・・ 入力対象のテーブルの構成と、画面の部品の種類 (テキストボックスなのかコンボなのか)を含め、 もう少し情報を出されたほうがわかりやすいですね。

Armadillo5
質問者

補足

先日は本当にありがとうございました! しつこく質問しまくって申し訳ありません。 とりあえず今現在はコンボボックスでなく、 テキストボックスになります。返答が遅れてしまいました。 前もってツアーNo.とツアータイトルとツアー情報を、 ツアー内容テーブルに入力しておきます。 フォームのテキストボックスにツアーNo.を入れたら、タイトルと 情報がでるようにしています。そのフォームで入力した全てのものが 入るテーブルに、その三つも入るようなっています >新しいデータの入力状態になったときに、ツアーNOが入っている ようにするには、保存ボタンを押したときではなく(このイベント時に ほかにどのような操作をしているのかも不明ですね) Private Sub Form_BeforeInsert(Cancel As Integer) のタイミングですね。 クリック時に Private Sub 新規データ保存_Click() Me.入力者書込み.Value = Me.入力者表示.Value Dim strmsg As String strmsg = "データの保存が完了しました。" CkPoint = False 'CKPointをFalseに変更します。 MsgBox strmsg, vbInformation DoCmd.GoToRecord , , acNewRec DoCmd.GoToControl "自宅電話番号" End Sub となっています。 タイミングが違うのですね^^;了解しました。 画面の部品ですが、ツアーNo.、タイトル、情報の上記の三つと ツアーID、これは規定値にして新しいレコードになった際も 最後に入力したデータが反映されます。 あとは普通に個人情報です。氏名、電話番号、住所(郵便番号支援使用)です。 今現在のツアーNo.に入っているコードは以下です。 Private Sub ツアーNo_AfterUpdate() If Me![招待者ID] = 0 Then Me![招待者ID] = Nz(DMax("招待者ID", "旅行招待者管理テーブル")) + 1 End If DoCmd.SetWarnings False '警告メッセージをオフにします。 DoCmd.OpenQuery "ツアー情報抽出テーブル削除クエリ" ' 削除クエリーを実行します。 ' 追加クエリーを実行します。 DoCmd.OpenQuery "ツアー情報抽出テーブル作成クエリ" DoCmd.SetWarnings True '警告メッセージをオンに戻します。 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim stCri As String Set cn = CurrentProject.Connection rs.Open "ツアー情報抽出テーブル", cn, adOpenDynamic, adLockOptimistic '文字列型データ検索 stCri = "[ツアーNo]='" & ツアーNo & "'" rs.Find stCri '該当するレコードが無い場合は、メッセージボックスを表示し、抜け出す If rs.EOF Then MsgBox ("該当データがありません。確認してください!!") Else Me!ツアー情報 = rs!ツアー情報 Me!ツアータイトル = rs!ツアータイトル End If rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub

全文を見る
すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.1

QNo.3143864 から見ていますが、どうも方向が違うように思えてなりません。 >基本同じコードを使用し、一回一回コードを入力していました。 >やはり人間の手によるものですから間違いがあり、 >違うコードを入力してしまうと行方不明になってしまうのです。 この対策は重要ですが、「そのために入力回数をへらす」のではなく「誤ったコードは入力できない」ようにするべきです。その上で入力者の負担軽減を考えるのが良いでしょう。 それではどうするか? 選択対象が多くない場合はコンボボックスが便利です。 Armadillo5さんが使用しているテーブルやフィールドの名前が判らないので一応 ツアーマスター(Table) ツアーNo、ツアータイトル、ツアー情報(Field) ツアー記録(Table) ツアーNo、入力者ID(Field) と仮定します。フォームのレコードソースは SELECT ツアー記録.入力者ID, ツアー記録.ツアーNo FROM ツアー記録; コンボボックスを貼り付け 1.テーブルまたはクエリーの値 2.ツアーマスター 3.ツアーNo 4.次のフィールドに保存する→ツアーNo これで登録されているツアーNoしか選択できなくなります。同様にコンボボックスを作り3.のところだけを「ツアータイトル」に替えると、ツアーNoとツアータイトルが連動して変わります。ツアー情報も同様です。 最終の選択を次に反映させたければ Private Sub Form_AfterUpdate() stok_cd = Forms![フォーム1]![ツアーNo] End Sub Private Sub Form_BeforeInsert(Cancel As Integer) Forms![フォーム1]![コンボ1] = stok_cd End Sub みたいなことでできるでしょう。

Armadillo5
質問者

お礼

↑の補足の補足になりますが、、。 ツアーNo. ツアータイトル ツアー情報 氏名 電話番号 住所 など、メインのテーブル(ツアー参加者テーブル)があり、 フォームで入力したものはタイトルも情報も含め すべてこの中に入ります。 ツアーNo.で反映されるように、もう一つの(ツアーマスター) のテーブルにツアーNo.とツアータイトルとツアー情報が先に 登録してあります。 以下にもありますが、フォームのレコードソースは 「ツアー参加者テーブル」となっています。

Armadillo5
質問者

補足

なんとかできそうな気がしてきました。 ツアーNo.とツアータイトル、ツアー情報のテーブルが一つあり、 メインのテーブルにはそれらも入りますが、個人情報、つまり氏名、電話番号、住所など、ほかのデータも入ってきます。そうなるとフォームのレコードソースはどうなるのでしょうか?? 今現在は全部のデータが集まるメインのテーブルの名前だけがレコードソースに入っているのですが。。。 あと、前にも教えていただいたのですが、stok_cdというのはこのまま使えばいいのですよね?CDを何かに置き換える必要はありませんよね?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ACCESSのフォーム

    はじめまして。 個人データの管理でACCESSで名簿入力をしています。 入力のフォームを開く際に、 Private Sub Form_Open(Cancel As Integer) Dim Textname As TextBox Dim strmsg As String Dim varname As Variant Set Textname = Me.入力者表示 strmsg = "入力者氏名を入力して下さい" varname = InputBox(strmsg) '入力なき時は、フォームオープンをキャンセルします。 If varname = "" Then Cancel = True End If Textname = varname End Sub として、入力者の氏名を入力しています。 詳細は作成者でないので分かりかねますが、 フォームで非連結のテキストボックスを作成して、 なにかしら表示ができるようになっているみたいです。 これはフォームを開く際に出てきた小さい窓に一度だけ入力者氏名を 入力したら、そのままフォームを閉じるまでその氏名が反映されます。 現在、入力するものにコードというものがあるのですが、これも同じようにできないかと思っています。一日のデータ入力作業では 基本同じコードを使用し、一回一回コードを入力していました。 やはり人間の手によるものですから間違いがあり、 違うコードを入力してしまうと行方不明になってしまうのです。 コードも上記の入力者氏名と同じように、 フォームを開く際に出てくる小窓での入力は可能でしょうか? ちなみに現在商品コードを入力したら、コードの種別タイトルという ものが自動で出力される仕組みになっています。 それも反映されないといけないのです。 なにかお知恵を拝借させていただければと思います。 足りない情報があればご指摘ください。 宜しくお願いいたします。

  • Excel VBA インプットボックス空文字を入力

    いつもお世話になっています。 下記のような入力処理をインプットボックスで行いたいと考えています。 勤務先は場合によっては不要なのでパスして次に移りたいのですが 空文字だとOKをクリックしても、キャンセルをクリックしても処理が終わってしまいます。 勤務先 = InputBox("勤務先を入力") If 勤務先 = "" Then Exit Sub ActiveCell.Value = 勤務先 ActiveCell.Offset(0, 1).Select 氏名 = InputBox("氏名を入力") If 氏名 = "" Then Exit Sub ActiveCell.Value = 氏名 空文字のままOKもしくはキャンセルでも次の処理に移るにはどうしたらよいでしょうか。 お力添えをお願いいたします。

  • OKを押してもキャンセルを押しても、反応しない

    このコード、どこが間違ってるか教えてもらえますか? Sub test() Dim ret As Variant ret = InputBox("タイトルを入力してください。") If TypeName(ret) = "Boolean" Then MsgBox "キャンセルが選択されました" End If End Sub これで、キャンセルボタンを押しても、メッセージボックスが表示されません。 間違えてる部分がわかりません。

  • inputbox のキャンセルの戻り値について(VBA×エクセル)

    VBA初心者で、ユーザフォームにはまだ手出ししたくなく、INPUTBOXで値を取得しているのですが、 INPUTBOXでキャンセルボタンを押したときに、マクロを終了するように書きたいのですが、どのように記述したらよいのでしょうか? INPUTBOXからはどんな値が返ってきているかわからず、 メッセージボックスで確認してみたのですが、空欄なので、 IF RetIPT ="" then マクロ終了 endif としてみたのですが、「マクロ終了」には進んでくれず... 回答をお願いします~

  • InputBox キャンセルボタンが押された時の処理

    こんばんは。 Sub test() Dim タイトル As String タイトル = InputBox("タイトルを入力してください。") If Cancel = True Then Exit Sub ’次のコード・・・ ’次のコード・・・ End Sub このコードを実行した時に 下記のダイアログが出てきて 右のキャンセルボタンを押すと、 「If Cancel = True Then Exit Sub」 でsubステートメントを抜けたいのですが 「Cancel」の部分が 「変数が定義されていません」とエラーになってしまいます。 Dim Cancel As Boolean を追加してキャンセルボタンを押しても TrueではなくFalseになってしまいます。 回避方法を教えてください。 よろしくお願いします。

  • エクセルマクロでinputboxメソッドゼロ入力

    エクセル2007です。 以下のマクロで、inputboxメソッドで質問させると、キャンセルボタンを押すと、うまいぐあいに止まります。 しかし、0を押しても、止まってしまいます。本当は、C2にゼロと表示させたいのです。 Sub 練習() Dim myR myR = Application.InputBox(prompt:="数量を入力しなさい", Type:=1) If myR = False Then Exit Sub Range("C2").Value = myR End Sub

  • inputboxの日本語入力切替について

    VBAのinputbox関数についての質問です inputboxを使ってデータの入力をしたいのですが、日本語入力のONとOFFを自動的に切り替えられる記述はありませんでしょうか。 現在の記述は sub 入力() Dim simei As String simei = InputBox("氏名を入力してください") range("b5").Value = Simei End su のような感じです。inputboxを表示するまえに、言語バーの日本語入力がONの状態になるようにしたいのですが…。よろしくお願いします。

  • マクロ inputbox ブランクで入力した時

    いつも回答して頂きありがとうございます。 InputBoxに何も入力せず、OKを押してしまった場合、マクロの処理を終了させたいのですが、どうしたらよろしいでしょうか?宜しくお願い致します。 Sub 名前を入力する() Dim a As Long a = Application.InputBox("班を数字で入力して下さい。", Type:=1) If a = 0 Then MsgBox "キャンセルされました。", vbOKOnly Exit Sub End If With ActiveSheet .Range("E4:F5").Value = Worksheets("名前一覧").Cells(2, a).Value End With End Sub

  • エクセルVBA、入力しないと閉じないInputBox

    必ず何かを入力しないと閉じないInputBoxを作ろうと思います。 以下のコードで入力がなければ閉じないというか、Line:に戻るので、何度でも現れるInputBoxになるようですが、このやり方は正しいですか? 通常はどうやるのでしょうか? Sub test() Dim a line: a = Application.InputBox("必ず入力して下さい。", "Input!") If Len(a) = 0 Or a = False Then GoTo line MsgBox "有難う。" & a & " ですね。", , "(o。_。)oペコッ" End Sub

  • xlAPPがないと、キャンセルしても無視される

    Sub xlAPPがある場合() Dim xlAPP As Application Dim strPathName As String, vntPathName As Variant Dim strFileName As String Set xlAPP = Application 'ここでわざとESCキーかキャンセルを押す vntPathName = xlAPP.InputBox("参照するフォルダ名を入力して下さい。", , "C:\") If VarType(vntPathName) = vbBoolean Then MsgBox "キャンセルがクリックされました" Exit Sub End If End Sub Sub xlAPPがない場合() Dim strPathName As String, vntPathName As Variant Dim strFileName As String 'ここでわざとESCキーかキャンセルを押す vntPathName = InputBox("参照するフォルダ名を入力して下さい。", , "C:\")      ’無視される If VarType(vntPathName) = vbBoolean Then MsgBox "キャンセルがクリックされました" Exit Sub End If End Sub ************************************************** InputBoxを開いた時にキャンセルするふたつのプロシージャーを比較した時に、 xlAPPがないコードは、キャンセルしても無視されます。 xlAPPがどんな役割をしているのか、 xlAPPがないと、なぜ無視されるのかがわかりません。 あと、二つを比較すると、表示されるInputBoxの形式も違います。 ご教授よろしくお願いします。