過去ログ

                                Page      54
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼マクロの削除(整理)  haru 02/9/4(水) 10:24
   ┗Re:マクロの削除(整理)  ぴかる 02/9/4(水) 11:00
      ┗Re:マクロの削除(整理)  haru 02/9/4(水) 13:17
         ┗Re:マクロの削除(整理)  ぴかる 02/9/4(水) 15:03
            ┗Re:マクロの削除(整理)  りん 02/9/4(水) 17:49
               ┗ちなみにマクロ名の列挙は  大那 02/9/5(木) 15:13
                  ┣Re:ちなみにマクロ名の列挙は  コロスケ 02/9/6(金) 10:47
                  ┃  ┗Re:ちなみにマクロ名の列挙は  大那 02/9/6(金) 11:04
                  ┗Re:ちなみにマクロ名の列挙は  りん 02/9/8(日) 0:56
                     ┣Re:ちなみにマクロ名の列挙は  大那 02/9/9(月) 10:27
                     ┗Re:ちなみにマクロ名の列挙は  haru 02/9/9(月) 15:40
                        ┣Re:ちなみにマクロ名の列挙は  コロスケ 02/9/9(月) 15:48
                        ┗Re:ちなみにマクロ名の列挙は  コロスケ 02/9/9(月) 16:38
                           ┗Re:ちなみにマクロ名の列挙は  haru 02/9/10(火) 9:21

 ───────────────────────────────────────
 ■題名 : マクロの削除(整理)
 ■名前 : haru
 ■日付 : 02/9/4(水) 10:24
 -------------------------------------------------------------------------
    マクロの記録をすると、自動的に、モジュールが追加されそこに
macro1,macro2,macro3・・・という風に追加されますが、
 これらのマクロ名のものを削除したいのですが。
 またその結果、モジュール内が空になるか、またはコメントだけ
になってしまったら、モジュールごと削除したいのですが。
 以上をあるブックの全てもモジュールに対してやりたいのですが、
可能でしょうか?
 更にできれば、あるフォルダ内の全てのブックに対しても実行し
たいのですが。
 よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:マクロの削除(整理)  ■名前 : ぴかる  ■日付 : 02/9/4(水) 11:00  -------------------------------------------------------------------------
   haruさん、こんにちは。

V3にて標準モジュールの削除方法を教えていただきました。
よろしかったら、参考にして下さい。

http://www21.tok2.com/home/vbalab/bbs/c-board.cgi?cmd=ntr;tree=10169;id=Excel
 ───────────────────────────────────────  ■題名 : Re:マクロの削除(整理)  ■名前 : haru  ■日付 : 02/9/4(水) 13:17  -------------------------------------------------------------------------
   ▼ぴかる さん:
こんにちは。ありがとうございます。

>V3にて標準モジュールの削除方法を教えていただきました。
>よろしかったら、参考にして下さい。
>http://www21.tok2.com/home/vbalab/bbs/c-board.cgi?cmd=ntr;tree=10169;id=Excel

 一応投稿前に拝見いたしました。
 モジュール内に例えば、次のようなマクロがあったとき、

Sub Macro1()
'
' Macro1 Macro
' マクロ記録日 : 2002/9/4 ユーザー名 :
'

'
    '(記録内容)
End Sub

sub test()
    '自分で記入したコード
End Sub

 Macro1だけ削除したいのですが、可能ですか?
 大きな違いは、この辺です。
 よろしくお願いします。

 モジュール内がMacro1だけなら、これを削除した後、モジュール
そのものも削除したいのですが。
 ───────────────────────────────────────  ■題名 : Re:マクロの削除(整理)  ■名前 : ぴかる  ■日付 : 02/9/4(水) 15:03  -------------------------------------------------------------------------
   haruさん、こんにちは

>Sub Macro1()
>'
>' Macro1 Macro
>' マクロ記録日 : 2002/9/4 ユーザー名 :
>'
>
>'
>    '(記録内容)
>End Sub
>
>sub test()
>    '自分で記入したコード
>End Sub
>
> Macro1だけ削除したいのですが、可能ですか?
> 大きな違いは、この辺です。
> よろしくお願いします。
>
> モジュール内がMacro1だけなら、これを削除した後、モジュール
>そのものも削除したいのですが。
ごめんなさい。私には無理です。どなたかお助けを・・・。
 ───────────────────────────────────────  ■題名 : Re:マクロの削除(整理)  ■名前 : りん <rin_doggie@hotmail.com>  ■日付 : 02/9/4(水) 17:49  -------------------------------------------------------------------------
   haruさん、ぴかるさん、こんにちは

>> Macro1だけ削除したいのですが、可能ですか?

Macro1からMacro100まで削除します。
Sub Main()
  Application.ScreenUpdating = False
  '実行用
  Dim ws As Worksheet, wb As Workbook
  'ログ残す
  Set ws = Workbooks.Add.Worksheets(1)
  ws.Cells(1, 1).Value = "ブック"
  ws.Cells(1, 2).Value = "Macro削除"
  '指定するフォルダ名
  Ipath$ = "D:\MacroDelete"
  '最初のファイルチェック
  Ifile$ = Dir(Ipath$ + "\*.xls")
  Rmax& = 1
  Do
   If Ifile$ = "" Then Exit Do
   Rmax& = Rmax& + 1
   ws.Cells(Rmax&, 1).Value = Ifile$
   Ifile$ = Dir '継続
  Loop
  '
  For RR& = 2 To Rmax&
   Ifile$ = ws.Cells(RR&, 1).Value
   Set wb = Workbooks.Open(FileName:=Ipath$ + "\" + Ifile$)
   Application.StatusBar = wb.Name
   '関数呼び出し
   ws.Cells(RR&, 2).Value = RemoveSubs(wb)
   With wb
     .Close SaveChanges:=True
   End With
   Set wb = Nothing
  Next
  '
  ws.Parent.Saved = True
  Set ws = Nothing
  With Application
   .ScreenUpdating = True
   .StatusBar = False
  End With
End Sub
'
Private Function RemoveSubs(wb As Workbook) As Long
  '削除したSubの数を返す関数
  Dim vbcs As Object, vbc As Object
  Dim LL&, L1&, L2&, Lflg As Boolean
  Set vbcs = wb.VBProject.VBComponents
  LL& = 0
  For Each vbc In vbcs
   If vbc.Type = 1 Then
     '
     GoSub LineChk:
     'モジュールが空になっていたら削除
     If Lflg = True Then
      vbcs.Remove vbc 'モジュール削除
     End If
   End If
  Next
  Set vbcs = Nothing: Set vbc = Nothing
  RemoveSubs = LL&
Exit Function
'//////////
LineChk:
  'Module100までチェック
  For NN& = 1 To 100
   L1& = 0: L2& = 0
   With vbc.CodeModule
     On Error Resume Next
     L1& = .ProcStartLine("Macro" & NN&, vbext_pk_Proc)
     L2& = .ProcCountLines("Macro" & NN&, vbext_pk_Proc)
     On Error GoTo 0
     If L1& > 0 Then
      .DeleteLines L1&, L2&
      LL& = LL& + 1
     End If
     If .CountofLines = 0 Then Exit For
   End With
  Next
  Lflg = (vbc.CodeModule.CountofLines = 0)
  'コメントのみある場合(SubやFunction宣言がない場合)のチェック
  If Lflg = False Then
   With vbc.CodeModule
     If .Find("Sub", 1, 1, .CountofLines, 1) = False Then
      If .Find("Function", 1, 1, .CountofLines, 1) = False Then
        .DeleteLines 1, .CountofLines
        LL& = LL& + 1
        Lflg = True
      End If
     End If
   End With
  End If
Return
End Function

こんな感じです。
 ───────────────────────────────────────  ■題名 : ちなみにマクロ名の列挙は  ■名前 : 大那  ■日付 : 02/9/5(木) 15:13  -------------------------------------------------------------------------
   りんさん、haruさん、ぴかるさん、こんにちは

このマクロの削除の問答、
とても興味深いものでしたので拝見させていただいたのですが、
こんなことまでできちゃうんですね(^^;

ちなみに、指定したmoduleの中にあるマクロの名前の一覧などは
作成することができるのでしょうか?
 ───────────────────────────────────────  ■題名 : Re:ちなみにマクロ名の列挙は  ■名前 : コロスケ <corosuke@chan.co.jp>  ■日付 : 02/9/6(金) 10:47  -------------------------------------------------------------------------
   ▼大那 さん:
こんにちは。ActiveWorkbookのModule,Functionの名前を抜き出してみました。
Microsoft Visual Basic for Applications Extensibility 5.3 に参照設定をしてください。
ではー♪


Sub Test()
  Debug.Print "Subは"
  Call GetProcAndFuncName("Sub") 'Subを書き出し
  Debug.Print "Functionは"
  Call GetProcAndFuncName("Function") 'Functionを書き出し
End Sub

'-----------------------------------------------------------
Sub GetProcAndFuncName(ByVal strSubFunc As String)
  Dim objComp As Object, strBuf As String, pn, Ret
  Dim intIdx As Long, lngSt As Long, lngEd As Long, intLenStr As Long

  intLenStr = Len(strSubFunc) + 1

  For Each objComp In Application.ActiveWorkbook.VBProject.VBComponents
    strBuf = objComp.CodeModule.Lines(1, objComp.CodeModule.CountOfLines)
    intIdx = InStr(strBuf, strSubFunc)
    If intIdx <> 0 Then
      Do Until intIdx = 0
        If Mid(strBuf, intIdx + intLenStr, 1) <> vbLf Then
          lngSt = intIdx + intLenStr
          lngEd = InStr(intIdx + intLenStr, strBuf, "(")
          If lngSt = 0 Or lngEd = 0 Then Exit Do
          pn = Mid(strBuf, lngSt, lngEd - lngSt)
          On Error Resume Next
          Ret = IsNumeric(objComp.CodeModule.ProcStartLine(pn, vbext_pk_Proc))
          If Ret Then Debug.Print Mid(strBuf, lngSt, lngEd - lngSt)
          Ret = False
        End If
        intIdx = InStr(intIdx + 1, strBuf, strSubFunc, 1)
      Loop
    End If
  Next
End Sub
 ───────────────────────────────────────  ■題名 : Re:ちなみにマクロ名の列挙は  ■名前 : 大那  ■日付 : 02/9/6(金) 11:04  -------------------------------------------------------------------------
   コロスケ さん
こんにちは。(_ _)
おー。こんなことまでできちゃうのですね。
すごいです。

これで、モジュール&マクロ一覧が作成できますー。

ありがとうございましたー(^^
 ───────────────────────────────────────  ■題名 : Re:ちなみにマクロ名の列挙は  ■名前 : りん <rin_doggie@hotmail.com>  ■日付 : 02/9/8(日) 0:56  -------------------------------------------------------------------------
   大那 さん、こんばんは。

>ちなみに、指定したmoduleの中にあるマクロの名前の一覧などは
>作成することができるのでしょうか?

haruさんへの回答をちょっと修正して。

Sub Main()
  With Application
   .ScreenUpdating = False
   .EnableEvents = False
  End With
  '実行用
  Dim wb1 As Workbook, wb2 As Workbook
  '一覧作成
  '指定するファイル
  Ifile$ = Application.GetOpenFilename
  If Ifile$ = "FALSE" Then
   MsgBox "ファイルを指定", vbExclamation, "中断"
  Else
   Set wb1 = Workbooks.Add
   With wb1.Worksheets(1)
     .Cells(1, 1).Value = "ブック"
     .Cells(1, 2).Value = "モジュール"
     .Cells(1, 3).Value = "マクロ"
     .Cells.ColumnWidth = 30
   End With
   '
   Set wb2 = Workbooks.Open(FileName:=Ifile$)
   '実働部分呼び出し
   CountSubs wb2, wb1.Worksheets(1)
   '解放
   With wb2
     .Saved = True
     .Close
   End With
   Set wb2 = Nothing
  End If
  '
  wb1.Saved = True
  Set wb1 = Nothing
  With Application
   .ScreenUpdating = True
   .EnableEvents = True
  End With
End Sub
'
Private Sub CountSubs(wb As Workbook, ws As Worksheet)
  '削除したSubの数を返す関数
  Dim vbcs As Object, vbc As Object
  Dim LL&, L1&, L2&, Lflg As Boolean, RR&, NN$
  Set vbcs = wb.VBProject.VBComponents
  '
  RR& = 1
  For Each vbc In vbcs
   With vbc.CodeModule
     If .CountOfLines > 0 Then
      L1& = 1
      Do
        NN$ = ""
        On Error Resume Next
        NN$ = .ProcOfLine(L1&, 0)
        On Error GoTo 0
        If NN$ = "" Then
         L1& = L1& + 1
        Else
         RR& = RR& + 1
         With ws
           .Cells(RR&, 1).Value = wb.Name
           .Cells(RR&, 2).Value = vbc.Name
           .Cells(RR&, 3).Value = NN$
         End With
         L2& = .ProcCountLines(NN$, 0)
         L1& = L1& + L2&
        End If
      Loop While L1& <= .CountOfLines
     End If
   End With
  Next
  Set vbcs = Nothing: Set vbc = Nothing
End Sub

解決ずみのようですが、こんな方法もあります。

#コロスケさん、ありがとうございました。
 ───────────────────────────────────────  ■題名 : Re:ちなみにマクロ名の列挙は  ■名前 : 大那  ■日付 : 02/9/9(月) 10:27  -------------------------------------------------------------------------
   りん さん、こんにちは。

さらなる、ご回答ありがとうございます(^^

私もコロスケさんのロジックを参考に
いろいろと改造したりして勉強しているところです。

りんさんのロジックもとても参考になります(^^

どの質問に対しても、答えは一つじゃないと思いますし、
一つの答えが知れればそれでいい。というのではなく、
みなさんのご好意による回答をそれぞれ拝見し、
それらを応用し、自分なりに活用できるよう心がけていきます。
まだ、自分の使ったことの無い関数なども知ることができ、
使い方も知ることができるので、とても勉強になります。

りんさん、コロスケさんありがとうございます!
 ───────────────────────────────────────  ■題名 : Re:ちなみにマクロ名の列挙は  ■名前 : haru  ■日付 : 02/9/9(月) 15:40  -------------------------------------------------------------------------
   ▼りん さん、コロスケさん、大那 さん、こんにちは。
 ありがとうございます。

>>ちなみに、指定したmoduleの中にあるマクロの名前の一覧などは
>>作成することができるのでしょうか?
 逆に一覧を見ながら、作成された一覧のカーソルのあるセルのマ
クロ、モジュールを削除とか、選択部分の複数のマクロ等を削除と
いうことができれば、更に素晴らしいのですが、可能でしょうか?
 よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:ちなみにマクロ名の列挙は  ■名前 : コロスケ <corosuke@chan.co.jp>  ■日付 : 02/9/9(月) 15:48  -------------------------------------------------------------------------
   ▼haru さん:
こんにちは。できますよ。
削除方法はりんさんが書いていらっしゃるので、一覧を最初に作って
それから、プロジェクトを見に行けば可能だと思います。

でも、XPでは設定によりProjectへのアクセス自体制限されることもあるので
VBEで操作したほうが確実なような気がします...。
 ───────────────────────────────────────  ■題名 : Re:ちなみにマクロ名の列挙は  ■名前 : コロスケ <corosuke@chan.co.jp>  ■日付 : 02/9/9(月) 16:38  -------------------------------------------------------------------------
   ▼haru さん:

▼haru さん:
一覧表作成までを書いてみました。
Microsoft Visual Basic for Applications Extensibility 5.3 に参照設定をしてください。
削除は、時間切れなので、りんさんのカキコを参考にしてお考え下さいませ。
ではー♪


Dim x As Long
Dim aList()

Sub GetVbProj()
  Dim oVBC As VBIDE.VBComponent
  Dim Wb As Workbook
  x = 2
  For Each Wb In Workbooks
    For Each oVBC In Workbooks(Wb.Name).VBProject.VBComponents
      If Workbooks(Wb.Name).VBProject.Protection = vbext_pp_none Then
        Call GetCodeRoutines(Wb.Name, oVBC.Name)
      End If
    Next
  Next
  With Sheets.Add
    .[A1].Resize(, 3).Value = Array("ブック名", "モジュール名", "プロシージャ名")
    .[A2].Resize(UBound(aList, 2), UBound(aList, 1)).Value = _
    Application.Transpose(aList)
    .Columns("A:C").Columns.AutoFit
  End With
End Sub

Private Sub GetCodeRoutines(wbk As String, VBComp As String)
  Dim VBCodeMod As CodeModule
  Dim StartLine As Long

  On Error Resume Next
  Set VBCodeMod = Workbooks(wbk).VBProject.VBComponents(VBComp).CodeModule
  With VBCodeMod
    StartLine = .CountOfDeclarationLines + 1
    Do Until StartLine >= .CountOfLines
      ReDim Preserve aList(1 To 3, 1 To x - 1)
      aList(1, x - 1) = wbk
      aList(2, x - 1) = VBComp
      aList(3, x - 1) = .ProcOfLine(StartLine, vbext_pk_Proc)
      x = x + 1
      StartLine = StartLine + .ProcCountLines(.ProcOfLine(StartLine, _
                          vbext_pk_Proc), vbext_pk_Proc)
      If Err Then Exit Sub
    Loop
  End With
  Set VBCodeMod = Nothing
End Sub
 ───────────────────────────────────────  ■題名 : Re:ちなみにマクロ名の列挙は  ■名前 : haru  ■日付 : 02/9/10(火) 9:21  -------------------------------------------------------------------------
   ▼コロスケ さん:
 こんにちは。ありがとうございます。

>削除は、時間切れなので、りんさんのカキコを参考にしてお考え下さいませ。
 わかりました。自分でやってみます。
 その中で、不明な所があれば、また質問いたします。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 54