在利用下面的方法打开Excel后,怎样在工作薄中加入宏或者过程。然后再执行,最后关闭。我想问如何执行和加入过程或宏?试过可以就给分
opendialog1.Execute;
  Try
    ExcelApplication1.Connect;//EXCEL应用程序
  Except
    MessageDlg('Excel may not be installed',mtError, [mbOk], 0);
    Abort;
  End;
  ExcelApplication1.Visible[0]:=True;
  ExcelApplication1.Caption:='Excel Application';
  try
    excelapplication1.Workbooks.Open(opendialog1.FileName,
            null,null,null,null,null,null,null,null,null,null,null,null,0);//打开指定的EXCEL 文件
  except
    begin
      ExcelApplication1.Disconnect;//出现异常情况时关闭
      ExcelApplication1.Quit;
      showmessage('请选择EXCEL电子表格!');
      exit;
    end;
  end;

解决方案 »

  1.   

    用Delphi程序控制Excel的操作     使用VBA可以随心所欲地操作Excel。同样,使用Delphi也能完全控制Excel的所有功能。下面,我们以一个例子来入手吧。    在窗口Form1上面加入组件5个Button和1个CheckBox组件,在Users中加入ComObj单元,在Private加入下面的私有变量:    Private        {Private declarations}        v :Variant;        Sheet:Variant;    在单击事件中加入如下代码:procedure TForm1.Button1Click(Sender:TObject);begin//打开Excel新建文件  try     v := CreateOleObject('Excel.Application');    v.Visible:=CheckBox1.Checked;//是否显示Excel    v.WorkBooks.Add;//新建Excel文件    v.WorkBooks[1].WorkSheets[1].Name:='操作Excel';//第一页标题    v.WorkBooks[1].WorkSheets[2].Name:='编程乐园';    v.WorkBooks[1].WorkSheets[3].Name:='都来看呀';//    v.WorkBooks[1].WorkSheets['Delphi演示'];'等效下面的语句    Sheet:=v.WorkBooks[1].WorkBooks[1];    Sheet.Cells[1,1]:='好看';//单元格内容    Sheet.Cells[1,2]:='确实';    Sheet.Cells[1,2]:='我喜欢';  except//错误处理    ShowMessage('初始化Excel失败,可能没有装Excel或者其他错误,请重起再试');    v.DisplayAlerts:=false;//是否提示存盘    v.Quit;//退出Excel    exit;  end;  Application.Restore;  Application.BringToFront;end;        其中,ComObj中包含了用来检索OLE的对象和向它传发命令的例程,第一行代码启动Excel,但这时是不可见的,只有在后台运行,所以第二行代码根据CheckBox1.Checked来确定是否显示Excel运行界面。如果需要打开本身存在的Excel文件,则用v.WorkBooks.Open(OpenDialog1.FileName);代替v.WorkBooks.Add;就可以了。    Sheet对象是很多页面的集合,其他的WorkBooks是工作簿的集合,WorkBooks对象是工作表的集合,Charts对象是图表的集合。    //Excel文档格式设置procedrue TForm1.Button5Click(Sender:TObject);var  Range:Variant;begin  if OpenDialog1.Execute then  begin    try      v:=CreateOleObject('Excel.Application');      v.Visible:=CheckBox1.Checked;      v.WorkBooks.OpenDialog1.FileName);      Range :=v.WorkBooks[1].WorkBooks[1].Range['A2:G2'];//单元格从A2到G2      Range.Merge;//合并单元格      Range.Rows.RowHeight :=50;//设置行高;      Range.Borders.LineStyle:=1;//加边框      Range.Columns[2].ColumnWidth:=12;//设置列宽      Range.FormulaR1C1:='合并区';      Range.HorizontalAlignment:=3;//xlCenter(水平对齐方式)      Range.VerticalAlignment:=2;//xlCenter(垂直对齐方式)      Range.Characters.Font.Name:='宋体';//字体      Range.Characters.Font.Size:=15;      Range.Characters.Font.OutlineFont:=False;//是否有下划线      Range.Characters.Font.ColorIndex:=0;//xlAutomatic;颜色    except//错误处理    ShowMessage('初始化Excel失败,可能没有装Excel或者其他错误,请重起再试');    v.DisplayAlerts:=false;//是否提示存盘    v.Quit;//退出Excel  end;end;      //EXCEL打印页面设置及打印预览procedure TForm1.Button4Click(Sender:TObject);begin  if OpenDialog1.Execute then  begin    try      v:=CreateOleObject('Excel.Application');      v.Visible:=CheckBox1.Checked;      v.WorkBooks.OpenDialog1.FileName);      Sheet:=v.WorkBooks[1].WorkBooks[1];      Sheet.PageSetup.PrintTitleRows:='$1:$3';//页眉      Sheet.PageSetup.PrintTitleColumns:='';      Sheet.PageSetup.LeftFooter:='注:页脚'+'总共&N页'+'——第&P页';//页脚      Sheet.PageSetup.LeftMargin:=30;//设置边距      Sheet.PageSetup.RightMargin:=30;      Sheet.PageSetup.TopMargin:=30;      Sheet.PageSetup.BottomMargin:=50;//      Sheet.PageSetup.PrintQuality:= 400;//分辨率(根据打印机确定)         Sheet.PageSetup.CenterHorizontally:=true;//是否水平居中      Sheet.PageSetup.CenterVertical:=true;//是否垂直居中      Sheet.PageSetup.Orientation:=2;//横向打印      Sheet.PageSetup.Draft:=false;//非草稿模式//      Sheet.PageSetup.FirstPageNumber:=xlAutomatic;      Sheet.PageSetup.BlackAndWhite:=true;//黑白稿      Sheet.PageSetup..Zoom:=100;//缩放      Sheet.PrintPreView;//打印预览    except//错误处理      ShowMessage('初始化Excel失败,可能没有装Excel或者其他错误,请重起再试');      v.DisplayAlerts:=false;//是否提示存盘      v.Quit;//退出Excel    end;  end;end;    最后就是要关闭Excel了。在创建了Excel Application对象后,调用它的Quit方法完成关闭事件。//关闭EXCEL并退出procedure TForm1.Button3Click(Sender:TObject);begin  try    if not varIsEmpty(v) then    begin//如果需要在关闭前确定是否存盘,加入://      v.DiaplayAlert:=true;//确定存盘//      v.DialayAlert:=False;//不存盘,直接退出      v.WorkBooks[1].Close(True,'C:\untitled.xls');// 取文件名退出      v.Quit;    end;  finally    Close;  endend;
      

  2.   

    这些是VBA的内容我也知道,但我要调用的是宏呀 或者现有的过程呀
    要把它加入到现有的Excel文件,不是新建的Excel
      

  3.   

    我的意思是如何Delphi中在Excel文件中加入一些VBA的程序,并执行它。
      

  4.   

    使用CreateOleObject方式调用Word相比Service控件的最大缺点就是不支持代码的自动生成,
    但是我们充分的利用VBA代码就可以弥补这个功能。
    Word作为一个功能强大的Com,可以很容易被编程工具调用,成为办公自动化系统中处理文档
    的强有力的嵌套工具,尤其是充分Word本身的录制宏的功能,更进一步减轻了编程的负担。
    下面就如何在Delphi里面利用Word的VBA代码进行一些总结。
    1、 生成VBA代码。Word本身具有很强的可扩展性,尤其是支持用户自定义功能,其实现
    的主要方式就是通过VBA代码来实现的。在“工具->宏->Visual Basic编辑器”里面就可以看
    到具体的宏代码,可以直接进行编辑。而且还可以使用录制宏的功能自动生成宏代码。方法是
    选择“工具->宏->录制新宏”,然后执行自己想通过程序实现的功能,如存盘、打印等功能,
    此时Word一边执行你要实现功能,一边将你的操作生成了一个宏,在实现功能后,可以选择
    “工具->宏->VisualBasic编辑器”,查看生成的宏代码。例如:我们要将文档中的“讨论”全部替换成“研讨”。
    a. 点击“工具->宏->录制新宏”,直接点击确定,默认的宏保存到了Normal.dot系统公
    用模板里面。
    b. 点击“编辑->查找”,出现弹出对话框,输入查找和替换的字,点确定。进行替换。
    c. 结束宏的录制,点击结束按钮。
    d. 按F11或者“工具->宏->Visual Basic 编辑器”,查看宏代码。缺省查看Normal里面
    的模块里面的NewMacros模块。
    以下是生成的宏代码:
    Sub Macro1()
    '
    ' Macro1 Macro
    ' 宏在 2002-2-1 由 yzhshi 录制
    '
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = "讨论"
            .Replacement.Text = "研讨"
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchByte = True
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    End Sub
    2、 精简宏代码。通常,生成的宏代码有很多语句对你要实现的功能来说都是多余的。我们要
    做的就是如何找到我们需要的代码。此时我们查看具体的代码,剔除明显没有用途的代码,然后光
    标停留在宏上面,按F5执行,看是否实现功能,逐步精简,得到最小代码。此步骤可参考Word的
    VBA帮助来判断代码是否有用。如上例,精简下来,剩下以下代码。
    Sub Macro1()
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        With Selection.Find
            .Text = "讨论"
            .Replacement.Text = "研讨"
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    End Sub3、 转换成Delphi代码。这一步其实很简单,对于VBA代码,只需要在前面添加Word的句柄或者
    文档的句柄或者文档的句柄.Application就可以直接操作了。
    例:逐句翻译:(Word_Handle是Word的句柄)
    (VB)     Selection.Find.ClearFormatting
    (Delphi)  Word_Handle.Selection.Find.ClearFormatting;(VB)     Selection.Find.Replacement.ClearFormatting
    (Delphi)  Word_Handle.Selection.Find.Replacement.ClearFormatting;
    以上两句简单添加上Word的句柄就可以了。(VB)     With Selection.Find
                  Text = "讨论"
                  Replacement.Text = "研讨"
    End With
    (Delphi)  Word_Handle.Selection.Find.Text := '讨论';
      Word_Handle.Selection.Find.Replacement.Text := '研讨';
    以上几句因为Delphi不支持Variant的With结构,所以分开写。同时转换成Delphi语法。(VB)    Selection.Find.Execute Replace:=wdReplaceAll
    (Delphi) Word_Handle.Selection.Find.Execute(Replace:=2);
    上面一句存在一个小技巧,如何找到常量wdReplaceAll的数值为2?
    这里有几个办法,
    一:直接use Word2000或者word97单元,那么直接使用常量wdReplaceAll就可以了;
    二:到Word2000.pas或者Word97.pas里面查找wdReplaceAll的数值;
    三:直接使用VBA代码见wdReplaceAll的数值显示出来。办法是写一个小过程,然后执行,如下:
    Sub ShowValue()
      MsgBox wdReplaceAll
    End Sub最后补充一下,很多关于Word的东西可以从Word的VBA帮助里面获得。具体文件在
    ?:\Program files\Microsoft Office\Office10\2052(XP)下,VBAWD10.CHM,其他版本路径基本类似。
      

  5.   

    看来是因为我说得不够清楚了。我现在想实现在delphi中把VBA插入到Excel文件中,保存了Excel文件中,然后在Excel中执行它而不是在Delphi中执行它。做完全过程后,我们重新打开Excel文件时,在它的工具->宏->Visual Basic 编辑器里面就可以看到刚才我们通过delphi向里面写入的过程。
      

  6.   

    ExcelApplication1.DisplayAlerts[0]:=false;
    这句中的[0] 0 是lcid这个到底是什么意思,我试过了,用0不行的,那要用什么呢?
      

  7.   

    我自己解决了,谢谢大家!
    我把程序放在下面 供大家参考 Try
          ExcelApplication1.Connect;//EXCEL应用程序
        Except
          MessageDlg('本机可能没有正确安装Excel,请检查!',mtError, [mbOk], 0);
          Abort;
        End;
        try
          ExcelApplication1.Visible[0]:= cbView.Checked ;
          ExcelApplication1.Caption:='Excel Application';
          excelapplication1.Workbooks.Open(edtSourceFile.text,null,null,null,null,null,null,null,null,null,null,null,null,0);//打开指定的EXCEL 文件
        except
          begin
            ExcelApplication1.Disconnect;//出现异常情况时关闭
            ExcelApplication1.Quit;
            showmessage('请选择EXCEL电子表格!');
            exit;
          end;
        end;
        try
          sCurPath := ExtractFilePath(Application.ExeName);     //GetCurrentDir;
          if sCurPath[length(sCurPath)]='\' then delete(sCurPath, length(sCurPath), 1);
          //获得文件名
          sFileBas := sCurPath+'\jsyd.bas'    // 文件jsyd.bas为VBA脚本程序
          
       intCount := excelapplication1.VBE.VBProjects.Count;      excelapplication1.VBE.VBProjects.Item(intCount).VBComponents.Import(sFileBas);
          excelapplication1.Run('CovertFile',intB,intRow,intBh+1,edtCovertPath.text)    // CovertFile是过程名,后面是这个过程的参数
                ExcelApplication1.Disconnect;//出现异常情况时关闭
          ExcelApplication1.Quit;
          showmessage('操作完成!');
          chdir(ExtractFilePath(Application.ExeName));
        except
          on e:exception do
           begin
            ExcelApplication1.Disconnect;//出现异常情况时关闭
            ExcelApplication1.Quit;
            showmessage('请把EXCEL中的工具菜单->宏->安全性中可靠来源页的信任对于"Visual Basic 项目"的访问(V)'+e.Message);
            chdir(ExtractFilePath(Application.ExeName));
            exit;
          end;    end;
      end
      else begin
        showmessage('请选择文件路径和输出路径!');
        chdir(ExtractFilePath(Application.ExeName));
        exit;
      end;