请问,我在c#中如何调用excel中的宏,我写了一些代码,不但不起作用,还把我模板中的宏给清空了,真气人,请高手帮忙

解决方案 »

  1.   

    C#去调用EXCEL中的宏?
    楼主做什么呢?
      

  2.   

    Dim Excel As Microsoft.Office.Interop.Excel.Application 
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
            Excel = New Microsoft.Office.Interop.Excel.Application 
            Excel.Workbooks.Add() 
            Excel.Visible = True 
        End Sub     Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing 
            If Excel IsNot Nothing Then Excel.Quit() 
        End Sub     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click         '开启VBA访问,并将VBA宏安全设置为高. 
            Dim Reg As Microsoft.Win32.RegistryKey = My.Computer.Registry.CurrentUser 
            'EXCEL 2003安全设置 
            Dim EReg As Microsoft.Win32.RegistryKey = Reg.CreateSubKey("Software\Microsoft\Office\11.0\Excel\Security") 
            EReg.SetValue("Level", "3", Microsoft.Win32.RegistryValueKind.DWord) 
            EReg.SetValue("DontTrustInstalledFiles", "0", Microsoft.Win32.RegistryValueKind.DWord) 
            EReg.SetValue("AccessVBOM", "1", Microsoft.Win32.RegistryValueKind.DWord) 
            EReg.Close() 
            'EXCEL 2007安全设置 
            EReg = Reg.CreateSubKey("Software\Microsoft\Office\12.0\Excel\Security") 
            EReg.SetValue("Level", "3", Microsoft.Win32.RegistryValueKind.DWord) 
            EReg.SetValue("DontTrustInstalledFiles", "0", Microsoft.Win32.RegistryValueKind.DWord) 
            EReg.SetValue("AccessVBOM", "1", Microsoft.Win32.RegistryValueKind.DWord) 
            EReg.Close() 
            Reg.Close() '关闭注册表         '在.NET开发环境中对系统的操作非常简单: 
            ' 比如获得显示尺寸: 
            ' My.Computer.Screen.Bounds 
            '播放声音文件: 
            ' My.Computer.Audio.Play("c:\miues.wav", AudioPlayMode.Background)         '获得系统特殊文件夹:我的文档 
            '  System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 
            Dim Vba As Microsoft.Vbe.Interop.VBComponent = Nothing 
            For xh As Int32 = 1 To Excel.VBE.ActiveVBProject.VBComponents.Count 
                If Excel.VBE.ActiveVBProject.VBComponents.Item(xh).Name = "NET" Then 
                    Excel.VBE.ActiveVBProject.VBComponents.Remove(Excel.VBE.ActiveVBProject.VBComponents.Item(xh)) '删除该模块 
                    Exit For 
                End If 
            Next 
            '添加 NET 模块。 
            Excel.VBE.ActiveVBProject.VBComponents.Add(Microsoft.Vbe.Interop.vbext_ComponentType.vbext_ct_StdModule).Name = "NET" 
            For xh As Int16 = 1 To Excel.VBE.ActiveVBProject.VBComponents.Count 
                If Excel.VBE.ActiveVBProject.VBComponents.Item(xh).Name = "NET" Then 
                    Vba = Excel.VBE.ActiveVBProject.VBComponents.Item(xh) 
                End If 
            Next 
            Vba.CodeModule.AddFromString(My.Settings.VBA) '添加VBA代码,可以是多个过程或函数。 
            Vba.Activate() 
            Excel.Run("NET_VBA", 10, 10)'传递参数到该过程,最多30个,数组在VBA需声明为Variant类型。 
            '删除指定的过程。 
            If Vba.CodeModule.Find("NET_VBA", 0, 0, Vba.CodeModule.CountOfLines, 0, False, False, False) = True Then 
                Dim StarLins, EndLins As Int16 
                StarLins = Vba.CodeModule.ProcStartLine("NET_VBA", Microsoft.Vbe.Interop.vbext_ProcKind.vbext_pk_Proc) 
                EndLins = Vba.CodeModule.ProcCountLines("NET_VBA", Microsoft.Vbe.Interop.vbext_ProcKind.vbext_pk_Proc) 
                Vba.CodeModule.DeleteLines(StarLins, EndLins) 
            End If 
        End Sub End Class 'VBA 的过程. 
    Public Sub NET_VBA(ByVal X As Integer, ByVal Y As Integer) 
      For xh = 1 To X 
          For xy = 1 To Y 
               Cells(xh, xy) = xh & "---" & xy 
            Next 
        Next 
    End Sub 
      

  3.   

     excel.Run(vbaFunction, missing, missing, missing, missing, missing, missing, missing, missing, missing
                            , missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing
                            , missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);用这个方法就可以直接调用EXCEL的宏
      

  4.   

    他的问题应该是在C#使用 在EXCEL中已经存在的宏
      

  5.   

    在VBA中将宏录制并调试好,完了之后用C#中的Excel相关对象调用已定义好的宏。调试还是放在BVA中吧。
      

  6.   

    我是用楼上面面得方法试过调用excel中的宏,但是这个excel.Run 把我的宏给清空了,没有了,也没执行,请问这是怎么回事