• 締切済み

VB6からExcelにマクロが使われているかを知るには

VB6でExcelファイルを読み込み、各シートにマクロが使われているかを 知る方法を探しております。(ブック単位でもよいです) Worksheetsオブジェクトのプロパティにはなさそうですし、 何か情報をお持ちの方、ご教授いただければと思います。

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

シートモジュールに限定して「マクロの有無」を判断するなら、#1 ご回答 のとおりです。 #2 は「マクロを含むブックか?」について書いたものです。このロジック で判定できるかどうかテストコードを書いてみました。時間が無くて数件 しか検証してませんが、それなりに判定できそうです。プロジェクトが 保護されていても問題なさそうにみえます。なお、VBA です。 Sub SampleProc()   Dim FileName As String   FileName = Application.GetOpenFilename("Excel形式ファイル (*.xls), *.xls")   If HasMacro(FileName) Then     MsgBox "マクロあり"   Else     MsgBox "マクロ無し"   End If End Sub ' // ブックにマクロが含まれるか判定する Public Function HasMacro( _     ByVal XlsFileName As String _ ) As Boolean   Const XLS_FILE_HEADER = "D0 CF 11 E0 A1 B1 1A E1"   Const SEARCH_KEY = "56 42 5F 4E 61 6D"   Dim Buffer()   As Byte   Dim Keys()    As Byte   Dim v      As Variant   Dim n      As Integer   Dim i      As Long      ' // データ読み込み   n = FreeFile()   ReDim Buffer(FileLen(XlsFileName))   Open XlsFileName For Binary As #n     Get #n, , Buffer   Close #n   ' // 一応ファイルヘッダをチェック   i = 0   For Each v In Split(XLS_FILE_HEADER, " ")     If Buffer(i) <> CByte("&H" & v) Then       Err.Raise 1000, , XlsFileName & "は XLS ではない"     End If     i = i + 1   Next   ' // 検索キー生成   i = 0   For Each v In Split(SEARCH_KEY, " ")     ReDim Preserve Keys(i)     Keys(i) = CByte("&H" & v)     i = i + 1   Next   ' // Return   HasMacro = CBool(InStrB(Buffer, Keys) > 0) Bye_:   Erase Buffer   Erase Keys   Exit Function Err_:   MsgBox Err.Description, vbCritical   Resume Bye_ End Function

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

*.xls ファイルをバイナリモードで開き、VBA が含まれる場合にのみ 存在しそうなデータがないか調べてみたら? マクロ有りの場合は次のキーワードが含まれているのかもしれません。   16進データ: 56 42 5F 4E 61 6D ---- 文字列で VB_Nam 精査してませんので、これで判定できるのかわかりませんけど^^; Excelのバージョンによっても異なるかもしれません。 しかし、これで判定可能なら、VBA プロジェクトにアクセスしないで 済みます。つまり、  ・Excel でブックを開く必要がない  ・VBA プロジェクトへアクセスできない(ユーザー毎にマクロの   セキュリティー設定を変更してもらう必要がない) などのメリットが想像できます。 アイディアの提供のみですが、どんなもんでしょうか?

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

チェック方法が無いので、VBAプロジェクトを全て読み出すしか無いでしょう。 通常はVBAプロジェクトへのアクセス制限が掛かっているので、ブックの設定で解除して置く必要があります。 http://office.microsoft.com/ja-jp/word/HP030894781041.aspx Sub sample() Dim Pj As Object For Each Pj In ActiveWorkbook.VBProject.VBComponents With Pj.CodeModule Debug.Print .Name & "/ " & .CountOfLines Debug.Print .Lines(1, .CountOfLines) End With Next End Sub 単純なチェックなら、プロシージャの開始文字 "Sub" や "End Sub" 等を検索すると良いかも知れませんね。 「モジュールの中身を検索して、特定の文字列の有無を知るには?」  http://park11.wakwak.com/~miko/Excel_Note/14-02_macro.htm#14-02-37

ramusan731
質問者

お礼

hana-hana3さんご回答ありがとうございます。 返事が遅くなり申し訳ありません。 こんな方法があるのですね。 大変勉強になりました。 有難う御座いました。

関連するQ&A

  • VB6 OLE内のEXCELマクロを実行するには

    お願いします。VB6です。 (1)フォーム上に、OLEオブジェクトを配置してEXCELシートを埋め込みました。 OLE1.CreateEmbed vbNullString, "Excel.Sheet" (2)そのEXCELの標準モジュールに Sub TestMacro() Cells(1, 1) = "ABC" End Sub というマクロを記述しています (3)下記の様にそのマクロを実行させようとすると ★「実行時エラー'1004' cellsメソッドは失敗しました。'_Global'オブジェクト」 というエラーが出てしまいます。★ Private Sub Command1_Click() Dim wb As Workbook Set wb = OLE1.object wb.Application.Run "TestMacro" End Sub ★このエラーの回避方法をご教授ください なお ・エクセルのマクロを変える事はできません ・OLE右クリックでExcelを開いた状態なら正常実行されるので VBでOLEのExcelを開く方法がわかればそれでもOKです。

  • エクセル マクロについて

    エクセルのマクロについて教えてください。 下記のようなマクロを実行した場合 どのような条件でフォルダ内のファイルを オープンしていくのでしょうか。 ファイルの名前や更新時間などでしょうか? また、名前や更新時間順でファイルを開いていくように するにはどうしたらよろしいでしょうか。 ご回答よろしくお願い致します。 以下マクロ 'オブジェクトを設定する Set ファイルシステム = CreateObject("Scripting.FileSystemObject") '読み込むファイルを1個指定する あるブック = Application.GetOpenFilename("Excelファイル(*.xls),*.xls") '親フォルダーを取得する Set 親フォルダー = ファイルシステム.GetFile(あるブック).ParentFolder '親フォルダー内の全ファイルに以下の操作をする For Each ファイル In 親フォルダー.Files 'ファイルを開く Workbooks.Open ファイル.Path 'ブック名を記憶する ブック名 = ActiveWorkbook.Name '開いたファイルの伝票(NO)のシートを「全データ」シートの後ろにコピーする ActiveWorkbook.Worksheets("伝票(NO)").Copy After:=ThisWorkbook.Worksheets("全データ") '開いたファイルを閉じる Workbooks(ブック名).Close Next                                                 以上

  • VBから、エクセルでファイルを開くには・・・

    またまた、お世話になりますm(__)m 環境はVB.net2003、エクセルは2002でプログラミングの勉強、データ処理をしているのですが、VBでエクセルを開き、そのエクセル上でファイル(csvやテキストなど)を開きたいのですが、VB上でどのように書けばよいのでしょうか? VBでエクセルをたちあげたり、bookやsheetを開くことはできました。 どなたかご教授お願いしますm(__)m

  • ファイル内のエクセルにマクロを使いたい

    パソコン初心者です。 エクセルのツールのVBでマクロを組みました。 それをファイル内のエクセルに使いたいです。 今は一つ一つエクセルを開いて、シートも一枚ずつ開いてマクロを使っています。 ファイル内の全エクセルにまとめてマクロを使える方法はありませんか?

  • エクセルのマクロ

    こんにちは。 今悩んでいます。 VB6.0で、電圧計、電流計を制御して、VBからエクセルを起動、その値をVBでエクセルにデータを送り、グラフを作るのですが。 グラフを作る作業が、同じ作業なので、エクセルのマクロを使い、グラフを作成しようとしていたのですが・・・。 どのエクセルのファイルからでもできるように、個人用のマクロブックで、グラフを作成したのですが、VBからエクセルを起動し、データの転送して、グラフをマクロで作成しようと思ったら、マクロがないんです。 しかし、デスクトップにあるエクセルのショートカットから起動してみると、マクロがあるのです。 VBから起動したエクセルでは、マクロは使えないんでしょうか? 詳しい方よろしくお願いします。

  • エクセル2007マクロについて。お願いいたします。

    excelファイルの容量が10MBにもなってしまい大変困っています。すべてのシートを新しいブックにコピーしたのですがサイズは変わりませんでした・・・方法が間違っているのでしょうか??? 関数やマクロを組み込んだsheetが14枚くらいです。軽量化するにはどうしたら良いでしょう??また、肥大化しないためのマクロ等ありましたら教えていただけますでしょうか、よろしくお願いいたします。

  • VB6.0でVB上にExcel

    VB上にExcelオブジェクトを貼り付け、特定の条件に当てはまったとき既存のExcelファイルのSheet1を乗せたいという場合は、どうすればいいのでしょうか?

  • エクセルのマクロの詳しい方お願いします。

    いつもお世話になってます。マクロ初心者なのでよろしくお願いします。 ひょんなことからマクロをすることになり、いろいろ探してやっているのですが、どうしてもうまくいかないので、ご教授願います。  内容は for next の使い方なのですが、  やりたいことは、D列にあるデータとE列にあるデータを足して、D列に表示させるのですが、  行数が300行となるので、for nextを使おうと考えました。 Dim i As Long For i = 1 To 300 Worksheets("sheet1").cell(5 + i, 4) = Worksheets("sheet1").cell(5 + i, 4).Value +    Worksheets("sheet1").cell(5 + i, 5).Value Next i と、マクロを入れたら、実行時エラー’438’ オブジェクトは、このプロパティまたはメッソドをサポートしていません。  と、表示されます。 どのように書き込んだらよろしいでしょうか。よろしくお願いします。 また、もっと簡単な書き方があればお願いします。

  • VBからExcelへの指示の出し方

    どのように書けばいいかわかりません。 よろしくお願いします。 VB5,Excel97で開発しています。 VB側で、複数シート選択して、選択したシートすべてを範囲として置換を行いたいのです。 1シートに対してはできたのですが、通常のExcelのように選択したシートすべてに対して一括して置換を行うには、VBからの命令をどのように記述すればいいのでしょうか。 以下のようにしています。 グローバル変数は、以下で設定 'Excel起動 Set g_xlsApp = CreateObject("Excel.Application") 'Excelワークブックを作成 Set g_xlsBook = g_xlsApp.Workbooks.Add(エクセルBOOK名) Private Sub cmdExec_Click() 'マクロ実行 Call g_xlsApp.Run(マクロ名, 引数1, 引数2) 'シート選択 wCnt = g_xlsApp.Worksheets.Count For i = 3 To wCnt g_xlsBook.Worksheets(i).Select False Next '置換 ???????????? End Sub

  • EXCEL2000のVB6.0のマクロで困ってます。

    エクセル2000についている?ビィジュアルベーシック6.0でマクロを作成しています。 以前のVBAのマクロの解説書を見ながら考えているのですが、下のような感じのマクロを作りたいんです。 1、エクセルのシートにあるボタンを押すとマクロスタート 2、アクティブシートにダイアログボックスを表示し、欲しい情報を集める。(リストボックスを使いたい。) 3、2の結果で作表(作成済みのテンプレートに情報を配置) 4、マクロ終了。 1と3、4はなんとか理解できているのですが、2のところを「他の人がダイアログボックスを変えないように、出来ればマクロの中で何とかする。」っていう条件で出来ないか、教えてください。 以前のバージョンでは、ダイアログシートの挿入があったので、そのシートに保護をかけちゃえば問題ないと思うんですが。 難しければ、オブジェクトを置いたシートなどに保護をかける方法でもよいです。 よろしくおねがいします。

専門家に質問してみよう