关于sheet.range['a1','b2'].select(100分)

  • 主题发起人 主题发起人 Wizard00
  • 开始时间 开始时间
W

Wizard00

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做sheet.range['a1','b2'].select的时候,如果用for循环就说是select方法无效,如果只是一个sheet的时候就可以,代码如下

for pos:=1 to 3 do
begin
sheet:=ExcelWorkSheet.sheets[pos];
sheet.range['a1','b2'].select;
end;
很奇怪呀。请高手们指点迷津,谢了!送上100分吧。
 
试一下吧,要看具体情况,我也不太清楚。呵呵
for pos:=1 to 3 do
begin
sheet:=null;
sheet:=ExcelWorkSheet.sheets[pos];
sheet.range['a1','b2'].select;
end;
 
类RANGE的select方法无效
 
你试试:
sheet:=ExcelWorkSheet.sheets[1];
sheet.range['a1','b2'].select;
sheet:=ExcelWorkSheet.sheets[2];
sheet.range['a1','b2'].select;
sheet:=ExcelWorkSheet.sheets[3];
sheet.range['a1','b2'].select;
如果没有问题,就是循环的问题,否则不是;
还有,循环是否应该从0开始?
 
如果原来没有报错,可以,报错以后就不行了,奇怪的很。
循环没有问题,是从1开始的,郁闷!!
更奇怪的是,如果我重新写一个过程就可以单个的写,
但是报错后就不行了,不稳定。
 
什么报错啊?说明白嘛~
 
类range的select方法无效,
刚才只是执行一个可以了,不过我用
for i:=2 to 2 都不可以,靠!
 
晕,报错和无效有关系嘛?
 
??不知道区别,但如果正常的话,如果我用
sheet:=ExcelWorkSheet.sheets[2];
可以,用
for i:=2 to 2 do
sheet:=ExcelWorkSheet.sheets;
然后 select 就应该可以呀。
 
先试试JamesBond_L的方法吧!可能是程序反应不过来
 
老大,我都用过了,在他的基础上
for i:= 2 to 2 都搞不定呀,郁闷!
有没有遇到这个情况的人呀,我觉的可能是哪个地方需要设一下。
全部的代码是这样,大家试试看。

var
ExcelApp,ExcelWorkSheet:Variant;
sheet:oleVariant;

ExcelApp:=CreateOleObject('Excel.Application');
Excelapp.visible:=true;
ExcelWorkSheet:=ExcelApp.workbooks.open('d:/test.xls');
for pos:=2 to 2 do
begin
sheet:=null;
sheet:=ExcelWorkSheet.sheets[pos];
Sheet.Range['c2','z20'].select;
end;
 
你是调用vba,我也是,只不过我是制autocad,这是我写的一段
tempfile := getdwgfilename; //取得当前临时文件名
xzzxxgt.SaveToFile(GetCurrentDir + '/' + tempfile); //将数据库中的图片保存为临时文件
sleep(400);
caddoc.Application.Documents.Open(GetCurrentDir + '/' + tempfile, True); //autocad打开临时文件
sleep(400);
selectdoc := caddoc.SelectionSets.Add('NewSelSet');
sleep(400);
j := 0;
for i := 0 to caddoc.ModelSpace.count - 1 do
begin
if caddoc.ModelSpace.Item(i).ObjectName = 'AcDbMText' then
begin
dlp_cfbz.AddEx(TdxInspectorTextRow); //动态生成一个标注文本框
dlp_cfbz.Rows[j].Caption := caddoc.ModelSpace.Item(i).TextString; //给标注赋予文本框标题
inc(j); //标注加1
setlength(xgtbz, j); //设置动态数组的长度
xgtbz[j - 1].bzitemindex := i; //记录标的序号
xgtbz[j - 1].bzitemname := caddoc.ModelSpace.Item(i).TextString; //记录标注的名称
xgtbz[j - 1].bzitemwidth := caddoc.ModelSpace.Item(i).Width; //记录标注文本的宽度
end;
end;

上面的sleep(400);就是为了延迟,要不然报错之后就会在同一个地方一报错,不知道你的情况和我的是不是一样的,不过又好象不一样,我的是报“呼叫方拒绝被呼叫!!”好象还有其它的原因。
 
好像不一样吧,~_~,试试看,同样的错误。。。。。。。。。。。。。。。。。。。。。。。。。。。。
 
能否调试看看循环中,POS是多少吗?
 
试试这个:
sheet:=ExcelWorkSheet.Worksheets[pos];
 
与循环无关
var
ExcelApp,ExcelWorkSheet:Variant;
sheet:oleVariant;

ExcelApp:=CreateOleObject('Excel.Application');
Excelapp.visible:=true;
ExcelWorkSheet:=ExcelApp.workbooks.open('d:/test.xls');
for pos:=2 to 2 do
begin
sheet:=null;
sheet:=ExcelWorkSheet.sheets[pos];
Sheet.Range['c2','z20'].select; //这一句不对
end;

 
这样就行了
var
ExcelApp,ExcelWorkSheet:Variant;
sheet:oleVariant;
pos:integer;
begin
ExcelApp:=CreateOleObject('Excel.Application');
Excelapp.visible:=true;
ExcelWorkSheet:=ExcelApp.workbooks.open('e:/1.xls');
for pos:=2 to 2 do
begin
sheet:=null;
sheet:=ExcelWorkSheet.sheets[pos];
sheet.activate;
Sheet.Range['c2','z20'].select;
end;
end;
 
wfzha说得有一定的道理,那一页没激活, 又怎么能选择它的区域呢?
另外你说那个总报同样的错误,最简单的办法就是程序退出时, Excel也同时关闭。
 
搞定,多谢!
 
后退
顶部