Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4993 / 13644 ツリー ←次へ | 前へ→

【53177】モジュール削除、インポート連続実行で不具合 ウーロン 07/12/18(火) 17:26 質問[未読]
【53178】Re:モジュール削除、インポート連続実行で... Jaka 07/12/18(火) 17:38 発言[未読]
【53179】Re:モジュール削除、インポート連続実行で... neptune 07/12/18(火) 17:49 発言[未読]
【53181】Re:モジュール削除、インポート連続実行で... ウーロン 07/12/18(火) 18:52 発言[未読]
【53189】Re:モジュール削除、インポート連続実行で... Jaka 07/12/19(水) 11:42 発言[未読]
【53192】Re:モジュール削除、インポート連続実行で... ウーロン 07/12/19(水) 14:54 質問[未読]
【53193】Re:モジュール削除、インポート連続実行で... ウーロン 07/12/19(水) 15:10 発言[未読]
【53194】Re:モジュール削除、インポート連続実行で... ウーロン 07/12/19(水) 15:43 質問[未読]
【53195】Re:モジュール削除、インポート連続実行で... Jaka 07/12/19(水) 16:21 発言[未読]
【53196】Re:モジュール削除、インポート連続実行で... ハチ 07/12/19(水) 17:46 発言[未読]
【53197】Re:モジュール削除、インポート連続実行で... ウーロン 07/12/19(水) 19:40 発言[未読]
【53198】Re:モジュール削除、インポート連続実行で... ハチ 07/12/19(水) 20:14 発言[未読]
【53202】Re:モジュール削除、インポート連続実行で... neptune 07/12/19(水) 22:41 発言[未読]
【53204】Re:モジュール削除、インポート連続実行で... ウーロン 07/12/20(木) 14:08 お礼[未読]

【53177】モジュール削除、インポート連続実行で不...
質問  ウーロン  - 07/12/18(火) 17:26 -

引用なし
パスワード
   よろしくお願いいたします

モジュール削除
モジュールインポート
のマクロを作成しました
どちらも対象ブックを開いておいて実行します
で、
各々イミディエイトウインドウからのCallで単独実行は問題なく動きます
が、
下記のように一括で行うと上書きになってしまいます

状況的には
手動実行では削除時、プロジェクトエクスプローラで、モジュールが削除
されていることが確認できますが
連続実行では、インポートで停止しても
プロジェクトエクスプローラ上では、モジュールは削除されていません。

ココ?で何か必要な気もしますがよくわかりません
アドバイスありましたらよろしくお願いいたします。

Public Sub Md_UpDate(wk_FullPath As String, Tg_Fld_Path As String)

  'ブックが未使用なら開く、使用中なら中止
  If CK_opened_FILE(wk_FullPath) = False Then Debug.Print wk_FullPath : Exit Sub
  
  'モジュール一括削除
  Call Md_Remove(wk_FullPath)
  
  'ココ?
  
  'モジュール一括インポート
  Call Md_Import(wk_FullPath, Tg_Fld_Path)
  
End Sub

【53178】Re:モジュール削除、インポート連続実行...
発言  Jaka  - 07/12/18(火) 17:38 -

引用なし
パスワード
   ぱっと見で思いつきで確認とって無いけど、
こんなのを入れてから回ししてみると良いかも。
ついでにDoeventsも入れたほうが良いかも。

  With ActiveWorkbook.VBProject
    For Each VBC In .VBComponents
    Next
  End With

【53179】Re:モジュール削除、インポート連続実行...
発言  neptune  - 07/12/18(火) 17:49 -

引用なし
パスワード
   VBProjectが構成の変更が更新されてない??
私も思いつきですが、
書き込む前に一度当該Bookを保存してみるとか。。。?

【53181】Re:モジュール削除、インポート連続実行...
発言  ウーロン  - 07/12/18(火) 18:52 -

引用なし
パスワード
   Jakaさん neptuneさん ありがとうございます

To Jakaさん

>  With ActiveWorkbook.VBProject
>    For Each VBC In .VBComponents
>    Next
>  End With

いまいちどこに組み込めばいいのか自身がありませんが
コメントアウトのように試してみたのですが・・・
うまく行きませんでした。
ご指示のイメージと違っていますか?
ぐちゃぐちゃで理解しにくいような気もしますが・・・
申し訳ありません

To Jakaさん
To neptuneさん

DoEvents
Workbooks(TG).Save
Application.Wait

の組み合わせでうまくいくときと行かないときがあります
Application.Wait
だけではうまくいかないみたいだし
この時間が短くてもうまくいかない(一部のmが上書きになる)

DoEventsも組み合わせがいろいろあって・・・・

取りあえず、試行PCでは
コメントアウト無しのでうまくいきました

実際の実行CPUは、色々でちょっと心配です

取りあえず、動いた報告でした。

アドバイスありましたらよろしくお願いいたします

Public Sub AllMdlUpDate(wk_FullPath As String, Tg_Fld_Path As String)

  Dim vbc  As VBIDE.VBComponent


  'ブックが未使用なら開く、使用中なら中止
  If CK_opened_FILE(wk_FullPath) = False Then Debug.Print wk_FullPath & ":対象ブック使用中": Exit Sub
  DoEvents
  
  'モジュール一括削除
  Call AllMdlRemove(wk_FullPath)
    
  
  Workbooks((Right(wk_FullPath, Len(wk_FullPath) - InStrRev(wk_FullPath, "\")))).Save  '上書き保存
  DoEvents
  
  'Application.Wait Now + TimeValue("00:00:2")
  Application.Wait Now + TimeValue("00:00:10")
  'Application.Wait Now + TimeValue("00:00:20")
  DoEvents
  
  'モジュール一括インポート
  Call AllMdlImport(wk_FullPath, Tg_Fld_Path)
  
  'With ActiveWorkbook.VBProject
  '  For Each vbc In .VBComponents
    
  '    DoEvents
    
      'モジュール一括削除
  '     Call AllMdlRemove(wk_FullPath)
        
      'Debug.Print ""
      'MsgBox ""
  '     DoEvents
      
      'モジュール一括インポート
  '     Call AllMdlImport(wk_FullPath, Tg_Fld_Path)
    
  '     DoEvents
      
  '   Next
  ' End With
  
End Sub

【53189】Re:モジュール削除、インポート連続実行...
発言  Jaka  - 07/12/19(水) 11:42 -

引用なし
パスワード
   手動と連続実行の違いがよく解りませんが、
下記コードだと矢印を入れたところにブレークポイントを置いた場合、
モジュールが消えてないということでしょうか?

Sub popo()
  Dim wb As Workbook
  Dim VBC As Object
  PAS = CreateObject("WScript.Shell").SpecialFolders("Desktop")
  With Workbooks("moju_in.xls").VBProject
    For Each VBC In .VBComponents
      If VBC.Type = 1 Then
        .VBComponents.Remove VBC
      End If
    Next
    For i = 1 To 2  '←ここでストップ?
      .VBComponents.Import PAS & "\Module" & i & ".bas"
    Next
  End With
End Sub


On Timeで時間差攻撃?
【30940】ユーザーフォームのインポート
ht tp://www.vbalab.net/vbaqa/c-board.cgi?page=&no=30940&mode=tre&id=excel&cmd=jmp

それとなんとなく、削除するモジュールの中のマクロを消す前に1度実行していますか?
で、その中にSet文などが書かれていて、解放してないとか?

別ブックやシートを変数にセットしたままにすると、そのブックを閉じてもプロジェクトに残ったままなんて事があるらしいので。
また、空回しするのはマクロでプロジェクトの中を操作したりすると、エクセルが認識してないなんて事があったので認識させるための工夫です。

ここに書いたのも上記理由からです。
ht tp://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=205;id=FAQ

【53192】Re:モジュール削除、インポート連続実行...
質問  ウーロン  - 07/12/19(水) 14:54 -

引用なし
パスワード
   ▼Jaka さん:
こんにちは
テストコードありがとうございます

不具合がみつかりましたが下記のごとく解決に至りません


テストコードpopo実行
>←ここでストップ?
ひとつのbasが残っていました

>>この時間が短くてもうまくいかない(一部のmが上書きになる)
上書きになるbasでした

上記は
WIN2K、エクセル2K
XP、エクセル2003
両方で試しました


もしかして、ブックが破損しているのではないかと

対応1)環境 XP、エクセル2003

対象ブックを
エクセル2003で開くとき修復してpopoすると
取りあえずbasについては全て削除されました

削除結果がプロジェクトエクスプローに反映されています
>For i = 1 To 2  '←ここでストップ?
再実行
Module1,2がインポートされ、正常実行できました。


対応2)通常環境 WIN2K、エクセル2k
上記をWIN2Kのマシンに持ってきて試すと

Module1.bas    
Module10.bas    
Module11.bas    
Module2.bas    
Module3.bas    
Module4.bas    
Module5.bas    
Module6.bas    
Module7.bas    
Module8.bas    
Module9.bas    
のうち
やはりModule9.basが残ってしまいます

>For i = 1 To 2  '←ここでストップ?
で中止を押すと、
Module9.basが、なくなります
~~~~~~~~~~~~~~~~~~~~~~~~~~
ちなみに
  'モジュール一括削除
  Call Md_Remove(wk_FullPath)
でも、同じ現象が発生しました。

色々試してみましたが
WIN2K、エクセル2kでは、これが回避できません

ブック破損時、2K時お世話になっている
Excel最適化
//www.loadsystem.net/excel/xlscmpt.htm
を実行してみましたが同じです

XPのマシンでは、この現象が発生しません

> VBProjectが構成の変更が更新されてない??
につてですが
標準モジュールのフォルダ?が展開していなかったため
あたかも更新されていないように見えたように思われます

で、実際に行う対象ブックでいくつか試してみましたが
同じ状況となっています
全て破損状態・・・かな・・・

ただ、救いは

DoEvents
Workbooks(TG).Save
Application.Wait

取りあえず、動いた報告でした。
です

何かアドバイスありましたらよろしくお願いいたします

【53193】Re:モジュール削除、インポート連続実行...
発言  ウーロン  - 07/12/19(水) 15:10 -

引用なし
パスワード
   修正です

上記勘違いでした


>上記は
>WIN2K、エクセル2K
>XP、エクセル2003
>両方で試しました

>XP、エクセル2003
では、試していなかったみたいです

>で、実際に行う対象ブックでいくつか試してみましたが
>同じ状況となっています
>全て破損状態・・・かな・・・

XP、エクセル2003
のマシンでは不具合は発生しない
です

症状は
WIN2K、エクセル2K
のときだけ出る
です

アドバイスありましたらよろしくお願いいたします

【53194】Re:モジュール削除、インポート連続実行...
質問  ウーロン  - 07/12/19(水) 15:43 -

引用なし
パスワード
   追記です

XP、エクセル2003のマシンで、不具合は発生しました

別PC
WIN2K、エクセル2K × 1台
XP、エクセル2003 × 1台
で試しましたが各々同様な不具合が発生しました

WIN2K、エクセル2K
Module9.bas


XP、エクセル2003
Module1.bas    
Module10.bas    
Module11.bas    
みたいな感じでした

でやはり
>For i = 1 To 2  '←ここでストップ?
で中止を押すと、
basが、なくなります

何かありましたらよろしくお願いいたします

【53195】Re:モジュール削除、インポート連続実行...
発言  Jaka  - 07/12/19(水) 16:21 -

引用なし
パスワード
   まだ、13個ものモジュールで試してないので、残るというのが確認取れてませんけど。
モジュールを削除した後、1度VBProjectの中を1番最初に提示した方法で空回りさせてみてください。

あれ、前に新規にマクロでモジュール作って、そこにコードを挿入、実行後にモジュールの削除なんてことをごちゃごちゃやっていた時は、どうしたのか忘れてしまいました。
この時もうまく認識してくれませんでした。

なんせ、マカフィ―に資料が全部消されて残ってないんです。
テキストに書いておいたものも。

【53196】Re:モジュール削除、インポート連続実行...
発言  ハチ  - 07/12/19(水) 17:46 -

引用なし
パスワード
   ▼ウーロン さん:

自分の環境が、Win2k,Excel2kですので、
Jakaさんのコードを試してみましたが、
正常に動作しますよ。

>で中止を押すと、
>basが、なくなります

この『なくなります』ですが、
元のファイルが無くなるのですか?
プロジェクトの標準モジュールから無くなるのですか?

Importですが、
既存に同じモジュール名がある場合は、
上書きされずに違うモジュール名でImportされましたが、
そのあたりにコードのバグとかないですか?

【53197】Re:モジュール削除、インポート連続実行...
発言  ウーロン  - 07/12/19(水) 19:40 -

引用なし
パスワード
   Jakaさん ありがとうございます

>なんせ、マカフィ―に資料が全部消されて残ってないんです。
>テキストに書いておいたものも。

時折、見かけることが有るような気がしましたが
こうして、生に聞くと、実際に削除されてしまうんですね〜

やはり、こういう操作は・・・避けるようにしたいけど・・・
データ入力補助でシートイベントを多用していて
うまくDTブックとマクロブックが分離できなかったみたいなです
時間が取れたときにブックの分離について再考してみたいと思いますが時間がないです・・・
ただ、本件は、入れ替えが済めば重過ぎるので、修正する気にはなりません・・・
です

>モジュールを削除した後、1度VBProjectの中を1番最初に提示した方法で空回りさせてみてください。
空回りですか
了解です


ハチさん ありがとうございます

>上書きされずに違うモジュール名でImportされましたが、
すいません、書き間違いです
Module9.basに追加でModule91.basとなります

>そのあたりにコードのバグとかないですか?
症状は、アップ頂いたpopoと同じものになります。


以下は切り分けのためpopoでの検証結果1-3です

1)-2)時は、basが残るエラーがあったのですが
3)時に作成途中になぜかエラーが出なくなってしまいました

で、動作確認しようとするとフォームが古いままで動作せず
フォーム他入れ替えも組み込んでしまいました。

1)-2)は、対象ブックを開いたまま実行
3)はコードからブックを開いています
で、対象ブックの途中保存も不要となりました

原因がはっきりつかめていないのでなんともですが・・・
コメント頂けるとうれしいですよろしくお願いいたします


'1)上書き時 (途中でsaveしない場合)

Sub popo()
  Dim wb As Workbook
  Dim vbc As Object
  PAS = CreateObject("WScript.Shell").SpecialFolders("Desktop")
  With Workbooks("TG_BOOK.xls").VBProject
  
  'basが11個表示
  
    DoEvents
    
    For Each vbc In .VBComponents
      If vbc.Type = 1 Then
        .VBComponents.Remove vbc
      End If
    Next
    
    'Module9.basが残

    DoEvents
    
    With ActiveWorkbook.VBProject
      For Each vbc In .VBComponents
      Next
    End With
    
    'Module9.basが残
    
    DoEvents
    
    With ActiveWorkbook.VBProject
      For Each vbc In .VBComponents
      Next
    End With
    
    'Module9.basが残
    
    DoEvents
    
    For I = 1 To 11  '←ここでストップ?
      .VBComponents.Import CreateObject("WScript.Shell").SpecialFolders("Desktop") & NEW_MD & I & ".bas"
    Next
    
    '11bas+Module91.basが追加
    
    DoEvents
    
  End With
End Sub


'2)上書き時 (途中でsaveした場合)

Sub popo()
  Dim wb As Workbook
  Dim vbc As Object
  PAS = CreateObject("WScript.Shell").SpecialFolders("Desktop")
  With Workbooks("TG_BOOK.xls").VBProject
  
  'basが11個表示
  
    DoEvents
    
    For Each vbc In .VBComponents
      If vbc.Type = 1 Then
        .VBComponents.Remove vbc
      End If
    Next
    
    'Module9.basが残

    DoEvents
    
    With ActiveWorkbook.VBProject
      For Each vbc In .VBComponents
      Next
    End With
    
    'Module9.basが残
    
    DoEvents
    
    Workbooks("TG_BOOK.xls").Save  '上書き保存
    
    'Module9.basが残
    
    DoEvents
    
    With ActiveWorkbook.VBProject
      For Each vbc In .VBComponents
      Next
    End With
    
    'Module9.basが残
    
    DoEvents
    
    For I = 1 To 11  '←ここでストップ?
      .VBComponents.Import CreateObject("WScript.Shell").SpecialFolders("Desktop") & NEW_MD & I & ".bas"
    Next
    
    '11bas+Module91.basが追加
    
    DoEvents
    
  End With
End Sub

'3)エラーがなくなりました

Sub popo()
  Dim wb As Workbook
  'Dim vbc As Object
  Dim vbcs  As VBIDE.VBComponents
  Dim vbc   As VBComponent
  
  
  'PAS = CreateObject("WScript.Shell").SpecialFolders("Desktop")
  
  Application.EnableEvents = False
  On Error Resume Next
  Workbooks.Open ("\\TG_FLD\TG_BOOK.xls")
  On Error GoTo 0
  Application.EnableEvents = True
  
  With Workbooks("TG_BOOK.xls").VBProject
  
  'basが11個表示
  
    DoEvents
    
    'For Each vbc In .VBComponents
      'If vbc.Type = 1 Then
      '  .VBComponents.Remove vbc
      'End If
    Set vbcs = Workbooks("TG_BOOK.xls").VBProject.VBComponents
    For Each vbc In vbcs
      
      
      Select Case vbc.Type
        'Case vbext_ct_StdModule, vbext_ct_ClassModule, vbext_ct_ClassModule
        Case vbext_ct_StdModule, vbext_ct_ClassModule, vbext_ct_MSForm
          vbcs.Remove vbc
        Case vbext_ct_Document
          With vbc.CodeModule
          .DeleteLines 1, .CountOfLines
          End With
        Case Else
          vbcs.Remove vbc
        
      End Select
      
    Next
    
  'basが無し
  
  
    DoEvents
    
    'For I = 1 To 11  '←ここでストップ?
    '  .VBComponents.Import CreateObject("WScript.Shell").SpecialFolders("Desktop") & NEW_MD & I & ".bas"
    'Next
    
    Call AllMdlImport("TG_BOOK.xls", "C:\Documents and Settings\NEW_MD")
    
    DoEvents
    
'    Workbooks("TG_BOOK.xls").Save  '上書き保存
    
  End With
End Sub

【53198】Re:モジュール削除、インポート連続実行...
発言  ハチ  - 07/12/19(水) 20:14 -

引用なし
パスワード
   ▼ウーロン さん:
>>>上書きされずに違うモジュール名でImportされましたが、
>すいません、書き間違いです
>Module9.basに追加でModule91.basとなります

プロジェクト上のモジュール ということですね。

>原因がはっきりつかめていないのでなんともですが・・・
>コメント頂けるとうれしいですよろしくお願いいたします

自分はこの手のコードはあまり書いたことがないので、
自信ないですが・・・
実験のつもりで書いてみました。
新規BookをActiveにした状態で試してみてください。

Option Explicit

'標準モジュールを10枚追加
Sub main_Add()
  Dim i As Integer
  
  For i = 1 To 10
    Call Proc_Mod_Add(ActiveWorkbook)
  Next
  Call Debug_ModName(ActiveWorkbook)
End Sub

Sub Proc_Mod_Add(Wb As Workbook)

  If Wb.Name = ThisWorkbook.Name Then Exit Sub
  
  Wb.VBProject.VBComponents.Add vbext_ct_StdModule
  Wb.Save
End Sub
'---------------------------------------------------------

'全ての標準モジュールを削除
Sub Main_Del()
  
  Call Proc_Mod_Del(ActiveWorkbook)
  Call Debug_ModName(ActiveWorkbook)
End Sub

Sub Proc_Mod_Del(Wb As Workbook)
  Dim objMod As VBComponent
  
  If Wb.Name = ThisWorkbook.Name Then Exit Sub
  
  With Wb.VBProject
    For Each objMod In .VBComponents
      If objMod.Type = vbext_ct_StdModule Then
        .VBComponents.Remove objMod
        Wb.Save
      End If
    Next
  End With
End Sub

'---------------------------------------------------------

'Debug用 イミディエイトに標準モジュール名を,区切で書き出し
Sub Debug_ModName(Wb As Workbook)
  Dim buf As Variant
  
  buf = Get_Mod_Name(Wb)
  If Not IsEmpty(buf) Then
    Debug.Print Join(buf, ",")
  Else
    Debug.Print "標準モジュールなし"
  End If
End Sub

'標準モジュール名を一次配列で返す。なければEmpty値
Function Get_Mod_Name(Wb As Workbook) As Variant
  Dim Mod_Name() As String
  Dim i As Integer
  Dim objMod As VBComponent
  i = 0
  ReDim Mod_Name(i)
  With Wb.VBProject
    For Each objMod In .VBComponents
      If objMod.Type = vbext_ct_StdModule Then
        ReDim Preserve Mod_Name(i)
        Mod_Name(i) = objMod.Name
        i = i + 1
      End If
    Next
  End With
  If i = 0 Then
    Get_Mod_Name = Empty
  Else
    Get_Mod_Name = Mod_Name
  End If
  Erase Mod_Name
End Function
'---------------------------------------------------------

【53202】Re:モジュール削除、インポート連続実行...
発言  neptune  - 07/12/19(水) 22:41 -

引用なし
パスワード
   みなさん、こんにちは

ちょっと実験してみる根性が無いので、参考にさせていただきます。

【53204】Re:モジュール削除、インポート連続実行...
お礼  ウーロン  - 07/12/20(木) 14:08 -

引用なし
パスワード
   ハチさん こんにちは

コードのご提示ありがとうございます
わかりやすい解説とコメントで
問題なく動作させることが出来ました。

あわせて、
コードの勉強もさせていただきました。
ありがとうございました


neptuneさん ありがとうございます

>ちょっと実験してみる根性が無いので、参考にさせていただきます。

理解しくいQのなか、アドバイスありがとうございました


操作途中で、何度かエクセルが落ちたりして
また、エクセル2003は、あまり使用したことが無く
破損ブックを自動的に回復してくれたりして
混乱するなか、さらに、操作対象のブックが異なったりして
もう大変
な状態でした・・・
自分がこんなんでは皆さんは、さらに???状態でなかったかと


当初に、気づくべきでしたが
>どちらも対象ブックを開いておいて実行します
>で、
>各々イミディエイトウインドウからのCallで単独実行は問題なく動きます

連続実行時
>'ブックが未使用なら開く、使用中なら中止
>If CK_opened_FILE(wk_FullPath) = False Then Debug.Print wk_FullPath : Exit Sub
で、不具合
は、

>このQでなく、関連別Qだったような気がしますが
>起動時マクロがないかのご指摘を受けたような気がします


>3)時に作成途中になぜかエラーが出なくなってしまいました

  Application.EnableEvents = False
  On Error Resume Next
  Workbooks.Open ("\\TG_FLD\TG_BOOK.xls")
  On Error GoTo 0
  Application.EnableEvents = True
だったようです

  Application.EnableEvents = False
をはずすと
>Module9.basに追加でModule91.basとなります
が、再現しました

で、
WIN2K、エクセル2K
XP、エクセル2003
どちらも問題なく動作するようになりました


ちなみに、ウイルスソフトは、会社、自宅ともウイルスバスターですが
これは削除しないみたいです

マカフィ―以外にシマンテックも聞いたことがあったようですが
情報ありましたらコメント簡単に頂けるとうれしいです

今回、初めて、モジュール編集作業を行たのですが
おかげさまで、なんとか、操作できるようになった気がします
うれしい事か悲しいことか(そんな処理が必要なブックを作成)
不明ですが・・・・

あわせて、何か注意事項他ありましたらよろしくお願いいたします。


Jakaさん
neptuneさん
ハチさん

ありがとうございました。
今後もよろしくお願いいたします。

解決です。

4993 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free