搜索
aardio官方社区 门户 查看主题

EXCEL自动化操作 教程、示例代码收集贴

发布者: quickerfans | 发布时间: 2011-8-6 01:43| 查看数: 28778| 评论数: 36|帖子模式

本贴主要为 EXCEL自动化操作 新手 搜索示例代码 用。
相当于用aardio写VBA中的操作。楼下,持续补充,欢迎大家也贴同话题类似教程。示例码,谢谢

宏--录制
宏--编辑--把VBA复制出来以备参考用aardio的语法写出来。

找出VBA中的对像,属性,方法,在以下网址中搜索了解其性质
http://www.icodeguru.com/windows/Microsoft-Excel-Object/overview.htm
比如一个Range("A1"),判断是一个对象?或是一个对象的属性?或是一个对象的方法(无外乎这三种)从字面上看应该是一种事

物(对象)
找到其父子关系。我们现有的对象是excel
根据http://www.icodeguru.com/windows/Microsoft-Excel-Object/html/xlobjRange.htm
中的这句Worksheets("Sheet1").Range("A5").Value = _
    Worksheets("Sheet1").Range("A1").Value

了解到Range属于sheet的子对象具有value这个属性,在aardio中写到:
import com;
excel = com.CreateObject("Excel.Application");
var book  = excel.Workbooks.Add();
var sheet = book.Worksheets(1);
sheet.Range("a1").value2="这是你想要的。"

excel录制宏.JPG

Microsoft Excel Visual Basic 参考  这个CHM文件用起来很方便。
限于过大,我没有上传,哪儿能得到它。你懂的。
————————————————————————————————
import com;
import com.excel
excel = com.CreateObject(
"Excel.Application");
var book  = excel.Workbooks.Add();
var sheet = book.Worksheets(1);
excel.alerts =
false
excel.Visible =
true;
excel.Range(
"A1").value2="EXCEL子对象RANGE的属性值"
excel.Range(
"A3:c3").value2="EXCEL子对象RANGE的属性值"
excel.Range(
"a5").FormulaR1C1 = "VBA中value为什么在aardio中是value2,而value2与formulaR1C1又有什么不同?值与公式不同?"
//不知道为什么是value2而不是value请高手解惑,谢谢


Value2 属性
请参阅 应用于 示例 特性
返回或设置单元格值。Variant 类型,可读写。

说明
该属性和 Value 属性的唯一区别在于 Value2 属性不使用 CurrencyDate 数据类型。通过使用 Double 数据类型,可将用这些数据类型设置格式的数据按浮点数字返回。

示例
本示例使用 Value2 属性对两个单元格的值进行相加。
Range("a1").Value2 = Range("b1").Value2 + Range("c1").Value2
http://www.icodeguru.com/windows/Microsoft-Excel-Object/


/*
VBA中写到Worksheets("Sheet1").Range("A1:G1"). _
Borders(xlEdgeBottom).Color = RGB(255, 0, 0)
由此可知Borders是Range的子成员,xlEdgeBottom为Borders的索引 color为borders的属性之一
*/


//io.open()
//com.DumpTypeInfo(excel)
import gdi
//实用哪个库中的对像就要先导入哪个库  
excel.Range("a1").Borders.color= gdi.RGB(255,0,0)
excel.Range(
"a3").Borders.color= gdi.RGB(0,0,0)
excel.Range(
"a5").Borders.color=0xFF0000
excel.Range(
"a7").Borders.LineStyle =-4119
excel.Range(
"a9").Borders(7).LineStyle =-4119
excel.Range(
"a11").Borders(10).LineStyle =-4119

/*
在VBA中边框可以指定其中一个(索引)来设置颜色。aardio中我没能实现。不解
Worksheets("Sheet1").Range("A1:G1"). _
Borders(xlEdgeBottom).Color = RGB(255, 0, 0)  
*/


//创建了excel模型为什么还要导入 excel库?

/*为什么在aardio中一句excel = com.CreateObject("Excel.Application");
aardio就可以拥有EXCEL的资源,使用excel模型,如果XP系统中没有装EXCEL也可以创造它出来并吗?
老大在excel库中写的常数为什么写?有什么用?*/



/*
不懂这是什么表示法,不断的重复失败中偶然搜索到

白色:FFFFFF
红色:FF0000
绿色:00FF00
蓝色:0000FF
洋红:FF00FF
墨绿:00FFFF
黄色:FFFF00
黑色:000000
爱丽丝兰:F0F8FF
碧绿:70DB93
巧克力色:5C3317
*/


最新评论

o00viw 发表于 2011-8-6 04:24:38

没安装Excel或用某些绿色版,创建Excel时会失败的。

没安装Excel或用某些绿色版,创建Excel时会失败的。
quickerfans 发表于 2011-8-6 10:10:11

[align=left][font=新宋体][color=#008000]//如果有时间我会加上注释 [/color][color=#000000] [/c

//如果有时间我会加上注释

import com;
import com.excel
excel = com.CreateObject(
"Excel.Application");
var book  = excel.Workbooks.Add();
var sheet = book.Worksheets(1);
excel.alerts =
false
excel.Visible =
true;

//使用哪个库中的对像、常量就要先导入哪个库,我要用到GDI库中的颜色常量
import gdi
excel.cells(1,5).value2=
"颜色值"
excel.cells(1,5).Font.Color = gdi.RGB(128, 0, 0)
excel.cells(5,1).Interior.Color = gdi.RGB(153, 204, 255)
excel.Range(
"A1").value2="1"
excel.Range(
"A2").value2="2"

//写入公式
excel.Range("A3").value2 = "=Sum(a"++1++",a"++2++")"
excel.Range(
"B3:C4").value2="都写这个值"
excel.Range(
"d11").value2 ="区域装饰"
excel.Range(
"d11").Borders(9).LineStyle =4
excel.Range(
"d11").Borders(10).LineStyle =-4119

//xlEdgeLeft 7 区域左边的边框。
excel.Range("d11").Borders(7).LineStyle =-4142
excel.Range(
"d11").Borders(8).LineStyle =5
excel.Range(
"d11").Borders(8).color = gdi.RGB(0,0,255)
excel.Range(
"d11").Borders(9).color = gdi.RGB(0,255,0)
excel.Range(
"d11").Borders(10).color = gdi.RGB(255,0,0)
excel.Range(
"d11").Borders(7).color = gdi.RGB(1,22,255)
excel.Range(
"A3").LineStyle = xlContinuous
excel.Range(
"A3").Weight = xlThin
excel.Range(
"A3").ColorIndex = xlAutomatic
excel.Range(
"A3").Font.Name = "宋体"
excel.Range(
"A3").Font.Size = 20
excel.Range(
"A3").Font.color = 7
excel.Range(
"A3").Font.Strikethrough = False
excel.Range(
"A3").Font.Superscript = False
excel.Range(
"A3").Font.Subscript = False
excel.Range(
"A3").Font.OutlineFont = False
excel.Range(
"A3").Font.Shadow = False
excel.Range(
"A3").Font.Underline =-4119 /*xlUnderlineStyleNone*/
excel.Range(
"A3").Font.ColorIndex = xlAutomatic
excel.Range(
"A3").Font.Color = gdi.RGB(128, 0, 0)

//______________________________________________________
//带注释的VBA例子也有助于理解
//http://blog.sina.com.cn/s/blog_685ff0dc0100rmx7.html
/*
http://apps.hi.baidu.com/share/detail/6506886

常量値excel库中也有
常量 值
xlUndercolorDouble -4119
xlUndercolorDoubleAccounting 5
xlUndercolorNone -4142
xlUndercolorSingle 2
xlUndercolorSingleAccounting 4
XlBordersIndex 枚举
指定要检索的边框。
名称 值 描述
xlDiagonalDown 5 从区域中每个单元格的左上角至右下角的边框。
xlDiagonalUp 6 从区域中每个单元格的左下角至右上角的边框。
xlEdgeBottom 9 区域底部的边框。
xlEdgeLeft 7 区域左边的边框。
xlEdgeRight 10 区域右边的边框。
xlEdgeTop 8 区域顶部的边框。
xlInsideHorizontal 12 区域中所有单元格的水平边框(区域以外的边框除外)。
xlInsideVertical 11 区域中所有单元格的垂直边框(区域以外的边框除外)。

xlDiagonalDown  斜下
xlDiagonalUp 斜上
xlEdgeBottom 底边框
xlEdgeLeft 左边框
xlEdgeRight  右边框
xlEdgeTop 上边框
xlInsideHorizontal 内部水平边框线
xlInsideVertical 内部垂直边框线
单元格区域加边框只要一句:
Range("a1:f100").Borders.color=1
取消单元格区域的边框也只要一句:
Range("a1:f100").Borders.Linestyle=0
___________________________________________________
*/


//调整字体和列适应,行适应,边框 宏 录制的部分VBA ,大家可以自己录制观察
/*
Sub Macro1()
'
' Macro1 Macro
' 宏由 微软用户 录制,时间: 2011-8-6
'
'
Range("A1").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
*/
quickerfans 发表于 2011-8-6 11:52:18

[quote][size=2][color=#999999]o00viw 发表于 2011-8-6 04:24[/color] [url=forum.php?m

o00viw 发表于 2011-8-6 04:24
没安装Excel或用某些绿色版,创建Excel时会失败的。

创建excel对象或者用第三方dll会不会有许可验证机制在里面?只要是符合com规范的都可以这样一句话创建实例吗?那老大在excel库里面  声明些常量 为什么呢。?excel里面的代码不像是简单的封装啊。
gangz 发表于 2011-8-6 15:07:08

能不能直接用CSV格式的?

能不能直接用CSV格式的?
sj798 发表于 2011-8-6 16:38:36

先留一个脚印,以后慢慢看

先留一个脚印,以后慢慢看
quickerfans 发表于 2011-8-7 14:01:03

[align=left][color=#0000ff][font=新宋体]import[/font][/color][color=#000000][font=新

import com;
import com.excel
excel = com.CreateObject(
"Excel.Application");
var book  = excel.Workbooks.Add();
var sheet = book.Worksheets(1);
excel.alerts =
false
excel.Visible =
true;

//通过工作簿样式设置字体,百分比\常规\货币\货币[0]\千位分隔\千位分隔[0]的参数
//在EXCEL中菜单--格式--样式--中的 格式 成员 属性
excel.ActiveWorkbook.styles("常规").Font.Bold = True
excel.ActiveWorkbook.styles(
"常规").Font.size = 15

//自动换行
excel.ActiveWorkbook.styles("常规").WrapText=true
sheet.Cells(2,1).value2=
"kk"
sheet.Range(
"g1:g5").value2="aa"
sheet.Range(
"f1").value2="测试一下是不是自动换行生效了"

/*
取消注释单独测试。其它操作部分务必注释掉以免干扰
//区域边框示例
excel.Range("b3:e20").borders.LineStyle=1
excel.Range("b3:e20").borders.Weight = 2/*xlThin*/


//上面一句顶下面两句还要多(多区域周围边框)
//excel.Range("b3:e20").borders(11).LineStyle=1
//excel.Range("b3:e20").borders(12).LineStyle=1
excel.Range("b3:e20").value2="3"
excel.Range(
"b3:e20").font.Size=200
sleep(1000)
excel.Range(
"b3:e20").font.Size=100

//自动适应列宽行宽 1 在VBA中AutoFit做为一个方法(行为)在aardio中要加上()才可以。
sheet.Cells.EntireColumn.AutoFit()
sheet.Cells.EntireRow.AutoFit()
sleep(1000)
excel.Range(
"b3:e20").font.Size=3

//自动适应列宽行宽 2。
sheet.Cells.Columns.AutoFit()
sheet.Cells.Rows.AutoFit()

//选中单元格
sheet.Range("A5").Select()

for(i=1;excel.ActiveWorkbook.styles.count;1){
    sheet.Cells(i,1).value2=excel.ActiveWorkbook.styles(i).name        
}

import com;
//输出com对象成员
dumpObject = function(obj,file="/dump.txt"){
   
//输出重定向
    io.stdout.reopen(file,"w+");
   
//输出COM对象成员
    com.DumpTypeInfo(excel.ActiveWorkbook.styles("常规"))
   
//还原标准输出
    io.stdout.reopen("CON","w")
    str =  string.load(
"/dump.txt");
   
return str;        
}
str = dumpObject(fs);

import process
process.
execute("/dump.txt");

评分

参与人数 1银币 +10 收起 理由
charliechen + 10 太棒了,刚好用上。

查看全部评分

vqimwr 发表于 2011-8-10 23:51:36

楼主加油。

楼主加油。
Kevinch 发表于 2011-8-11 12:48:44

刚来,不知道aau里有没有with语句,用with会快不少。

刚来,不知道aau里有没有with语句,用with会快不少。
quicker 发表于 2011-8-11 14:01:48

[quote][size=2][color=#999999]Kevinch 发表于 2011-8-11 12:48[/color] [url=forum.php

Kevinch 发表于 2011-8-11 12:48
刚来,不知道aau里有没有with语句,用with会快不少。
with语句示例:
import com

var IE = com.CreateObject("InternetExplorer.Application.1")

with IE {  

    Menubar =
false;
    AddressBar =
false;
    ToolBar =
false;  
    Top = 200
    Left = 200
    Width=300
    Height=300
    FullScreen =
false;
    Resizable =
true;   
    Visible =
true  
    Navigate2(
"http://www.baidu.com")
}
使用命名空间也可以,不过命名空间不能用于局部变量( with语句支持任意返回对象的表达式 )
import com

IE = com.CreateObject("InternetExplorer.Application.1")  
namespace IE {  

    Menubar =
false;
    AddressBar =
false;
    ToolBar =
false;  
    Top = 200
    Left = 200
    Width=300
    Height=300
    FullScreen =
false;
    Resizable =
true;   
    Visible =
true  
    Navigate2(
"http://www.baidu.com")
}

sishau 发表于 2011-8-11 20:49:54

留个爪印,以后慢慢看 谢谢楼主啦

留个爪印,以后慢慢看
谢谢楼主啦
quickerfans 发表于 2011-8-12 10:24:27

[quote][size=2][color=#999999]quicker 发表于 2011-8-11 14:01[/color] [url=forum.php

quicker 发表于 2011-8-11 14:01

对命名空间还不理解。发现理解它对编程提高很多。希望quicker能赐教浅谈几句。谢谢,
qqmmcc 发表于 2011-8-12 11:27:14

[i=s] 本帖最后由 qqmmcc 于 2011-8-12 11:35 编辑 [/i] 是啊,对命名空间与CLASS 我有时还是迷糊,不够清晰 刚学

本帖最后由 qqmmcc 于 2011-8-12 11:35 编辑

是啊,对命名空间与CLASS  我有时还是迷糊,不够清晰

刚学面向对象,搜索一些资料及看库源码学习{:soso_e127:}
qqmmcc 发表于 2011-8-13 13:45:49

[quote][size=2][color=#999999]quickerfans 发表于 2011-8-12 10:24[/color] [url=forum

quickerfans 发表于 2011-8-12 10:24
对命名空间还不理解。发现理解它对编程提高很多。希望quicker能赐教浅谈几句。谢谢,

上面语句,如果不放在命名空间里 你要如下面写法才能执行

import com

//Create an Instance of IE
IE = com.CreateObject("InternetExplorer.Application.1") // 创建IE对象

    IE.Menubar = false;
    IE.AddressBar =
false;
    IE.ToolBar =
false;  
    IE.Top = 200
    IE.Left = 200
    IE.Width=300
    IE.Height=300
    IE.FullScreen =
false;
    IE.Resizable =
true;   
    IE.Visible =
true  
    IE.Navigate2(
"http://www.baidu.com")


放在命名空间里,你就可以省略每行都写IE. 是方便也便于归纳 。



quickerfans 发表于 2011-8-13 14:15:36

[i=s] 本帖最后由 quickerfans 于 2011-8-13 14:24 编辑 [/i] [quote][size=2][color=#999999

本帖最后由 quickerfans 于 2011-8-13 14:24 编辑
qqmmcc 发表于 2011-8-13 13:45
上面语句,如果不放在命名空间里 你要如下面写法才能执行

import com


namespace IE {  
}
这一句声明了IE的命名空间。这些属性,方法,在IE命名空间里就可以直接用了。不再在其前面加上命名空间IE.的前缀。这一个还算好理解。import win
aa1234="123456"
bb="cc"
win.msbox(self["aa"++1234],"aardio"),这个同样属于命名空间的问题,似乎就绕一个弯
qqmmcc 发表于 2011-8-13 16:00:43

[i=s] 本帖最后由 qqmmcc 于 2011-8-13 16:06 编辑 [/i] aa1234="123456" bb="cc" win.msgb

本帖最后由 qqmmcc 于 2011-8-13 16:06 编辑

aa1234="123456"
bb="cc"
win.msgbox(self["aa"++1234],"aardio")

这样写只是说明语法而已,实际中灵活运用,你可以直接win.msbox(aa1234,"aardio")
quickerfans 发表于 2011-8-18 09:34:30

//excel to table [url=http://bbs.aardio.com/][color=#929976]http://bbs.aardio.co

//excel to table http://bbs.aardio.com/
import com;
excel=com.CreateObject("Excel.Application");
excel.Workbooks.open("c:\2.xls");
excel.visible=false;
excel.DisplayAlerts = False;
sheet=excel.workbooks(1).sheets(1);
//sheet.range("a1:f9").value2=5;
//io.open();
//初始行为1,求有几行;
H=0;
while(sheet.cells(H+1,1).value2!=null){
H+=1;
};
//初始列为1,求有几列;
L=0;
while(sheet.cells(1,L+1).value2!=null){
L+=1;
};
var tabsum={};
//txt=io.open("c:\test.txt","w")
for(j=1;H;1){
//定义一个空表
var tab={};
for(k=1;L;1){
//从每一行的第一列打印到最后一列;
//io.print(sheet.cells(j,k).value2);
//txt.write(tostring(sheet.cells(j,k).value2)+" ");
//把单元格中的数值压入表中,空单元格或为null或为10个空格
  if(tostring(sheet.cells(j,k).value2)!='          '){   
   table.push(tab,tostring(sheet.cells(j,k).value2));
  }
  else {
  table.push(tab,"null")
  }
  
};
//txt.write('\r\n')
//将子表中的数值压入总表中成二维数组
table.push(tabsum,tab);
};
excel.quit();
//for(i=1;H;1){
io.open();
//变量i从1至表中键值对数量之和 递增为1
for(i=1;#tabsum;1){
//总表 中 子表 键值对 枚举
for(k,v in tabsum[ i ]){
io.print(k,v);
};
};
Kevinch 发表于 2011-8-18 12:33:33

[i=s] 本帖最后由 Kevinch 于 2011-8-18 12:39 编辑 [/i] [quote][size=2][color=#999999]qui

本帖最后由 Kevinch 于 2011-8-18 12:39 编辑
quickerfans 发表于 2011-8-18 09:34


while(sheet.cells(H+1,1).value2!=null){
H+=1;
};
可以试一下
H=sheet.cells(sheet.rows.count,1).end(3).row

列的也有类似用法
L=sheet.cells(1,sheet.columns.count).end(1).column
quickerfans 发表于 2011-8-18 14:49:17

[i=s] 本帖最后由 quickerfans 于 2011-8-31 10:39 编辑 [/i] [quote][size=2][color=#999999

本帖最后由 quickerfans 于 2011-8-31 10:39 编辑
Kevinch 发表于 2011-8-18 12:33
while(sheet.cells(H+1,1).value2!=null){
H+=1;
};


sheet.cells(1,1).end(-4121).row;
//xlDown=-4121;
/*END属性:返回一个 Range 对象,该对象代表包含源区域的区域尾端的单元格。等同于按键 End+ 向上End+ 向下键、End+ 向左键或 End+ 向右键。Range 对象,只读。*/

//xlToRight=-4161;
sheet.cells(1,1).end(-4161).select()
sleep(1000);
//xlToLeft=-4159;
sheet.cells(1,1).end(-4159).select()

//xlDown=-4121;
sleep(1000)
sheet.cells(1,1).end(-4121).select()
io.open()
io.print(sheet.cells(1,1).end(-4121).row)
io.print(sheet.cells(1,1).end(-4161).column)
这个方法是要简单些,这样封装一个exceltotable的函数用不了几行代码。仍然不连续的单元格不适用

谢谢,又学了些东东。
++++++摘自nvt303空间+++++
//得到使用的行数和列数,包括不连续行,行,
books=excel.workbooks;
excel.workbooks(1).sheets(1).Activate()
l=excel.ActiveSheet.UsedRange.Columns.count
h=excel.ActiveSheet.UsedRange.Rows.Count
io.open()
io.print(h,l)
++++++++++++++++++++
设置某单元格格式为文本   
sheet.Range("A1").NumberFormatLocal    = "@"
设置单元格格式为数值  
    sheet.Range("A1").NumberFormatLocal    =    "0.00"  //保留小数点后两位
设置单元格格式为时间   
    sheet.Range("A1").NumberFormatLocal    =    "h:mm    AM/PM"  

sheet.Range( "A1").HorizontalAlignment =-4108;   //水平居中
sheet.Range( "A1").VerticalAlignment =-4108;  //垂直居中



12下一页

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2017-9-22 07:11 , Processed in 0.078125 second(s), 25 queries , Wincache On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表