excel的vba问题,如何转化为delphi语言!(200分)

  • 主题发起人 主题发起人 lmemail
  • 开始时间 开始时间
L

lmemail

Unregistered / Unconfirmed
GUEST, unregistred user!
一个很简单的操作,我要在excel中选中一行,再点击鼠标右键,选择插入结果就是在当前行的前一行插入一行格式和当前行一样的的行。主要用来显示报表的detail的内容。(因为其他的表头的表尾都填写好了,动态根据数据加入detail行数目)
我用宏录制了一下,结果如下
----------------------
Rows("9:9").Select
Selection.Insert Shift:=xlDown
----------------------
但是怎么也转化不到pascal语言,那个rows下就怎么写都不对,选不了整行!
插入就更加不行了!
delphi请高手出招,给转化一下!
急急急急急!!!!!!!!!!!!
 
[blue]to 楼主:
在delphi中,不使用Rows,而是使用Range:
在Delphi中创建电子表格 Sheet 后,要初始化属性Range和Columns.
var sheets,aheet,range:variant;
ea:TExcelApplication;//最好自己加入这个控件
begin
ea.workbooks.add(emptyParam,0);
sheet:=ea.workBook[1].workSheet[1];
sheet.name:='Delphi Data';
sheet.cells[1,1]:=1;//第一个单元格
range:=sheet.range['c1:f5'];
range.columns.interior.colorIndex:=8;//青色

sheets:=ea.sheets;
with sheets.Item['Delphi Data'] do
Activate;
Range['A1:A10'].select;
UsedRange.Copy;//拷到剪贴板
end;
end;
你分析一下。[/blue]
 
ExcelApplication1.ActiveSheet.Rows[2].Insert;//在第2行插入!
听说用这个可以,但是我怎么也不行阿,救命阿
错误提示:
class does not have default property!!!
 
俺不习惯使用Servers控件,下面代码使用CreateOleObject方式调试通过,就是满足你的需求的。转换到Servers就可以了。

uses
Comobj;

procedure TForm1.Button1Click(Sender: TObject);
var
Excel_Handle, WorkSheet_Handle: OleVariant;

const
xlDown = $FFFFEFE7;
begin
try
Excel_Handle := GetActiveOleObject('Excel.Application');
except
try
Excel_Handle := CreateOleObject('Excel.Application');
except
Exit;
end;
end;

Excel_Handle.Visible := True;

WorkSheet_Handle := Excel_Handle.Workbooks.Add;
WorkSheet_Handle.WorkSheets[1].cells[7, 1] := 'asdf';
WorkSheet_Handle.WorkSheets[1].cells[8, 1] := 'asdf';
WorkSheet_Handle.WorkSheets[1].Rows[8].Select;
WorkSheet_Handle.Application.Selection.Insert(Shift := xlDown);
end;
 
with Field do
begin
if not (State in dsWriteModes) then DatabaseError(SNotEditing, Self);
GetActiveRecBuf(RecBuf);
if FieldNo > 0 then
begin
if ReadOnly and not (State in [dsSetKey, dsFilter]) then
DatabaseErrorFmt(SFieldReadOnly, [DisplayName]);
Validate(Buffer);
if FModifiedFields.IndexOf(Field) = -1 then
FModifiedFields.Add(Field);
end;
if Buffer = nil then
Data := Null else
BufferToVar(Data);
PVariantList(RecBuf+SizeOf(TRecInfo))[Field.Index] := Data;
if not (State in [dsCalcFields, dsInternalCalc, dsFilter, dsNewValue]) then
DataEvent(deFieldChange, Longint(Field));
end;
end;
 
to yzhshi 高人:
用你的方法可以添加行了,不过你这个是新建一个excle,我是在一个模板文件上添加行我想问题应该不大了,谢谢,分数是你的了!

如果你能够提供帮助我怎么打开模板文件后后,修改后存盘成自己定义的文件名就更好了,如果要分可以加,
主要我用惯了server的,向你这么写,我就不会了!
你的Excel_Handle是不是相当于那个app
好像又是那个Workbooks,我看的不是很明白,主要用惯了弱智了那个server的控件,高级的用法就不会了!
 
>>如果你能够提供帮助我怎么打开模板文件后后,修改后存盘成自己定义的文件名就更好了
其实我只是一个例子呀。改成打开excel模板,然后保存很容易的。
 
以下为代码,不过单纯为了这个从Servres改成这种方式不好,其实你对号入座就可以了。
Excel_Handle对应ExcelApplication, WorkSheet_Handle对应ExcelWorkbook。

uses
Comobj;

procedure TForm1.Button1Click(Sender: TObject);
var
Excel_Handle, WorkSheet_Handle: OleVariant;
const
xlDown = $FFFFEFE7;
begin
try
Excel_Handle := GetActiveOleObject('Excel.Application');
except
try
Excel_Handle := CreateOleObject('Excel.Application');
except
Exit;
end;
end;

Excel_Handle.Visible := True;

// WorkSheet_Handle := Excel_Handle.Workbooks.Add;
WorkSheet_Handle := Excel_Handle.Workbooks.Open('C:/1.xls');
WorkSheet_Handle.WorkSheets[1].cells[7, 1] := 'asdf';
WorkSheet_Handle.WorkSheets[1].cells[8, 1] := 'asdf';
WorkSheet_Handle.WorkSheets[1].Rows[8].Select;
WorkSheet_Handle.Application.Selection.Insert(Shift := xlDown);
WorkSheet_Handle.SaveAs('C:/2.xls');
Excel_Handle.Quit;
end;
 
别人写的一篇文章,对你有帮助的。
利用Delphi 5中调用Excel 97

--------------------------------------------------------------------------------

广东北电
董柏林


---- 在Delphi 5中简单地封装了一组Microsoft Office自动化对象(Automation servers)。它使得我们很容易地把Office中的应用程序(Word, Excel, PowerPoint, Outlook and Access等)当作一个com应用服务器进行控制。在Delphi 5中已经带了Word与PowerPoint的例子,因为Excel的调用与这两个应用服务器的调用略有不同,所以本人根据这两个例子写了个Excel 97的简单例子以供参考。

---- 步聚


创建一个普通Application。

在Form中分别放入ExcelApplication, ExcelWorkbook和ExcelWorksheet。

连接Excel 97,具体方法如下:



打开Excel97。
Try
ExcelApplication1.Connect;
Except
End;
ExcelApplication1.Visible[0]:=True;
增加一个Workbook。
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,0));


添加一个Worksheet。
var
Temp_Worksheet: _WorkSheet;
begin
Try
Temp_Worksheet:=ExcelWorkbook1.WorkSheets.Add(EmptyParam,EmptyParam,
EmptyParam,EmptyParam,0) as _WorkSheet;//(注意)
ExcelWorkSheet1.ConnectTo(Temp_WorkSheet);
Except
ShowMessage('Failure');
End;
end;
关闭Excel.
Try
ExcelApplication1.Quit;
ExcelWorksheet1.Disconnect;
ExcelWorkbook1.Disconnect;
ExcelApplication1.Disconnect;
Except
End;



---- 4. 对Excel的一些操作:




选择当前Workbook的某一Worksheet.
procedure TForm1.ComboBox1DropDown
(Sender: TObject);
var
i: Integer;
begin
ComboBox1.Clear;
For i:=1 to ExcelWorkbook1.Worksheets.Count do
ComboBox1.Items.Add((ExcelWorkbook1.Worksheets.Item as _WorkSheet).Name);
end;


procedure TForm1.ComboBox1Change
(Sender: TObject);
begin
ExcelWorkSheet1.ConnectTo(ExcelWorkbook1.Worksheets.Item [ComboBox1.ItemIndex+1]
as _WorkSheet);
ExcelWorkSheet1.Activate;
end;


选择某一Workbook:
procedure TForm1.ComboBox2DropDown
(Sender: TObject);
var
i: Integer;
begin
ComboBox2.Clear;
if ExcelApplication1.Workbooks.Count >0 then
For i:=1 to ExcelApplication1.Workbooks.Count do
Combobox2.Items.Add(ExcelApplication1.Workbooks.Item.Name);
end;


procedure TForm1.ComboBox2Change(Sender: TObject);
begin
ExcelWorkSheet1.Disconnect;
ExcelWorkBook1.ConnectTo(ExcelApplication1.Workbooks.Item[Combobox2.ItemIndex+1]);
ExcelWorkBook1.Activate;
ExcelWorksheet1.ConnectTo(ExcelWorkBook1.ActiveSheet as _WorkSheet);
ExcelWorkSheet1.Activate;
end;


对某一单元格进行赋值及取值。
procedure TForm1.Button5Click(Sender: TObject);
begin
ExcelWorksheet1.Cells.Item[SpinEdit2.Value,SpinEdit1.Value]:=Edit1.Text;
end;


procedure TForm1.Button6Click(Sender: TObject);
begin
Edit1.Text:=ExcelWorksheet1.Cells.Item[SpinEdit2.Value,SpinEdit1.Value];
end;


选择某一区域
ExcelWorkSheet1.Range['A1','C1'].Select;


打开一个Excel文件。
if OpenDialog1.Execute then
Begin
Try
ExcelWorkBook1.ConnectTo(ExcelApplication1.Workbooks.Open(OpenDialog1.FileName,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0));
ExcelWorkSheet1.ConnectTo(ExcelWorkBook1.Activesheet as _Worksheet);
Except;
End;
End;
 
我在我的form上放置了Eapp,Ebook,Esheet
可以打开一个xlt,也可以用
Esheet.Cells.Item[8,1]:=edit1.text;
进行付值,但是由于我用delphi7+officeXP的所以有很多的变化,你的
Excel_Handle对应Eapp, WorkSheet_Handle对应Ebook改了根本不能用阿,我不知道毛病在哪里了,至少你看上面的付值就知道了
不是用Esheet.Cells[8,1]:=edit1.text;,而是要加上一个item的东西才可以付值
但是我用你的那个编译可以通过,而对应的方法都不存在阿。
同时我也注意到了用server肯定可以做,只是我不知道怎么用而已
Esheet.Rows.insert(shift:OleVariant;CopyOriginiOleVariant):OleVariant;
我用insert后就是不知道后面的参数怎么才是对的
同时选中一行也是就是选不到那行,可以选折区域,
Esheet.rows.Select(OleVariant);
这些对应的参数都不知道该怎么写好了!


 
yzhshi
你能不能帮我用server试试!!!
 
ExcelWorkSheet1.Range['a1','A3'].Select ;
ExcelWorkSheet1.Range['B3','N3'].Insert(xlDown,0);
 
小刚:谢谢用你的方法基本解决了!原来会的人真很简单阿,有介绍server的书吗!这个跟vba还是有点差距,主要不知道的死活解决不了阿!

但是还有毛病,就是我的格式不一样高,而且结果向下添加后,高度变成下面格子的高度了,不象在excel中操作‘插入’,会把高度和的格式也带入!
ExcelWorkSheet1.Range['B3','N3'].Insert(xlDown,1);参数1试试,结果颜色能够带入,而格式的高度还是不能带入阿!
 
学习ing[:D][:D]
 
CopyOrigin=0->与上面的格式相同
CopyOrigin=1->与下面的格式相同
我也注意到怎么设置都不能将高度带进来。可以插入整行就可以带进来,但是怎么插入整行呢???
 
这么说来
ExcelWorkSheet1.Range['a1','A3'].Select ;
跟vba的 Rows("9:9").Select
还是不一样阿,怎么选中整行,有人知道吗????
Esheet.rows后面怎么写选中整行阿,有人知道吗??
 
昨天看了一下,还真的有点难度:-)
不过应该可以的,否则整行删除等都没法实现了。。。
 
终于试验成功了!!
//选择第10行
ExcelWorkSheet1.Range['10:10','10:10'].Select;

//在第10行插入一新行,复制上一行的格式
ExcelWorkSheet1.Range['10:10','10:10'].Insert(Xldown,xlFormatFromLeftOrAbove);

//在第10行插入一新行,复制下一行的格式
ExcelWorkSheet1.Range['10:10','10:10'].Insert(Xldown,xlFormatFromRightOrBelow);

 
小刚厉害彻底解决了server控件的办法;
yzhshi也厉害,用com解决了,结果相当简单!

btw:我想问一下小刚,你怎么解决这样的问题,有什么书,或者是电子文档没有。推荐一下,这个server连帮助文档都没有阿,我只有一个个属性看,结果死在rows上边了,以为选中行肯定是用rows,试了所有的参数都不能通过!其实这样瞎试是最弱智的办法,希望你能够给我提供好的解决门路!
 
多人接受答案了。
 
后退
顶部