
A 回答 (3件)
- 最新から表示
- 回答順に表示
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
No.2
- 回答日時:
*.xls ファイルをバイナリモードで開き、VBA が含まれる場合にのみ
存在しそうなデータがないか調べてみたら?
マクロ有りの場合は次のキーワードが含まれているのかもしれません。
16進データ: 56 42 5F 4E 61 6D ---- 文字列で VB_Nam
精査してませんので、これで判定できるのかわかりませんけど^^;
Excelのバージョンによっても異なるかもしれません。
しかし、これで判定可能なら、VBA プロジェクトにアクセスしないで
済みます。つまり、
・Excel でブックを開く必要がない
・VBA プロジェクトへアクセスできない(ユーザー毎にマクロの
セキュリティー設定を変更してもらう必要がない)
などのメリットが想像できます。
アイディアの提供のみですが、どんなもんでしょうか?
No.1
- 回答日時:
チェック方法が無いので、VBAプロジェクトを全て読み出すしか無いでしょう。
通常はVBAプロジェクトへのアクセス制限が掛かっているので、ブックの設定で解除して置く必要があります。
http://office.microsoft.com/ja-jp/word/HP0308947 …
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_ …
hana-hana3さんご回答ありがとうございます。
返事が遅くなり申し訳ありません。
こんな方法があるのですね。
大変勉強になりました。
有難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) excelのマクロ実行でブロックされます。 2 2022/06/08 09:14
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2022/08/04 13:56
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2022/10/11 12:55
- Excel(エクセル) Excelのマクロについて 1 2023/04/17 17:22
- Visual Basic(VBA) VBA アドインについて お詳しい方 ご教授をお願いします。 相談事項 現在以下の対応を実施した所、 1 2022/11/02 16:53
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/04 17:58
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/02/07 09:58
- PowerPoint(パワーポイント) エクセルのマクロについて教えてください。 1 2022/03/25 17:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで特定の列が0表示の場...
-
Excelのセル値に基づいて図形の...
-
ワードのマクロについて教えて...
-
エクセルでのオブジェクト選択...
-
マクロの連続印刷が突然不可能...
-
メッセージボックスのOKボタ...
-
Gmail、Outlookで送信相手の表...
-
ExcelのVBA。public変数の値が...
-
wordを起動した際に特定のペー...
-
エクセルのマクロ(range)につ...
-
エクセルVBA イベントプロシー...
-
特定のPCだけ動作しないVBAマク...
-
C#言語でACCESSのソースを取得...
-
Excel_マクロ_現在開いているシ...
-
VBAでカタカナ→ローマ字の変換...
-
UWLSの記録でマクロを作成し使...
-
EXCELのマクロの重複起動...
-
エクセルマクロでグラフのタイ...
-
Excel マクロ VBA プロシー...
-
#define __T(x) L ## x について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
特定のPCだけ動作しないVBAマク...
-
Excel・Word リサーチ機能を無...
-
エクセルで特定の列が0表示の場...
-
Excel_マクロ_現在開いているシ...
-
一つのTeratermのマクロで複数...
-
メッセージボックスのOKボタ...
-
Excel マクロ VBA プロシー...
-
ExcelのVBA。public変数の値が...
-
エクセルで別のセルにあるふり...
-
エクセルに張り付けた写真のフ...
-
Excel マクロでShearePoint先の...
-
TERA TERMを隠す方法
-
Excelのセル値に基づいて図形の...
-
Excel VBAからAccessマクロを実...
-
ExcelVBAでPDFを閉じるソース
-
マクロ実行時、ユーザーフォー...
-
オートフィルターとExcelマクロ...
-
wordを起動した際に特定のペー...
-
特定文字のある行の前に空白行...
-
エクセルで縦に並んだデータを...
おすすめ情報