1

テスト マクロを現在の Excel ワークブックにインポートしようとしています。そして、マクロを実行します。Excel 2007 を使用しています。次のエラーが表示されます。

実行時エラー '1004':

マクロ 'DoKbTest' を実行できません。このブックでマクロを使用できないか、すべてのマクロが無効になっている可能性があります。

コードの 1 行を次のように変更すると、正常にSet oBook = oExcel.Workbooks.Add動作します。ThisWorkbook を参照すると失敗するのはなぜですか?


コードは次のとおりです。

  Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

      Dim oXL As Excel.Application
      Dim oBook As Excel.Workbook
      Dim oSheet As Excel.Worksheet
      Dim i As Integer, j As Integer
      Dim sMsg As String

    ' Create a new instance of Excel and make it visible.
      Set oXL = GetObject(, "Excel.Application")
      oXL.Visible = True

    ' Add a new workbook and set a reference to Sheet1.
      Set oBook = ThisWorkbook
      oBook.Activate

      Set oSheet = Sheets("Overview")
      oSheet.Activate

      sMsg = "Fill the sheet from in-process"
      MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground

    ' The Import method lets you add modules to VBA at
    ' run time. Change the file path to match the location
    ' of the text file you created in step 3.
      oXL.VBE.ActiveVBProject.VBComponents.Import "C:\Users\jstockdale\Desktop\KbTest.bas"

    ' Now run the macro, passing oSheet as the first parameter
      oXL.Run "DoKbTest", oSheet

    ' You're done with the second test
      MsgBox "Done.", vbMsgBoxSetForeground

    ' Turn instance of Excel over to end user and release
    ' any outstanding object references.
      oXL.UserControl = True
      Set oSheet = Nothing
      Set oBook = Nothing
      Set oXL = Nothing

End Sub

そして.basファイル

Attribute VB_Name = "KbTest"

   ' Your Microsoft Visual Basic for Applications macro function takes 1 
   ' parameter, the sheet object that you are going to fill.

   Public Sub DoKbTest(oSheetToFill As Object)
      Dim i As Integer, j As Integer
      Dim sMsg As String
      For i = 1 To 100
         For j = 1 To 10

            sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"
            oSheetToFill.Cells(i, j).Value = sMsg
         Next j
      Next i
   End Sub
4

3 に答える 3

0

BeforeSave イベントが呼び出されると、VBA は環境に関するすべてのデータを収集して、そのサブを実行します。イベント内にコードを追加して環境を変更すると、VBA は戻って環境をポーリングして変更内容を確認するのではなく、既に認識されているものを使用します。

別のワークブックに配置すると、別のワークブックのコードがワークブックのコードに影響を与えないため、機能します (おそらく参照されていない限り)。

OnTime を使用して、VBA をリセットすることができます。コードを標準モジュールに入れて使用する

oXL.OnTime Now, "DoKbTest"

これにより、そのマクロができるだけ早く実行されるようにキューに入れられます。BeforeSave が終了すると、DoKbTest が実行されますが、分離されるため、VBA がすべてを再初期化します。

于 2013-07-12T22:07:23.990 に答える
-1

私はExcel 2013を使用していますが、あなたのコードでは実際に別のエラーが発生し、Set oBook = oExcel.Workbooks.Add行を追加するかどうかに関係なくエラーは一貫しています:

実行時エラー '1004': Visual Basic プロジェクトへのプログラムによるアクセスは信頼されていません

これは、[VBA プロジェクト オブジェクト モデルへのアクセスを信頼する] 設定を有効にすることで修正されます。これは(2013年に)下にあります:

File 
 - Options 
  -  Trust Center 
   -   Trust Center Settings
    -    Macro Settings.

ドキュメントから:

このセキュリティ オプションにより、承認されていないプログラムが、エンド ユーザー システムに損害を与える可能性のある「自己複製」コードを作成することがより困難になります。

つまり、この設定は、ワームがユーザーの知らないうちにワークブックにコードを追加するのを防ぐように設計されています。

また、ドキュメントが信頼できる場所にあることも確認してください。詳細はこちらをご覧ください。

于 2013-07-12T14:25:23.487 に答える