ahk写入excel单元格_【进阶】Excel 自动化教程
编者:amnesiac 首发:官方论坛之中文版
导言:本文最初翻译自 Basic Ahk_L COM Tutorial for Excel(作者 Mickers),后面根据 Excel 脚本编写系列(很棒的系列教程)重新改写,曾使用标题 Excel 自动化第一阶发
表于中文论坛。本教程将介绍通过 COM 自动化 Microsoft Office Excel,其中对最基础的命令进行了说明,不论您对
Excel/VBA 是否熟悉,在学习本文后都能轻松的入门。之前曾发过一篇通过 ADO 操作电子表格文件的文章,大家可相互参照。
创建、连接和终止 Excel 实例我们从最简单的脚本开始介绍,这个脚本创建一个 Excel 实例,并向其中添加一个新的工作簿:
objExcel := ComObjCreate("Excel.Application")
objExcel.Workbooks.Add执行这段脚本后,为什么没有出现 Excel 程序呢?前面的脚本是起了作用,您也确实创建了 Excel
的新的实例。如果您仍在怀疑,请打开任务管理器并查看其中的进程,应该能在里面找到 Excel.exe
进程。实际情况是这样:默认情况下,在任何时候使用脚本创建 Office 应用程序的实例,该应用程序都将在屏幕上不可见的窗口中运行。Excel
其实存在于后台,所以您无法看到它。当 Excel
在不可见的窗口中运行时,您唯一的损失就是失去了通过键盘键入内容,从而使应用程序响应击键操作这一功能,而这正是默认行为起作用的地方。假设您正在运行
一个脚本程序,该脚本程序将使用 Excel 创建一个报表,我们还假设在脚本运行期间,Excel 始终处于可见状态。用户 (甚至您本人)
可能会无意间按下键盘上的某一个按键,从而毁掉整个报表或者意外地通过关闭 Excel
以致不仅毁掉报表,而且使脚本崩溃的目的(因为脚本会尝试向已经不存在的 Excel 实例发送命令)。以不可见的方式运行 Excel
就可以避免这类问题的发生。
不过在执行本文中的代码时,为了查看代码执行的效果,这里必须让它显示出来:
objExcel.Visible := True创建新的 Excel 实例常常需要等一些时间,有时我们不想创建(例如在学习本文需要测试其中的代码)而只想使用当前已有的 Excel 实例,那么可以这么做:
objExcel := ComObjActive("Excel.Application") ; 获取当前活动的 Excel 实例的句柄要让这个 Excel 实例退出,只需简单的执行 quit 命令:
objExcel.Quit
打开电子表格
我
们已经会创建 Excel 实例,现在看看如何打开电子表格。在 Excel 对象模型(有关详细信息,请参阅 MSDN 中的 Excel
Object Model Overview)中,电子表格包含在 Workbooks 对象中。要打开电子表格,我们需要创建一个 Workbooks
集合的实例,然后使用 Open 方法打开电子表格。听起来很复杂,但具体到能够创建 Excel 实例的 ComObjCreate
的调用,只需要写以下区区两行代码:
objExcel := ComObjCreate("Excel.Application")
objWorkbook := objExcel.Workbooks.Open("C:\test.xls")当然有一点是很明显的,那就是如果在 C:\ 文件夹中并不存在名为 test.xls 的文件,那么脚本就不会起作用。如果您的计算机中没有安装
Excel,那么脚本也不会起作用(如果您认为仅仅通过运行这个脚本就可以避免购买 Office,那么很抱歉,让您失望了)。
有没有打
开电子表格的其他的编程方法?有。实际上,我们这个专题中的许多操作都可以用其他的方法完成。但出于时间和版面的考虑,我们将以最容易被初学者接受的方法
来编写 Excel 脚本。如果您希望了解能够完成相同任务的其他的方法,请查看Excel 帮助中的 Excel 对象模型文档。
保存文件直接保存到当前文件:
objExcel.Workbook.Save()另存为其他文件:
objExcel.ActiveWorkbook.SaveAs("C:\test.xls")
将数据添加到电子表格中首先我们简单地引用一个单元格,然后相应地设置值。下面将在第一行第一列输入“AutoHotkey”:
objExcel.Cells(1, 1).Value := "AutoHotkey"
从电子表格读取数据现在我们把刚才存入的数据读取并显示出来:
strCell := objExcel.Cells(1, 1).Value
MsgBox, % strCell如果您想要添加其他的数据,我们只需要多引用几个单元格并且设置合适的值就可以了。
格式设置在脚本中设置单元格的格式和手动设置单元格一样的简单,在下面将设置单元格 A1 的格式:
objExcel.Cells(1, 1).Font.Bold := TRUE ; 将文本设为黑体
objExcel.Cells(1, 1).Font.Size := 24 ; 将字体大小设为 24
objExcel.Cells(1, 1).Font.ColorIndex := 3 ; 将字体颜色设为红色这段代码是非常简单的,如果想要将文本设为斜体该怎么办?可以使用下面这行代码:
objExcel.Cells(1, 1).Font.Italic := TRUE如果想要使用 Times New Roman 字体该怎么办?可以使用下面这行代码:
objExcel.Cells(1, 1).Font.Name := "Times New Roman"要将单元格的背景颜色设置为褐色,可以使用下面的代码:
objExcel.Cells(1, 1).Interior.ColorIndex := 9注:遗憾的是,我们没有时间全面介绍您在处理时会使用的许多格式设置选项,您需要去参考 Excel 帮助。
使用范围在
许多时候我们需要对多个单元格,例如同一行的某些单元格或整列单元格,这时需要使用范围。虽然有几种不同的方法指示范围中包含的单元格,但是它们有一点是
共同的:它们都需要您创建 Range 对象的实例,然后指定哪些单元格是该范围的一部分。例如,下面是一些创建范围的常用方法。
要创建包含单个单元格的范围:
objRange2 := objExcel.Range("A1")要创建包含整个列的范围:
objRange := objExcel.ActiveCell.EntireColumn正如您所期望的,有相似的命令来创建包含整个行的范围:
objRange := objExcel.ActiveCell.EntireRow如
果您想要选择的行或列不同于带有活动单元格的行或列怎么办?没问题。使用所需的行或列中的一个单元格来创建范围,然后使用 Activate
方法来使其成为活动单元格。此时,设置代表整个行或列的范围。例如,下面这段代码使单元格 E5 成为活动单元格,然后通过选择整个行来创建包含第 5
行中的所有单元格的范围:
objRange := objExcel.Range("E5")
objRange.Activate
objRange := objExcel.ActiveCell.EntireRow要创建包含一组单元格的范围:
objRange := objExcel.Range("A1:C10")注意,您在这里做的是指定起点 (A1) 和终点 (C10)。Excel 会自动选择这两个点之间的所有单元,并把它们放在范围之中。
要创建包含所有数据的范围:
objCell := objExcel.Range("A1").SpecialCells(11)在这个例子中,11 是表示包含数据的电子表格中最后的单元格的参数。这个命令所创建的范围从单元格 A1 开始一直延伸到所有包含数据的单元格。
注:在 Excel 中可以使用许多灵活的方式指定范围,然而在某些要求比较高难以直接使用范围时,这时可以考虑循环:
; 这里在 A1-I1 单元格中依次存入数字 1-9
while, (A_Index < 10)
{
strCell := Chr(A_Index + 64) . "1"
objExcel.Range(strCell).value := A_Index
}经过适当的变化,可以用于许多较特殊的情况,例如隔行读取数据等。
数据排序您还可以对 Excel 中的内容进行排序:
objRange2 := objExcel.Range("A1")您必须按范围对 Excel 中的数据进行排序。因而,您需要创建一个范围,它包含您想要按其进行排序的列的第一个单元格。因为我们想要按列 A 进行排序,所以我们创建的范围包含单个单元格:A1。
objRange.Sort(objRange2,,,,,,,1)这种 Sort 方法看起来很疯狂(这么多逗号),但这是因为我们仅仅按单列进行排序。当您在 Excel 中对一些内容进行排序时,您必须依次指定所有的排序参数;如果您不使用参数,则将其保留为空。其中参数的含义请参阅 Excel 帮助。
一个完整的脚本现在我们把前面的大部分操作合并到一个完整的脚本中,在其中我们将进行下列操作:
更改带标签的单元格 (1,1) 的背景颜色和字体颜色;
创建包含我们正在使用的五个单元格的范围 (A1:A5) 并更改字体大小;
创建包含带有四个物理学家名字的单元 (A2:A5) 的范围并更改背景颜色;
选择列 A 并使用 Autofit() 方法来重新设置列的大小,以便所有的文本都适合;
创建只包含 A1 的范围并对列 A 进行排序。脚本如下:
objExcel := ComObjCreate("Excel.Application")
objExcel.Visible := True
objExcel.Workbooks.Add
objExcel.Cells(1, 1).Value := "Name"
objExcel.Cells(1, 1).Font.Bold := TRUE
objExcel.Cells(1, 1).Interior.ColorIndex := 30
objExcel.Cells(1, 1).Font.ColorIndex := 2
objExcel.Cells(2, 1).Value := "Schr?dinger"
objExcel.Cells(3, 1).Value := "Heisenberg"
objExcel.Cells(4, 1).Value := "Bohr"
objExcel.Cells(5, 1).Value := "Einstein"
objRange := objExcel.Range("A1","A5")
objRange.Font.Size := 14
objRange := objExcel.Range("A2","A5")
objRange.Interior.ColorIndex := 36
objRange := objExcel.ActiveCell.EntireColumn
objRange.AutoFit()
objRange2 := objExcel.Range("A1")
objRange.Sort(objRange2,,,,,,,1)
如果希望查看执行每行脚本时 Excel 中发生的变化(尽管前面已经解释了它们的功能,不过看看效果印象会更深刻,假如您之前没有执行过代码的话),那么可以在 SciTE4AutoHotkey 中使用单步执行的方法。
就这些吗?基础教程到这里就结束了,不管您信不信,您可以在系统管理脚本中使用的所有奇妙的方法,我们都还没有接触到。例如,我们还没有讨论使用 Excel 来创建图表或图形的可能性。如果您想对 Excel 进行深入的学习以执行更多更高级的操作,可以将下面两种方法结合起来:
通过 VBA 帮助简单的熟悉 Excel 中的数据对象模型,并学习其中的例子;
通过 Excel 的宏功能录制手动进行的操作,并查看相应的 VBA 代码,把它们转换成 AutoHotkey 中的代码是很简单的。并且,多实践、多思考、多总结,我想您很快就能成为其中的高手。
此外,在官方论坛和中文论坛可以找到许多在脚本中操作 Excel 的实用的例子,例如:用AHK_L原生的com处理excel实例
ahk写入excel单元格_【进阶】Excel 自动化教程相关推荐
- ahk写入excel单元格_输出excel数据到GUI 获取excel所有Sheet及字段 Autohotkey
;Thinkai@2015-10-25 Gui, Add, Tab, x0 y0 w800 h500 vtab Gui, Show, , 输出excel数据到GUI FileSelectFile, f ...
- 如何通过VB合并Excel单元格以及设置Excel行高?VB创建Excel表格,合并单元格,生成图形等操作
如何通过VB合并Excel单元格以及设置Excel行高? 例如:我想把第一列的第4,5,6,7行合并...我在怎样让合并单元格里的字居中,怎样改变字体. 请不吝赐教... ============== ...
- java excel单元格背景色,『excel表格尺寸设置』Java如何设置被导出excel单元格的样式?比如背景色,大小什么的?...
Java如何设置被导出excel单元格的样式?比如背景色,大小什么的? 使 poi ,具体实现 HSSFCellStyle style = null; // 创建表头style HSSFCellSty ...
- java excel 单元格类型,POI Excel 单元格内容类型判断并取值
个人用到的 String birthdayVal = null; switch (cell_2.getCellTypeEnum()) { case STRING: birthdayVal = cell ...
- 【杂项】python将图片转成Excel单元格显示;Excel生成图片
目录 思路 代码实现 运行结果 用python做的小玩意,可以在Excel单元格填充颜色,所有像素组合成一张图片. 思路 读取图片 获取图片像素信息 设定在Excel里显示的像素量.保留长宽信息 缩放 ...
- cxgrid 行合并单元格_【Excel VBA】如何批量撤销合并单元格?
周末好,之前我们分享了批量合并单元格的VBA小代码,链接参考: [Excel VBA]如何批量合并相同值单元格? 天下大势合久必分.分久必合.分分合合合合分分又合合合再分分分又又合合合合合合合---- ...
- 如何让图片充满excel单元格_如何在Excel单元格建立下拉菜单
对于一些常用的数据我们往往会希望能够尽量快速的输入,下拉菜单就是一个最简单的解决办法.那么如何实现下拉菜单呢?跟随以下步骤,建立属于自己的下拉菜单吧! 如何建立下拉菜单? 一.确定内容:在单元格中,输 ...
- python 拆分excel单元格_如何用Python拆分合并后的Excel单元格?
我尝试只拆分Excel文件中的合并单元格(包含多个工作表),如下所示: 请注意有部分/全部空行.这些行不会合并.在 使用openpyxl,我在每个工作表中找到了合并的单元格区域,代码如下:wb2 = ...
- C#读取写入excel单元格
c# 读取写入excel单元格(包括对excel的一些基本操作) 以下是一些对excel的一些基本操作 1:工程对excel类库的导入,如:c:\program files\Microsoft off ...
- excel表格行列显示十字定位_取消excel单元格十字定位(excle表格里的十字对准)
EXCEL表格里十字怎么画,四周可以写字的? 合并单元格呀! 在EXCEL表格中箭头变成十字形的是怎么回事啊? 重新做一遍系统即可 excel表格中的选择一个单元格就回出现十字叉 是什么工具?谢谢. ...
最新文章
- 杀进程和取文件最近使用时间
- ESPNet系列:自动驾驶领域轻量级分割模型
- 给Ubuntu 开启 root 帐号并可 SSH 登录
- 10张漫画解释进程与线程的区别与联系
- 一起谈.NET技术,ASP.NET MVC 通过 FileResult 向浏览器发送文件
- 自动化部署mysql主从复制集群_使用docker部署mysql主从复制集群
- 安装python报错
- golang格式化输出---fmt包用法详解
- flutter 路由
- 技术人员,你的表达能力怎样?
- 小白学习一eNSP华为模拟器(3) 交换机基础配置 实验四VLAN 配置Trunk
- java 月的天数_Java获取某月天数
- 弘玑Cyclone上榜36氪中国超自动化先锋企业
- 阿正喜欢的演讲系列连载(一):大法官约翰·罗伯茨-我祝你不幸(I Wish You Bad Luck)
- 美团旅行前端技术体系的思考与实践
- Pentest Wiki Part2 漏洞评估
- matlab均衡的算法有哪些,从Matlab到Python的算法均衡
- Firecracker
- win 10 下matlab 7 运行不了,弹出警告,完美解决方案
- android 图片读写,Android读取本地照片和视频相册