[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ブックの検索』(かくれんぼ)
Excel2003 WindowsXP
PC内にあるブックを検索し、もしなければそれを作成すると言うような 大胆なことができるマクロコードはありますか?もしあれば教えてください。 PC内には同じ名前のブックを保存していることもありますがそれが回避できれば 最高ですが、そのときはエラーが出てもOKです。
ここに、全ドライブを検索してブックがあれば開く。というサンプルを載せています。 無ければ・・・ブックを作成という所だけ変更すれば使えると思うので参考にしてください。
[[20100510122429]] 『ワークブックオープン』(はる)
(momo)
確認しました。 エラーが発生し SearchTreeForFile の部分に色付けされ「Sub又はFunctionが定義されていません。」と、表示されます。 (かくれんぼ)
Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _ (ByVal RootPath As String, _ ByVal InputPathName As String, _ ByVal OutputPathBuffer As String) As Long
このコードが先頭にありますか? あと一応、標準モジュールでやってください。
上のコードがあってエラーになる場合はコード全体を見せてください。 (momo)
Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _ (ByVal RootPath As String, _ ByVal InputPathName As String, _ ByVal OutputPathBuffer As String) As Long
をコードの先頭に貼り付けると、その下に線が表示され、これでマクロを実行すると、 エラーが発生します。 (かくれんぼ)
>上のコードがあってエラーになる場合はコード全体を見せてください。
をお願いします。 (momo)
コードを表示します。
Private Sub UserForm_INITIALIZE() ComboBox1.List = Array("a", "b", "c", "d", "e") End Sub Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _ (ByVal RootPath As String, _ ByVal InputPathName As String, _ ByVal OutputPathBuffer As String) As Long (この部分に区切り線が入ります。) Private Sub CommandButton1_Click() Dim flgWB As Boolean, wb As Object
'For Each wb In Workbooks ' If wb.Name = Me.TextBox1.Text Then ' flgWB = True ' Exit For ' End If 'Next wb Dim myFolder As Object Dim myRootPath As String, myFind As String, myBook As String * 513 With CreateObject("Scripting.FileSystemObject") For Each myFolder In .Drives If myFolder.DriveType = 2 Then myRootPath = myFolder.Path & "\" myFind = TextBox1.Text & ".xls" 'ComboBox2.Value & ".xls" If SearchTreeForFile(myRootPath, myFind, myBook) Then myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1) Workbooks.Open myFind Exit Sub End If End If Next myFolder End With If flgWB = True Then Worksheets(ComboBox1.Text).Copy Before:=Workbooks(TextBox1.Text & ".xls").Sheets(1) ActiveSheet.Shapes("ボタン").Select Selection.Cut Unload UserForm1 Else MsgBox "指定のブックは見つかりません。", Title:="指定ブックの確認" Exit Sub End If End Sub
以上です。 (かくれんぼ)
コードの中身は見ていません。
それ以前に Private Sub UserForm_INITIALIZEがあるという事は ユーザーフォームのモジュールですよね? 記述は標準モジュールにしてください。
あとPrivate Declare Function・・・というAPIの宣言は 必ずモジュールの先頭に記述してください。 他の変数の宣言やプロシージャより上に記述する必要があります。
以上を修正したうえで確認して、まだエラーがあるなら教えてください。 (momo)
Option Explicit Private Declare Function SearchTreeForFile Lib "imagehlp.dll" _ (ByVal RootPath As String, _ ByVal InputPathName As String, _ ByVal OutputPathBuffer As String) As Long Sub 移動() Dim flgWB As Boolean, wb As Object Dim myFolder As Object Dim myRootPath As String, myFind As String, myBook As String * 513 With CreateObject("Scripting.FileSystemObject") For Each myFolder In .Drives If myFolder.DriveType = 2 Then myRootPath = myFolder.Path & "\" myFind = "OA5571(データ).xls" 'ComboBox2.Value & ".xls" If SearchTreeForFile(myRootPath, myFind, myBook) Then myFind = Left$(myBook, InStr(myBook, vbNullChar) - 1) Workbooks.Open myFind Exit Sub End If End If Next myFolder End With If flgWB = True Then Workbooks("Book1.xls").Sheets("Sheet1").Copy Before:=Workbooks("OA5571(データ).xls").Sheets(1) ActiveSheet.Shapes("ボタン").Select Selection.Cut Unload UserForm1 Else MsgBox "指定のブックは見つかりません。", Title:="指定ブックの確認" Exit Sub End If End Sub
としてみました。これでマクロを実行したら、「Book1」は表示されましたが、「Sheet1」は 移動していませんでした。 (かくれんぼ)
開くのであればAPI部分は大丈夫ですね。
Sheet1の移動はflgWBがTrueの場合に実行するのですよね? flgWBはどこで設定してるのでしょう?どこにも見当たらないですね。 それにmyFindのブックを開いた後にすぐExit Subしてますから その下のコードはブックがあった時にはまったく機能していないのでは? ブックが見つかって開いた時に何かをするのであればそうなるように組み替えてください。
F8でステップ実行してみる事をお勧めします。 (momo)
昨日ご指摘の部分に気づき修正しテストしたところ、正常に作動するコードができました。
If myFind = TextBox1.Text & ".xls" = True Then MsgBox "指定のブックはありません。ブック名を変えてください。" Exit Sub Else Workbooks("Book1.xls").Sheets(ComboBox1.Text).Copy Before:=Workbooks(TextBox1.Text & ".xls").Sheets(1) ActiveSheet.Shapes("ボタン").Select Selection.Cut Unload UserForm1 End If
ここで一つの疑問は、myFind = TextBox1.Text & ".xls" が正解(True)のとき、なぜElseに 飛ぶのでしょうか。間違いのときは、"指定のブックはありません。ブック名を変えてください。"に進みます。
それと、疑問は疑問として、正常に作動するようになったので、早速、職場に持ち帰り 試してみました。すると、"指定のブックは見つかりません。" が、表示されました。 なぜか考えてみました。解ったことは、コピー先のブックは、社内イントラで共有している フォルダに収容しているブックであることです。この元フォルダは私の使用している PCには保存しておりません。私の使用しているPCに保存しているブックへの移動は 正常に行います。まだ元フォルダを保存しているPCではテストできていません。
たぶん、原因はこれだと考え(間違っていたらゴメンナサイ。) For Each myFolder In .Drives の .Drives の部分コードを変えればと思い、ネットで検索しましたが、見つかりませんでした。 解決方法があれば教えてください。 (かくれんぼ)
Ifの前に MsgBox myFind = TextBox1.Text & ".xls" を入れて、Trueの時、Falseの時を比較していますか。
共有フォルダのすべてのフォルダを検索する負荷は大丈夫ですか。 (alt)
If myFolder.DriveType = 2 Then ここでローカルのハードディスクに限定して検索しています。 ネットワークドライブに対してこのコードを使うのはお勧めできません。
ネットワークに負荷が掛かるのは当然の事ですが、検索時間が膨大になります。 保管されているドライブが解っているのでしたら全検索ではなく 指定ドライブ、指定フォルダ以下をFSOなどを使って再起検索するか 上記コードでもルートフォルダを指定しなおした上で If分岐を外してみてください。
(momo)
おっしゃるように、このコードを実行するに当たっては確かに、少々重いなと感じましたが、 PC全体から検索するのでこれもやむ得ないかと思っていましたが、ネットワーク全体から 検索するとなるともっと重くなるのは解りますので、これはあきらめ、移動したいブックは 開いてから実行することにします。これであれば、以前、momoさんからご指導いただいた コードで充分対応できます。いろいろご指導有難うございました。いろんなコードがあることが 勉強でき、決して無駄なコードのご指導であったとは思いません。本当に感謝いたします。 今後ともご指導のほどよろしくお願いいたします。 (かくれんぼ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.