• ベストアンサー

vba

下記はある文字列を検索して何か処理する のコードの一部ですが。 if TypeName(ret) <> "Boolean" Thenのところはどういう意味でどういうことをやろうとしているのか、わかりやすく説明してください。 "Boolean"て何 等しければどうする? 等しくなければどうする? ret = Application.InputBox("検索文字列を入力してください")   If TypeName(ret) <> "Boolean" Then     With mySht.Cells       Set r = .Find(ret, LookIn:=xlValues, lookat:=xlPart)

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

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

私は他の回答で安易に x=InputBox("abc") なんて回答しますが、手抜きをしているわけです。質問のコードは丁寧に、備えがなされています。 他人にこのプログラムを実行して、応答などを操作してもらうときは、何をされるかわからないので、備えのルーチンを入れておかねばなりません。普通操作者がすることで、ありえるのは #2で書いておられる3つです。電源をオフにするなどもありえるがどうしようもない。 Xボタンを押す キャンセルボタンを押す(Esc) 値入れずENTER(値が空白かで聞ける) 何か入れてENTER(これは普通) Sub test01() ret = Application.InputBox("検索文字列を入力してください") MsgBox TypeName(ret) '<> "Boolean" Then End Sub をやって応答を様々にすると意味がわかります。 このほか、ret の値も調べて、その業務や処理に不適当な応答は排除し、再入力を促します。その点質問のコードには入ってないが。 参考  Inputbox以外のコントロールなどのキャンセルなどの対策例 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_100_050.html ユーザーフォームの閉じるボタン制御

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

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >if TypeName(ret) <> "Boolean" Thenのところはどういう意味でどういうことをやろうとしているのか、 InputBox メソッドで「キャンセル」を押したときに、False というBoolean 型のデータが返るから、TypeName(ret) で、判定しているのです。String 型なら、"False" という文字列が返ってしまいますが、ret が、Variant 型なら、"Boolean" で、判定できます。 F8のステップモードで確認してください。 >等しければどうする? ----->終了(キャンセルを押したから) >等しくなければどうする?----->検索(Findメソッド) ということです。

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

ユーザがInputBoxの入力を終える方法は、以下の3通りと考えられます。 1)入力ダイアログの右上の×マークでダイアログを閉じる 2)入力をして(しないのも含む)、OKボタンで閉じる 3)入力をして(しないのも含む)、キャンセルボタンで閉じる 例えば  Dim ret As String  ret = Application.InputBox("文字列を入力")  MsgBox (TypeName(ret) & " / " & ret) を実行したときに、入力に「False」という文字列を入れて返すと、表示される結果は上の場合分けに応じて以下のようになります。  1)String / False  2)String / False  3)String / False これだと、どの場合か区別がつきません。 (False以外の文字列を入力すれば区別できますが…) 一方、同様の処理を  Dim ret As Variant で型宣言をしておいて同様に実行すると、今度は結果が  1)Boolean / False  2)String / False  3)Boolean / False となって返されるので、2)の場合だけがユーザが「False」という文字列を入力してOKを押したと判別することができます。 このように、入力を受ける変数をVariantにしておくことで、結果の変数の型によってキャンセル等が行われたことも判別することができるようになります。 ご質問の処理はその判定を行っていて、キャンセルでなければ検索を実行するという流れになっています。 (キャンセルの場合の処理は、質問文では省かれているので不明です)

全文を見る
すると、全ての回答が全文表示されます。
  • pentium100
  • ベストアンサー率45% (689/1517)
回答No.1

ユーザーに入力させた「検索文字列」のチェックと思います。 Booleanは「True」「False」の二者択一なデータを保持するデータ型の一種で、 文字や数値ではないのでこれを検索対象とするとエラーになってしまいます おそらくですが検索文字列に何も入力しないで実行すると 「False」を返すので その場合を想定しているのではないでしょうか。 事前にこれをチェックし、 「Booleanでない場合」のみ検索処理を行うようにしていると思われます。 「Booleanの場合」の処理はここに書かれていないのでわかりません。

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

関連するQ&A

  • 検索マクロ

    下記のマクロは、検索文字でシートを検索し、そのセルアドレス情報を シートを追加して表示する機能ですが、BOOK全体に検索し、シート名を含めて表示するには、xxxxのところをどのように変更すればいいか。よろしくお願いします。 Sub kennsaku_Macro1() Dim ret Dim r As Range Dim adr As String Dim cnt As Long Dim psw As Boolean Dim mySht, adSht, ws As Worksheet Set mySht = ActiveSheet ret = Application.InputBox("検索文字列を入力してください") If TypeName(ret) <> "Boolean" Then With mySht.Cells Set r = .Find(ret, LookIn:=xlValues, lookat:=xlPart) If Not r Is Nothing Then adr = r.Address cnt = 2 '2行目から表示 xxxxxxxxxxxxx For Each ws In Worksheets If ws.Name = "検索結果" & ret Then psw = True Exit For End If Next ws If psw Then Set adSht = ws adSht.Cells.ClearContents Else Set adSht = Worksheets.Add adSht.Name = "検索結果" & ret End If adSht.Cells(cnt, 1).Value = r.Value adSht.Cells(cnt, 2).Value = xxxx 'シート名 adSht.Cells(cnt, 3).Value = adr Do Set r = .FindNext(r) If r.Address = adr Then Exit Do Else cnt = cnt + 1 adSht.Cells(cnt, 1).Value = r.Value adSht.Cells(cnt, 2).Value = xxxx 'シート名 adSht.Cells(cnt, 3).Value = r.Address End If Loop End If End With End If adSht.Cells(1, 1).Value = "項目" adSht.Cells(1, 2).Value = "シート名" adSht.Cells(1, 3).Value = "セルアドレス" mySht.Activate End Sub

  • 【エクセルVBA】指定した文字列の抽出方法について教えてください。

    下記のように、"AAA-1"という文字列を指定しシート1のあるレンジを検索して見つかったらその下のセルのデーターをシート2にコピーしてやり、次に"AAA-2"という文字列を指定して同じように文字列を変えて繰り返し抽出したいのですがこの方法では抽出して欲しくない"AAA-11"や"AAA-12"も抽出されてしまいます。数字の文字数が規定ができれば解決しそうですがいまいちわかりません。アドバイスよろしくお願いいたします。 IDNo = "AAA-1" With Worksheets("Sheet1").Range("A1:P1") Set IDchoice = .Find(What:=IDNo, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, MatchByte:=False) If Not IDchoice Is Nothing Then FirstAddress = IDchoice.Address Do Sheets("DATA2").Select Cells(IDchoice.Row+1, IDchoice.Column).Copy Sheets("Sheet2").Select Cells(1, 1).PasteSpecial ・ ・

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

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

  • VBAを勉強し始めたものです。以下のプログラムはネット上の皆様に教えて

    VBAを勉強し始めたものです。以下のプログラムはネット上の皆様に教えて頂きながら作成しております。教えていただいた方、感謝しています。 Dim myKey As String Dim maxrow As Long Dim maxcolumns As Long (1) If textbox1.Value = "" Then Exit Sub MsgBox "キーワードが未入力です", vbExclamation myKey = textbox1.Value maxrow = Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row maxcolumns = Worksheets("sheet1").Cells(maxrow, Columns.Count).End(xlToRight).Columns Debug.Print maxrow Debug.Print maxcolumns If flag = False Then '初めての検索処理 Set c = Cells.Find(After:=Cells(Rows.Count, Columns.Count), What:=myKey, LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByColumns) c.Interior.ColorIndex = 4 '初めての結果(range)を保存しておく Set d = c flag = True Else '2回目以降の検索処理 Set d = Cells.Find(After:=d, What:=myKey, LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByColumns) d.Interior.ColorIndex = 4 '保存しておいた結果と今回の検索結果を比較して1周してきたと判断して終了を表示 If c.Address = d.Address Then MsgBox "検索終了" End If これはテキストボックスに入力された文字を含むセルに着色する、というものです。検索、着色部分は成功しています。ありがとうございます。 でも(1)の部分なのですが、なぜか、テキストボックスに文字未入力の段階でクリックすると、エラーメッセージがでません。でも文字を入力して、検索のボタンをクリックするたびに"キーワードが未入力です"の表示が出ます。現象としてはマッタク反対なのですが、なぜこうなるのか、プログラムのどこに問題があるのか、教えてください。よろしくお願いします。

  • エクセルVBAで検索

    エクセルのVBAで文字の検索をしたいと思います エクセルは2000です エクセルのマクロの記録機能を利用して 下記のようなマクロを作成しましたが これでは、別のシートの文字が検索できません 同一ブックの別のシートも検索できるようにするには どうしたら良いでしょうか、よろしくお願いします 以下同一シートしか検索しない例 Sub Macro1() Dim 検索文字 As String 検索文字 = InputBox("検索文字を入力してください") Cells.Find(What:=検索文字, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) _ .Activate End Sub

  • EXCEL VBAについて

    EXCEL VBAについて教えてください やりたいことは以下の通りです。 ・全シートJ列1~100行目を検索しアルファベットが含まれるセルが存在すれば 上のセルをコピーする ここまで作ったのですが上手くいきません Sub VBAsample() Dim GYO As Long For GYO = 1 To 100 If Find([a-z], LookAt:=xlPart) Then Cells(GYO, 10).Value = Cells(GYO - 1, 10).Value End If Next GYO End Sub 添削をお願いします

  • Findステートメントで別なブックの検索

    Findステートメントで検索した内容のある行のA列にある値をキーワードとして別なブックのA列に検索をかけてヒットしたセルの内容を元のブックの指定したセルに移すという動作をさせたいので次ののように書いてみました。 Private Sub CommandButton2_Click() Dim Yline As Long Dim No As Variant Dim c As Range Dim sh As Worksheet Dim sh_no As Integer Dim findcell As Range Dim add As String Set sh = Worksheets("ブックAの1") No = TextBox1.Text sh_no = 1 'テキストボックスに値が入っていた場合 If No <> "" Then 'Find メソッドの最低のプロパティは入れる。SearchOrder は特にいらない Set c = sh.Range("B:B").Find( _ What:=No, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) '見つかった場合にのみ、値を入れる If Not c Is Nothing Then Yline = c.Row '見つかった行のA列の文字列でブックBに検索をかける add = sh.Cells(Yline, 1).Value Workbooks("B").Activate Set findcell = Workbooks("B").Worksheet(sh_no).Range("A:A").Find( _ What:=add, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) '前Setステートメントからのループ検索開始 If findcell Is Nothing Then Do sh_no = sh_no + 1 If sh_no > ThisWorkbook.Worksheets.Count Then Exit Sub End If Set findcell = Workbooks("B").Worksheets.(sh_no).Range("A:A").Find( _ What:=add, _ LookIn:=xlValues, _ LookAt:=xlPart, _ Searchorder:=xlByRows) Loop While findcell Is Nothing End If End If Workbooks("A").Activate With Worksheets("Aの2")   .Cells(21, 4).Value = sh.Cells(Yline, 14).Value .Cells(20, 4).Value = sh.Cells(Yline, 15).Value .Cells(36, 4).Value = findcell End With Unload Me Else MsgBox No & " は見つかりません。", 48 End If Set sh = Nothing End Sub するとwhat:=addとしてaddが見つかるまでシート番号を増やしていくループのところでエラーがでてキーワードが見つからないと出ます。恐らくブックBを検索してくれているとは思うのです。A列に空白があるためかと思い埋めてみましたが関係ないようです。 構文エラー的なものは無いと思いますが、宜しくお願いします。

  • 半角と全角を区別せずに評価するにはどうすればいいで

    エクセル上で検索する時に If Cells.Find(What:="検索文字", LookAt:=xlPart) Is Nothing Then 'ないならば としてるのですが、 この方法で半角と全角を区別せずに評価するにはどうすればいいですか? どの引数を使えばいいのかわかりません。

  • エクセルvba 検索対象をシートではなく、ブック全

    このコードでシート内に検索文字があるかどうかを取得できるのですが 検索対象をシートではなく、ブック全体にするには どうすればいいでしょうか? Sub Sample() If Not Cells.Find(What:="test", LookAt:=xlPart) Is Nothing Then Debug.Print "あります" Else Debug.Print "ありません" End If End Sub

  • VBAを勉強し始めた者です。

    VBAを勉強し始めた者です。 Private Sub スタート_Click() Dim myKey As String Dim maxrow As Long myKey = 入力値.Value maxrow = Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row If flag = False Then '初めての検索処理 (1) Set c = Worksheets("sheet1").Range(Cells(2, 1), Cells(maxrow, 1)).Find(What:=myKey, LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByRows) c.Interior.ColorIndex = 4 '初めての結果(range)を保存しておく Set d = c flag = True Else '2回目以降の検索処理 (2) Set d = Worksheets("sheet1").Range(Cells(2, 1), Cells(maxrow, 1)).Find(What:=myKey, LookIn:=xlValues, lookat:=xlPart, SearchOrder:=xlByRows) d.Interior.ColorIndex = 4 '保存しておいた結果と今回の検索結果を比較して1周してきたと判断して終了を表示 If c.Address = d.Address Then MsgBox "検索終了" End If End Sub 現在データはA1がデータ名(名前、番号、住所など)、A2からA11までデータが入っています。テキストボックス(以下TB)に入力された文字を含むセルに着色する、というものです。検索、着色部分は成功しています。 これにB1にデータ名、さらにB2からB11まで新たにデータを加えました。 本来はA列だけ検索の対象にしたいのですが後で他の機能を追加するためB列にもデータを加えました。 たとえばテキストボックスに入力した文字を三とします。三を含むデータがA2、A11、B2、B11にあったとします。 上記のプログラムだと、なぜかA11だけ着色され、終了します。本来はA2から下に向かって検索してほしいのですが。 試行錯誤した中には、B2→A11の二つのセルだけ、TBに入力された文字が含まれるセルに着色していきました。 11行以降もデータが増えることを想定して、 maxrow = Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row で最終行を取得し、(1)、(2)を、 Set d = Worksheets("sheet1").Range("A2:"A" & maxrow).以下省略 としましたが、エラーが出ました。 手直しして、(1)(2)を最終行をカウントしてA2から始まって、A11まで検索できるようにしたはずなのですが、やはりダメでした。Range("A2:"A" & maxrow)の部分と上記のプログラムの不具合を教えてください。よろしくお願いします。

専門家に質問してみよう