- 締切済み
VB6からExcelにマクロが使われているかを知るには
VB6でExcelファイルを読み込み、各シートにマクロが使われているかを 知る方法を探しております。(ブック単位でもよいです) Worksheetsオブジェクトのプロパティにはなさそうですし、 何か情報をお持ちの方、ご教授いただければと思います。
- ramusan731
- お礼率33% (1/3)
- Visual Basic
- 回答数3
- ありがとう数4
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- KenKen_SP
- ベストアンサー率62% (785/1258)
シートモジュールに限定して「マクロの有無」を判断するなら、#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)
*.xls ファイルをバイナリモードで開き、VBA が含まれる場合にのみ 存在しそうなデータがないか調べてみたら? マクロ有りの場合は次のキーワードが含まれているのかもしれません。 16進データ: 56 42 5F 4E 61 6D ---- 文字列で VB_Nam 精査してませんので、これで判定できるのかわかりませんけど^^; Excelのバージョンによっても異なるかもしれません。 しかし、これで判定可能なら、VBA プロジェクトにアクセスしないで 済みます。つまり、 ・Excel でブックを開く必要がない ・VBA プロジェクトへアクセスできない(ユーザー毎にマクロの セキュリティー設定を変更してもらう必要がない) などのメリットが想像できます。 アイディアの提供のみですが、どんなもんでしょうか?
- hana-hana3
- ベストアンサー率31% (4940/15541)
チェック方法が無いので、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
関連する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です。
- 締切済み
- Visual Basic
- エクセル マクロについて
エクセルのマクロについて教えてください。 下記のようなマクロを実行した場合 どのような条件でフォルダ内のファイルを オープンしていくのでしょうか。 ファイルの名前や更新時間などでしょうか? また、名前や更新時間順でファイルを開いていくように するにはどうしたらよろしいでしょうか。 ご回答よろしくお願い致します。 以下マクロ 'オブジェクトを設定する 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 以上
- ベストアンサー
- その他MS Office製品
- VBから、エクセルでファイルを開くには・・・
またまた、お世話になりますm(__)m 環境はVB.net2003、エクセルは2002でプログラミングの勉強、データ処理をしているのですが、VBでエクセルを開き、そのエクセル上でファイル(csvやテキストなど)を開きたいのですが、VB上でどのように書けばよいのでしょうか? VBでエクセルをたちあげたり、bookやsheetを開くことはできました。 どなたかご教授お願いしますm(__)m
- ベストアンサー
- Visual Basic
- ファイル内のエクセルにマクロを使いたい
パソコン初心者です。 エクセルのツールのVBでマクロを組みました。 それをファイル内のエクセルに使いたいです。 今は一つ一つエクセルを開いて、シートも一枚ずつ開いてマクロを使っています。 ファイル内の全エクセルにまとめてマクロを使える方法はありませんか?
- ベストアンサー
- オフィス系ソフト
- エクセルのマクロ
こんにちは。 今悩んでいます。 VB6.0で、電圧計、電流計を制御して、VBからエクセルを起動、その値をVBでエクセルにデータを送り、グラフを作るのですが。 グラフを作る作業が、同じ作業なので、エクセルのマクロを使い、グラフを作成しようとしていたのですが・・・。 どのエクセルのファイルからでもできるように、個人用のマクロブックで、グラフを作成したのですが、VBからエクセルを起動し、データの転送して、グラフをマクロで作成しようと思ったら、マクロがないんです。 しかし、デスクトップにあるエクセルのショートカットから起動してみると、マクロがあるのです。 VBから起動したエクセルでは、マクロは使えないんでしょうか? 詳しい方よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセル2007マクロについて。お願いいたします。
excelファイルの容量が10MBにもなってしまい大変困っています。すべてのシートを新しいブックにコピーしたのですがサイズは変わりませんでした・・・方法が間違っているのでしょうか??? 関数やマクロを組み込んだsheetが14枚くらいです。軽量化するにはどうしたら良いでしょう??また、肥大化しないためのマクロ等ありましたら教えていただけますでしょうか、よろしくお願いいたします。
- 締切済み
- オフィス系ソフト
- VB6.0でVB上にExcel
VB上にExcelオブジェクトを貼り付け、特定の条件に当てはまったとき既存のExcelファイルのSheet1を乗せたいという場合は、どうすればいいのでしょうか?
- ベストアンサー
- Visual Basic
- エクセルのマクロの詳しい方お願いします。
いつもお世話になってます。マクロ初心者なのでよろしくお願いします。 ひょんなことからマクロをすることになり、いろいろ探してやっているのですが、どうしてもうまくいかないので、ご教授願います。 内容は 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’ オブジェクトは、このプロパティまたはメッソドをサポートしていません。 と、表示されます。 どのように書き込んだらよろしいでしょうか。よろしくお願いします。 また、もっと簡単な書き方があればお願いします。
- ベストアンサー
- Excel(エクセル)
- 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のところを「他の人がダイアログボックスを変えないように、出来ればマクロの中で何とかする。」っていう条件で出来ないか、教えてください。 以前のバージョンでは、ダイアログシートの挿入があったので、そのシートに保護をかけちゃえば問題ないと思うんですが。 難しければ、オブジェクトを置いたシートなどに保護をかける方法でもよいです。 よろしくおねがいします。
- 締切済み
- オフィス系ソフト
お礼
hana-hana3さんご回答ありがとうございます。 返事が遅くなり申し訳ありません。 こんな方法があるのですね。 大変勉強になりました。 有難う御座いました。