タイトル : Re: Excelが解放されない 投稿日 : 2010/07/09(Fri) 01:33 投稿者 : 魔界の仮面弁士
> VB6 SP3 > WinXP Pro SP2 > Office2000 Standard > IE6 XP 付属の VB ランタイムは、VB6 SP3 の物より後継バージョンであるため、 上記の組み合わせで VB6 SP3 を使うのは問題があります。SP6 にしましょう。 同様に、Office 2000 についても、最新の Service Pack を適用すべきです。 # WinXP の Service Pack を更新するかどうかは任意ですが。 > fsoFilCop.CopyFile ActiveWorkbook.Path & "\" & ActiveWorkbook.Name, _ > "\\Kq-001\SETKQFILE\工程不良集計\Ppk集計" & "\Ppk管理図" & Gouki & _ > "\06\06Ppk管理図" & Series & "" & Bunkatu & ".xls" 原因はここですね。どのオブジェクトの ActiveWorkbook プロパティなのかが明示されていません。 xlApp.ActiveWorkbook などのようにすれば、とりあえずは解決すると思います。 http://hanatyan.sakura.ne.jp/vbhlp/ExcelErr.htm ただし今回の場合、操作しているブックは xlBook 変数に格納されているはずですから、 本来は、そもそも ActiveWorkbook プロパティの出番自体が無いはずです。コードを見直してみましょう。 > 少々長いプログラムで、読みにくいかもしれませんが、よろしくお願い致します。 ついでに、他の場所についても幾つか指摘を。 > Dim xlApp As Excel.Application > Set xlApp = CreateObject("Excel.Application") 参照設定しているなら、「Set xlApp = New Excel.Application」の方が良いでしょう。 > Set xlBook = xlApp.Workbooks.Open("\\Kq-001\工程集計\工程不良集計\Ppk集計" & "\Ppk管理図" _ > & Gouki & "\06\06Ppk管理図" & Series & "" & Bunkatu & ".xls") 「& "" &」というのは「&」と同じ意味ですので、無駄な記述に見えます。 また「"\\Kq-001\工程集計\工程不良集計\Ppk集計" & "\Ppk管理図"」についても、 単に「"\\Kq-001\工程集計\工程不良集計\Ppk集計\Ppk管理図"」で良いのでは無いでしょうか。 (これと同様の冗長的な文字列操作が、他にも数箇所見受けられます) > xlApp.Application.ScreenUpdating = True '画面の描画をONに戻す xlApp.ScreenUpdating と xlApp.Application.ScreenUpdating と xlApp.Application.Application.ScreenUpdating と xlApp.Application.Application.Application.ScreenUpdating は、 いずれも同じ意味になります。 通常、Application プロパティの出番は無いはずです。xlApp を使うようにしましょう。 > Set xlSheet = xlBook.Worksheets(L_Value) > xlBook.Sheets(L_Value).Select '対象L値のシート選択 L_Value というのが、シート名を表す文字列なのか、シート番号を示す自然数なのか 読み取れませんでしたが、恐らく、ここでいう xlBook.Worksheets(L_Value) と xlBook.Sheets(L_Value) は、同じシートを表しているのですよね? 同じシートならば、最初に取得した xlSheet 変数を使って制御するようにすべきです。 もし両者が違うシートを意味しているなら、Sheets プロパティの利用は避け、 シートの種類(ワークシート、グラフ、ダイアログ、マクロシート)ごとに .Worksheets / .Charts / .DialogSheets / .Excel4MacroSheets プロパティを 使い分けるようにしましょう。 > If xlSheet.Cells(29, 51) = Empty Then 'Ppk管理図ファイルのセル(29行, 51列)が空の場合 Empty 値の判定に = 演算子を使うことはできません。= 演算子を使って調べてしまうと、たとえば、 そのセルが「=3-2-1」すなわち 0 だった場合にも空セルと誤判定されてしまうことになります。 Empty 値の判定には、VarType 関数または IsEmpty 関数を用いるようにしましょう。 If IsEmpty(xlSheet.Cells(29, 51).Value) Then > xlSheet.Cells(29, xlApp.ActiveSheet.Columns.Count).End(xlToLeft).Offset(0, 1) = Now '月 > xlSheet.Cells(29, xlApp.ActiveSheet.Columns.Count).End(xlToLeft).Offset(1, 0) = Now '日 > xlSheet.Cells(29, xlApp.ActiveSheet.Columns.Count).End(xlToLeft).Offset(2, 0) = P_p_k 'Ppk Selection プロパティや Active 系プロパティの利用はできるだけ避けてください。 (多用すると、コードの意図が曖昧になってしまいます) ActiveWorkbook プロパティと同様に、ActiveSheet プロパティの出番も無いはずです。 先ほど、L_Value のシートを Select したわけですから、その時のシートを明示すれば済みますよね。 また、End プロパティを繰り返し使っていますが、データ入力に応じて終端位置は変動しますので、 このようなコードを多用すると、どの位置に記入しているのかが分かりにくくなる可能性があります。 基準位置となるセルを変数に保持しておいた方が、コードがスッキリすると思いますよ。 Set rng = xlSheet.Cells(29, xlSheet.Columns.Count).End(xlToLeft) rng.Offset(0, 1).Value = Now rng.Offset(1, 1).Value = Now rng.Offset(2, 1).Value = P_p_k > Dim fsoFolExi As New FileSystemObject > Dim fsoFolCop As New FileSystemObject > Dim fsoFilCop As New FileSystemObject VB6 の場合、宣言時に New を組み込むのは避けた方が良いでしょう。 また、FileSystemObject のインスタンスは 1 つあれば十分のハズです。 Dim fso As FileSystemObject Set fso = New FileSystemObject > If fsoFolExi.FolderExists(strPpkFolNam_Path) <> "true" Then FolderExists の戻り値は Boolean 型です。String と比較すべきではありません。 処理結果としては同じ事ですが、この場合には If Not fsoFolExi.FolderExists(strPpkFolNam_Path) Then もしくは If fsoFolExi.FolderExists(strPpkFolNam_Path) = False Then の方が適切かと。 > fsoFolCop.CopyFolder "\\Kq-001\工程集計\原紙ファイル\Ppk管理図(原紙)", _ > "\\Kq-001\工程集計\工程不良集計\Ppk集計" & "\" > Name "\\Kq-001\工程集計\工程不良集計\Ppk集計" & "\" & "\Ppk管理図(原紙)" _ > As "\\Kq-001\工程集計\工程不良集計\Ppk集計" & "\" & "\Ppk管理図" & Gouki 間違いではありませんが、この部分、やや統一性が無いように見えました。 コピーは FileSystemObject で行っているのに、名前変更は FileSystemObject を使わず、 Name ステートメントを使っていますね。Name プロパティを使った方が良いのではないでしょうか。 > どなたかご教授いただけませんでしょうか。 http://www.tt.rim.or.jp/~rudyard/torii009.html |