- 締切済み
Textboxに入力してBookを開く
VBAを勉強して仕事に活かしたいと思っています。 ユーザーフォームを有効に使いたいと・・ TextboxにBook名を入力してBook(同一フォルダー内にある)を開けるようにしたいと思い次のコードを書きましたが全てのBookが開いてしまいました。 Dim MyP As String Dim MyF As String Dim NewBK As Workbook Dim flg As Boolean MyP = ThisWorkbook.Path & Application.PathSeparator MyF = Dir(MyP & "*.xls") Application.ScreenUpdating = False Do While MyF <> "" If MyF <> ThisWorkbook.Name Then On Error Resume Next Set NewBK = Workbooks(MyF) On Error GoTo 0 If NewBK Is Nothing Then flg = True Set NewBK = Workbooks.Open(MyP & MyF) End If 検索_1 NewBK If flg Then NewBK.Close False flg = False End If Set NewBK = Nothing End If MyF = Dir() Loop Application.ScreenUpdating = True ThisWorkbook.Activate End Sub '*** Form呼び出し時の処理 *** Private Sub 検索_1() Dim findText As String '探す文字列(Text1に入力) Dim rg As Object '探し出したブック findText = Text1.Text Set rg = Workbooks.Find(What:=findText, LookAt:=xlWhole) If Not rg Is Nothing Then Workbooks.Open End If End Sub このコードは本やネットの過去ログをみて参考にして書いたものです。 どなたかわかる方 アドバイスお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- pulsa
- ベストアンサー率57% (34/59)
上手く行ったのであれば、幸いです が、Application.FileSearch.Execute は通常、検索結果の戻り値をつかいます With Application.FileSearch .LookIn = "C:\My Documents" .FileName = "*.doc" If .Execute(SortBy:=msoSortbyFileName, _ SortOrder:=msoSortOrderAscending) > 0 Then MsgBox .FoundFiles.Count & _ " 個のファイルが見つかりました。" For i = 1 To .FoundFiles.Count MsgBox .FoundFiles(i) Next i Else MsgBox "検索条件を満たすファイルはありません。" End If End With ヘルプより なので、示されたコードでは、ファイルサーチの検索結果がTrue(>0)でもFalse(=0)でも と言うより、引数が何も無いので、以前の検索を引き継いだ事になるのでしょうが、その『以前行った検索が何か』不明な為、コードとして不自然です こういう書き方で、エラーが出ない事をむしろ初めて知りましたが、普通Application.FileSearch.Executeは、If文でつかいますね と、ここまで書いてアレですが、実は Application.FileSearch にはバグがあります また、Dir関数にもバグがありますので、指定したファイルをきちんと探してくる、指定外のファイルは確実にはじくメソッドが必要なのであれば、FileSystemObjectを使って自作するしかありません どういった内容のバグなのかは、ご自身で確認して頂き、今回作成しようとしている物に抵触しないのでれば、既存の物を使っても構わないと思いますが、そういう『問題のあるメソッドを使っているんだ』と言う意識を持つ為にも、一度きちんと調べて見る事をお勧めします まぁ個人的には、この機会にオリジナルファイル検索メソッドを作ってしまった方が、勉強にもなりますし、良いと思いますがね Set NewBK = Workbooks.Open (ThisWorkbook.Path & "\" & ComboBox1) は、そのままで良いと思いますよ 閉じたり、改名したりするのが楽ですし、何より Set NewBK = ActiveWorkBook とした時の、空中ブランコのように一瞬手を離してしまうような感覚がありませんからね
- pulsa
- ベストアンサー率57% (34/59)
返答でも何でもありませんが、業務に生かす為に勉強中との事なので、あえて言わせていただきます まず、動作しませんでした だけでは、次の返答のしようがありません エラーが起きたとか、こういう動作になったとか ブレークポイントの設定の仕方はご存知ですか? コードエディタの左側のグレーの部分をクリックすると、茶色の●が付きます ここを通過しようとする時に、その部分で、実行がストップします コレにより、そこの部分を通ったことが確認できます ストップしなければ、その部分自体が実行されていません 命令の内容ではなく、呼び出す方に問題があると判断できます NO.1さんのコードをそのまま実行すると、確かにTextBox1のEnterのキーダウンでは、イベントが発生しませんが、そんなものは、自分で解釈しなくではだめです 折角の素晴らしいコードを示してもらっているのに、それに気付けない事を棚に上げて「できませんでした」はありえません せめて、どう試して、どういう結果が返ったか そしてそれを、お互い面識の無い相手に、文章のみでその事を伝えられないと、業務で使うのは夢のまた夢です それと、こういう場での後出しは、非常に面倒です あなたがどういうつもりで質問されたかは、最初の質問内容に依存します それの返答によって、いやそうではなく、こうでした などと言われては、最初に返答された方を、あまりにないがしろにしています また、最初にご自身が質問された内容を見てください かいつまむと 全てのBookが開いてしまいました。 アドバイスお願いします。 です どういう動作を望んでいるという事が、抜けていませんか? やりたい事は大体判りますけど、特にこういうプログラムでは、あいまいにしておくことが、後々足を引っ張る事が多いのであいまいな表現は避けるに限ります コード自体にも言いたい事は色々ありますが、それはまぁ、ご本人の実力によるところもありますし、プログラムの組み方には、ある意味、正解はありませんので、なんとも言えませんが、一つ確実にマズイのは On Error Resume Next これは、やめた方がいいです エラーが発生した場合、強制的に次に進める命令なので、よほどの熟練者でも避けます いくら直後に On Error GoTo 0 してるとは言っても、であればなおさら、考えうるエラーを考慮して対策しておき、それでも拾いきれない場合はエラーを発生させて、実行を停止させるべきです なぜなら、望み通りの動作にならなかった場合、エラーが発生しない為、原因の特定がほぼ不可能になる危険性が大きいです 仕事に使うつもりとの事でしたので、きつい言い方をしました UserFormにTextBoxを一つ置き、NO.1さんのコードで『Text1』の所を『TextBox1』に置き換えて実行してみてください ComboBoxへの格納は、また別のはなしです ここには、腕の立つSEクラスの方が数人いらっしゃいます 多少困難な事でも、目からウロコの技を無料で伝授してくれます 上手に活用して、スキルを上げてください そして、出来ればいずれ返答する側になってくれればうれしいです がんばって!
- keirika
- ベストアンサー率42% (279/658)
テキストボックスに入力された文字列から同一フォルダ内にある エクセルファイルを開くと言うことなので テキストボックスのKeyDownイベントを使用し、文字を入力後 ENTERを押した時点で動作する記述を考えてみました。 Private Sub Text1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 13 Then On Error GoTo Err_Syori Workbooks.Open (ThisWorkbook.Path & "\" & Text1) End If Exit Sub Err_Syori: MsgBox "指定された名前のブックはありません。" End Sub
補足
早速のアドバイスありがとうございます。 Text1_boxに"keirikaさん"のコードをコピーして試してみましたが 動作しませんでした。 最初に考えていたのは Textboxに入力コマンドボタン(Caption;OK)のクリックイベントで実行 というイメージでした。 また、これが動作したらもう一つとしてコンボboxを配置して シート内にBook名一覧をつくり それをコンボBoxに反映して 開きたいBook名をクリックしたらTextboxにBook名が反映し コマンドボタンをクリックすると、"実行"という動作をしたいと思っています。 まず、動作しなかったのはコピーの場所がいけなかったのか すべてのBookがActiveではなかったからでしょうか? Bookはすべて閉じられた状態で指定したBookだけを開きたいのですが。 よろしくお願いします。
お礼
ご指摘ありがとうございます。 説明不足もあり、不快な思いをされたのなら・・ごめんなさい。 <ブレークポイントの設定の仕方はご存知ですか? 知っています。ブレークポイントを設定してやってみましたが 通過してしまいました。 その後いろいろ試してみて Private Sub CommandButton2_Click() Dim rg As Variant rg = ComboBox1.Text Application.FileSearch.Execute '検索を実行 If rg <> "" Then Workbooks.Open (ThisWorkbook.Path & "\" & ComboBox1) End If End Sub シンプルに考えようと 以上のコードを試してみたところ 解決しました。 お二方のアドバイスがあったおかげです。ありがとうございました。 ユーザーフォームには、コンボボックスとコマンドボタンを配し コマンドボタンにコードをおきました。 うまくいきましたが何か直したり、付け加えたりするところがありましたらアドバイスお願いします。