Excel 2003高级VBA编程宝典txt,chm,pdf,epub,mobi下载 作者:John Walkenbach 出版社: 电子工业出版社 译者:盖江南/王勇 出版年: 2005-10 页数: 696 定价: 79.0 装帧: 平装 丛书: 计算机“宝典”丛书 ISBN: 9787121017858 内容简介 · · · · · ·本书是专门为在Excel 2003中使用VBA编程而编写的一部专著。 全书共分8个部分,主要包括Excel 2003的基本背景、Excel应用程序开发、VBA编程、用户窗体和高级编程技巧等内容。本书用大量的示例、代码阐述了VBA编程的概念,是学习在 Excel 2003中用VBA进行编程的最直接和最有效的方法。通过本书的学习,能使读者迅速、轻松、高效地完成各种复杂工作。 本书可作为有一定经验的Excel用户学习VBA编程的首选书籍,同时也是高级Excel编程人员深入VBA编程的一本非常不错的参考书。 作者简介 · · · · · ·沃肯巴赫,是享有Mr.Spreadsheet 美誉的国际知名作者,是电子表格软件方面的领导权威,是美国Wiley出版公司出版的Excel系列丛书的总策划和总编辑。他编写了30多部电子表格软件方面的书籍,有很多书籍在亚马逊网站羸得了5星级的评价,其中的《Excel2003公式与函数应用宝典》、《中文版Excel2003宝典》和《Excel应用技巧宝典》已由电子工业出版社引进翻译出版并畅销至今。他还为各大报刊杂志撰写了300多篇文章,其中不乏大量的知名计算机专业杂志。 目录 · · · · · ·第1部分 excel基础知识 1第1章 excel 2003的起源 2 1.1 电子表格软件的简短历史 2 1.1.1 最初的起源visicalc 2 1.1.2 lotus 1-2-3 2 1.1.3 quattro pro 5 · · · · · ·() 第1部分 excel基础知识 1 第1章 excel 2003的起源 2 1.1 电子表格软件的简短历史 2 1.1.1 最初的起源visicalc 2 1.1.2 lotus 1-2-3 2 1.1.3 quattro pro 5 1.1.4 microsoft excel 5 1.2 excel对开发人员的重要性 9 1.3 excel在微软战略中的角色 9 第2章 excel概述 11 2.1 关于对象 11 2.2 工作簿 12 2.2.1 工作表 12 2.2.2 图表工作表 13 2.2.3 xlm宏工作表 13 2.2.4 excel 5/95对话框编辑表 14 2.3 excel的用户界面 14 2.3.1 菜单 14 2.3.2 快捷菜单 15 2.3.3 工具栏 15 .2.3.4 对话框 16 2.3.5 拖放 16 2.3.6 键盘快捷键 17 2.3.7 智能标记 17 2.3.8 任务窗格 17 2.4 数据录入 18 2.5 公式、函数和名称 19 2.6 定制屏幕显示 20 2.7 选择对象 20 2.8 格式 21 2.8.1 数字型格式 21 2.8.2 样式型格式 21 2.9 形状 22 2.10 图表 22 2.11 宏和编程 23 2.12 数据库访问 23 2.12.1 工作表数据库 24 2.12.2 外部数据库 24 2.13 internet 特性 25 2.14 xml特性 26 2.15 分析工具 26 2.15.1 分级显示 26 2.15.2 自动的分类汇总 26 2.15.3 analysis toolpak 26 2.15.4 数据透视表 27 2.15.5 solver 28 2.16 加载宏 28 2.17 兼容性 28 2.18 保护选项 28 2.18.1 保护公式以防被修改 28 2.18.2 保护工作簿的结构 29 2.18.3 用密码保护工作簿 30 2.18.4 用密码保护vba代码 30 2.19 excel的“帮助”系统 31 第3章 公式的技巧 32 3.1 公式简介 32 3.2 计算公式 32 3.3 单元格和单元格区域引用 33 3.3.1 为什么使用不是相对的引用 33 3.3.2 r1c1表示法 34 3.3.3 引用其他的工作表或者工作簿 35 3.4 使用名称 36 3.4.1 命名单元格和单元格区域 36 3.4.2 将名称应用于现有的引用 36 3.4.3 交叉名称 37 3.4.4 命名列和行 38 3.4.5 名称的作用域 38 3.4.6 命名常量 38 3.4.7 命名公式 39 3.4.8 命名对象 40 3.5 公式错误 41 3.6 数组公式 41 3.6.1 一个数组公式的例子 42 3.6.2 数组公式日历 43 3.6.3 数组公式的优缺点 43 3.7 计数和求和技巧 43 3.7.1 使用countif或者sumif函数 44 3.7.2 使用数组公式进行计数和求和 44 3.7.3 其他计数工具 45 3.8 使用日期和时间 46 3.8.1 输入日期和时间 46 3.8.2 使用1900年之前的日期 46 3.9 创建大公式 47 第4章 理解excel的文件 50 4.1 启动excel 50 4.2 所支持的电子表格文件格式 51 4.2.1 lotus 1-2-3电子表格文件 52 4.2.2 quattro pro电子表格文件 52 4.2.3 数据库文件格式 52 4.2.4 文本文件格式 53 4.2.5 其他文件格式 53 4.3 用excel编写的文件 53 4.3.1 xls文件 54 4.3.2 工作区文件 54 4.3.3 模板文件 55 4.3.4 工具栏文件 55 4.3.5 加载宏文件 56 4.4 excel和html 56 4.4.1 excel如何使用html 56 4.4.2 增加难度 57 4.4.3 创建交互式的html文件 58 4.5 导入和导出xml文件 59 4.5.1 什么是xml 59 4.5.2 使用映射导入xml数据 60 4.5.3 将xml数据导入到列表中 62 4.5.4 从excel导出xml数据 63 4.6 注册表中的excel设置 63 4.6.1 关于注册表 63 4.6.2 excel的设置 64 第2部分 excel应用程序开发 67 第5章 电子表格应用程序的内涵 68 5.1 电子表格应用程序 68 5.2 开发人员和终端用户 69 5.2.1 谁是开发人员 69 5.2.2 电子表格应用程序用户的分类 70 5.2.3 电子表格应用程序的客户 70 5.3 用电子表格应用程序解决问题 71 5.4 基本的电子表格应用程序类型 71 5.4.1 快捷但质量不高的电子表格应用程序 72 5.4.2 自己创作、自己使用的电子表格应用程序 72 5.4.3 单用户电子表格应用程序 72 5.4.4 意大利面条式电子表格应用程序 73 5.4.5 实用电子表格应用程序 73 5.4.6 包含工作表函数的加载宏 74 5.4.7 单元块预算式电子表格应用程序 74 5.4.8 假设分析模型式电子表格应用程序 74 5.4.9 数据存储和访问电子表格应用程序 74 5.4.10 数据库前端电子表格应用程序 75 5.4.11 统包式电子表格应用程序 75 第6章 电子表格应用程序开发的基础 76 6.1 确定用户需求 76 6.2 规划满足用户需求的应用程序 77 6.3 确定最合适的用户界面 78 6.3.1 创建自定义的对话框 79 6.3.2 在工作表上使用activex 控件 79 6.3.3 自定义菜单 80 6.3.4 自定义工具栏 82 6.3.5 创建快捷键 83 6.3.6 执行开发的成果 83 6.4 使自己关心终端用户 84 6.4.1 测试电子表格应用程序 84 6.4.2 尽量完善电子表格应用程序的安全性 85 6.4.3 使得电子表格应用程序比较美观和直观 86 6.4.4 创建用户帮助系统 87 6.4.5 编制有关开发成果的文档 87 6.4.6 将电子表格应用程序分发给用户 87 6.4.7 需要的时候更新电子表格应用程序 88 6.5 其他开发问题 88 6.5.1 用户安装的excel版本 88 6.5.2 语言问题 89 6.5.3 系统速度 89 6.5.4 视频模式 89 第3部分 理解vba 91 第7章 vba概述 92 7.1 基本的背景 92 7.2 关于vba 92 7.2.1 对象模型 93 7.2.2 vba与xlm的对比 93 7.3 vba基础知识 94 7.4 visual basic 编辑器概述 96 7.4.1 激活vbe 96 7.4.2 vbe窗口 97 7.5 使用“工程资源浏览器”窗口 98 7.5.1 添加新的vba模块 99 7.5.2 删除vba模块 99 7.5.3 导出和导入对象 99 7.6 使用“代码”窗口 100 7.6.1 最小化和最大化窗口 100 7.6.2 存储vba代码 101 7.6.3 输入vba代码 101 7.7 定制vbe环境 106 7.7.1 使用“编辑器”选项卡 106 7.7.2 使用“编辑器格式”选项卡 108 7.7.3 使用“通用”选项卡 109 7.7.4 使用“可连接的”选项卡 110 7.8 宏录制器 111 7.8.1 宏录制器实际记录哪些内容 111 7.8.2 相对模式还是绝对模式 112 7.8.3 录制选项 115 7.8.4 整理已录制的宏 115 7.9 关于对象和集合 117 7.9.1 对象层次结构 117 7.9.2 关于集合 118 7.9.3 引用对象 118 7.10 属性和方法 119 7.10.1 对象的属性 119 7.10.2 对象的方法 119 7.11 comment对象示例 121 7.11.1 查看有关comment对象的帮助 121 7.11.2 comment对象的属性 122 7.11.3 comment对象的方法 122 7.11.4 comments 集合 123 7.11.5 关于comment属性 123 7.11.6 comment对象中的对象 124 7.11.7 确定单元格中是否含有comment对象 125 7.11.8 添加新的comment对象 125 7.11.9 一些有用的应用程序属性 126 7.12 range对象的使用 127 7.12.1 range属性 128 7.12.2 cells属性 129 7.12.3 offset属性 130 7.13 关于对象 131 7.13.1 基本的理念 131 7.13.2 学习有关对象和属性的更多信息 132 第8章 vba编程基础 135 8.1 vba语言元素概览 135 8.2 注释 137 8.3 变量、数据类型和常量 138 8.3.1 定义数据类型 139 8.3.2 声明变量 141 8.3.3 变量的作用域 142 8.3.4 常量的使用 145 8.3.5 字符串的使用 146 8.3.6 日期的使用 147 8.4 赋值语句 148 8.5 数组 149 8.5.1 声明数组 149 8.5.2 声明多维数组 149 8.6 对象变量 150 8.7 用户定义数据类型 151 8.8 内置函数 152 8.9 处理对象和集合 154 8.9.1 with-end with 构造 154 8.9.2 for each-next 构造 155 8.10 控制执行 156 8.10.1 goto 语句 157 8.10.2 if-then 构造 157 8.10.3 select case 构造 160 8.10.4 指令的循环块 163 第9章 vba的sub过程 169 9.1 关于过程 169 9.1.1 声明sub过程 169 9.1.2 过程的作用域 170 9.2 执行sub过程 171 9.2.1 用“运行子过程/用户窗体”命令执行过程 172 9.2.2 从“宏”对话框执行过程 172 9.2.3 用ctrl键组合执行过程 172 9.2.4 从自定义菜单执行过程 173 9.2.5 从另一个过程执行过程 175 9.2.6 从工具栏按钮执行过程 178 9.2.7 通过单击对象执行过程 179 9.2.8 当事件发生时执行过程 180 9.2.9 从“立即窗口”执行过程 180 9.3 向过程传递参数 181 9.4 错误处理技术 184 9.4.1 捕获错误 184 9.4.2 错误处理示例 185 9.5 使用sub过程的实际例子 187 9.5.1 目的 187 9.5.2 工程需求 188 9.5.3 已经了解的信息 188 9.5.4 着手处理 188 9.5.5 需要了解哪些信息 189 9.5.6 初步的录制工作 189 9.5.7 初始设置 190 9.5.8 代码的编写 191 9.5.9 排序过程的编写 192 9.5.10 更多测试 195 9.5.11 修复问题 195 9.5.12 实用程序的可用性 197 9.5.13 对工程进行评估 197 第10章 创建function过程 199 10.1 sub过程与function过程对比 199 10.2 为什么创建自定义的函数 199 10.3 介绍性的函数示例 200 10.3.1 一个自定义函数 200 10.3.2 在工作表中使用函数 200 10.3.3 在vba过程中使用函数 201 10.3.4 分析自定义函数 202 10.4 function过程 202 10.4.1 声明函数 203 10.4.2 函数的作用域 203 10.4.3 执行function过程 204 10.5 function过程的参数 205 10.6 函数示例 206 10.6.1 无参数的函数 206 10.6.2 另一个无参数的函数 206 10.6.3 接受一个参数的函数 207 10.6.4 接受两个参数的函数 209 10.6.5 接受数组参数的函数 210 10.6.6 接受可选参数的函数 211 10.6.7 返回vba数组的函数 212 10.6.8 返回错误值的函数 214 10.6.9 接受不定数量的参数的函数 215 10.7 模拟excel的sum函数 216 10.8 调试函数 218 10.9 使用“插入函数”对话框 219 10.9.1 指定函数类别 220 10.9.2 添加函数说明 220 10.10 使用加载宏存储自定义的函数 222 10.11 使用windows api 222 10.11.1 windows api示例 223 10.11.2 确定windows目录 223 10.11.3 检测shift键 224 10.11.4 了解更多有关api函数的信息 225 第11章 vba编程示例和技巧 226 11.1 处理单元格区域 226 11.1.1 复制单元格区域 226 11.1.2 移动单元格区域 227 11.1.3 复制大小可变的单元格区域 228 11.1.4 选中或者识别各种类型的单元格区域 229 11.1.5 提示输入单元格中的值 230 11.1.6 在下一个空单元格内输入一个值 231 11.1.7 暂停宏的运行以便获得用户选中的单元格区域 232 11.1.8 计算选中的单元格的数目 234 11.1.9 确定选中的单元格区域的类型 234 11.1.10 有效地遍历选中的单元格区域 235 11.1.11 删除所有空行 237 11.1.12 确定单元格区域是否包含在另一个单元格区域内 238 11.1.13 确定单元格的数据类型 238 11.1.14 读写单元格区域 239 11.1.15 给单元格区域写值的更好的方法 240 11.1.16 传递一维数组中的内容 242 11.1.17 将单元格区域传递给variant类型的数组 242 11.1.18 选中单元格区域中的最大值 243 11.1.19 选中有某种特殊格式的所有单元格 244 11.2 处理工作簿和工作表 245 11.2.1 保存所有工作簿 246 11.2.2 保存和关闭所有工作簿 246 11.2.3 访问工作簿的属性 246 11.2.4 同步工作表 247 11.3 vba技巧 248 11.3.1 切换布尔类型的属性值 248 11.3.2 确定打印的页面的数量 249 11.3.3 显示日期和时间 249 11.3.4 获得字体列表 250 11.3.5 排序数组 251 11.3.6 处理一系列文件 252 11.4 用在代码中的一些有用的函数 254 11.4.1 fileexists函数 254 11.4.2 filenameonly函数 254 11.4.3 pathexists函数 255 11.4.4 rangenameexists函数 255 11.4.5 sheetexists函数 255 11.4.6 workbookisopen函数 255 11.4.7 检索已经关闭的工作簿中的值 256 11.5 一些有用的工作表函数 257 11.5.1 返回单元格的格式信息 258 11.5.2 显示与保存和打印的文件有关的数据 259 11.5.3 理解对象的父亲 259 11.5.4 计算值介于两个值之间的单元格数目 260 11.5.5 计算单元格区域中可见单元格的数目 261 11.5.6 确定行或者列中最后一个非空的单元格 261 11.5.7 字符串与模式匹配 263 11.5.8 从字符串中提取第n个元素 264 11.5.9 多功能的函数 265 11.5.10 sheetoffset函数 266 11.5.11 返回所有工作表中数据的最大值 266 11.5.12 返回没有重复的随机整数元素的数组 267 11.5.13 随机化单元格区域 269 11.6 windows api 调用 270 11.6.1 确定文件的关联性 270 11.6.2 确定默认打印机的信息 271 11.6.3 确定当前的视频模式 272 11.6.4 给应用程序添加声音 273 11.6.5 读写注册表 274 第4部分 用户窗体 277 第12章 多种自定义对话框的方法 278 12.1 创建用户窗体之前需要了解的内容 278 12.2 使用输入框 278 12.2.1 vba的inputbox函数 278 12.2.2 excel的inputbox函数 280 12.3 vba的msgbox函数 281 12.4 excel的getopenfilename方法 284 12.5 excel的getsaveasfilename方法 287 12.6 提示输入目录名称 287 12.6.1 使用windows api函数选中目录 288 12.6.2 使用filedialog对象选中目录 290 12.7 显示excel的内置对话框 290 12.7.1 使用dialogs 集合 290 12.7.2 了解更多与内置对话框有关的信息 292 12.7.3 用内置对话框时使用参数 292 12.7.4 直接执行菜单项 293 第13章 用户窗体概述 294 13.1 excel如何处理自定义对话框 294 13.2 插入新的用户窗体 294 13.3 往用户窗体上添加控件 295 13.4 “工具箱”的控件 296 13.4.1 复选框 296 13.4.2 组合框 296 13.4.3 命令按钮 296 13.4.4 框架 296 13.4.5 图像 296 13.4.6 标签 297 13.4.7 列表框 297 13.4.8 多页 297 13.4.9 选项按钮 297 13.4.10 refedit 297 13.4.11 滚动条 297 13.4.12 数值调节钮 297 13.4.13 tabstrip 298 13.4.14 文本框 298 13.4.15 切换按钮 298 13.5 调整用户窗体的控件 299 13.6 调整控件的属性 300 13.6.1 使用“属性”窗口 300 13.6.2 共同属性 301 13.6.3 更多属性的信息 301 13.6.4 适应键盘用户的需求 301 13.7 显示和关闭用户窗体 303 13.7.1 显示用户窗体 303 13.7.2 关闭用户窗体 304 13.7.3 关于事件处理程序 305 13.8 创建用户窗体示例 306 13.8.1 创建用户窗体 306 13.8.2 编写代码显示对话框 308 13.8.3 测试对话框 308 13.8.4 添加事件处理程序 309 13.8.5 验证数据的有效性 310 13.8.6 完成的对话框作品 311 13.9 理解用户窗体的事件 311 13.9.1 了解事件 311 13.9.2 用户窗体的事件 312 13.9.3 数值调节钮的事件 312 13.9.4 数值调节钮与文本框配对 314 13.10 引用用户窗体的控件 316 13.11 自定义“工具箱” 317 13.11.1 更改图标或者提示文本 317 13.11.2 添加新页 317 13.11.3 自定义或者组合控件 317 13.11.4 添加新的activex 控件 318 13.12 创建用户窗体的模板 318 13.13 用户窗体检验表 319 第14章 用户窗体示例 320 14.1 创建用户窗体式菜单 320 14.1.1 在用户窗体中使用命令按钮 320 14.1.2 在用户窗体中使用列表框 321 14.2 从用户窗体选中单元格区域 322 14.3 创建欢迎界面 323 14.4 禁用用户窗体的关闭按钮 324 14.5 改变用户窗体的大小 325 14.6 从用户窗体缩放和滚动工作表 326 14.7 列表框技巧 328 14.7.1 关于列表框控件 328 14.7.2 向列表框控件添加条目 329 14.7.3 确定选中的条目 332 14.7.4 确定选中的列表框中的多个条目 332 14.7.5 单个列表框中的多个列表 333 14.7.6 列表框条目的转移 334 14.7.7 在列表框中移动条目 335 14.7.8 使用多列的列表框控件 336 14.7.9 使用列表框选中工作表中的行 338 14.7.10 使用列表框激活工作表 339 14.8 在用户窗体中使用多页控件 341 第15章 用户窗体的高级技巧 343 15.1 显示进度条 343 15.1.1 创建独立的进度条 344 15.1.2 使用多页控件显示进度条 346 15.1.3 不用多页控件显示进度条 347 15.2 创建向导 348 15.2.1 为向导设置多页控件 348 15.2.2 向向导用户窗体添加按钮 349 15.2.3 编写向导按钮的程序 349 15.2.4 编写向导中的相关性代码 351 15.2.5 用向导执行任务 352 15.3 模仿msgbox函数 353 15.3.1 mymsgbox 代码 354 15.3.2 如何模仿msgbox 355 15.3.3 在模仿msgbox函数的过程中使用mymsgbox函数 356 15.4 非模态用户窗体 356 15.5 用一个事件处理程序处理多个用户窗体按钮 358 15.6 在用户窗体中选择颜色 360 15.7 在用户窗体中显示图表 362 15.7.1 将图表保存为文件 362 15.7.2 使用 owc的chartspace 控件 363 15.8 在用户窗体中显示电子表格 366 15.8.1 使得spreadsheet 控件可用 366 15.8.2 把spreadsheet 控件添加到用户窗体中 366 15.8.3 使用owc spreadsheet控件的简单示例 366 15.9 复杂的用户窗体enhanced data form 368 15.9.1 关于enhanced data form 369 15.9.2 安装enhanced data form加载宏 370 15.9.3 使用enhanced data form 370 第5部分 高级编程技巧 371 第16章 用vba开发excel实用程序 372 16.1 关于excel实用程序 372 16.2 使用vba开发实用程序 373 16.3 如何造就好的实用程序 373 16.4 text tools剖析实用程序 373 16.4.1 text tools的背景 374 16.4.2 text tools的工程目标 374 16.4.3 text tools实用程序的运作机理 375 16.4.4 text tools工作簿 375 16.4.5 text tools实用程序的用户窗体 375 16.4.6 thisworkbook 代码模块 376 16.4.7 module1 vba模块 378 16.4.8 userform1代码模块 379 16.4.9 使得text tools实用程序更加有效率 380 16.4.10 保存text tools实用程序的设置 381 16.4.11 实现撤销操作 382 16.4.12 事后分析工程 383 16.4.13 理解text tools实用程序 384 16.5 了解有关excel实用程序的更多内容 384 第17章 数据透视表 386 17.1 介绍性数据透视表示例 386 17.1.1 创建数据透视表 386 17.1.2 检查录制的数据透视表代码 388 17.1.3 整理录制的数据透视表代码 388 17.2 创建更加复杂的数据透视表 389 17.2.1 为更加复杂的数据透视表准备的数据 389 17.2.2 生成数据透视表的代码 390 17.2.3 更复杂的数据透视表的运作机理 392 17.3 从外部数据库创建数据透视表 392 17.4 创建多个数据透视表 394 17.5 修改数据透视表 396 第18章 图表 398 18.1 关于图表 398 18.1.1 图表的位置 398 18.1.2 chart对象模型 399 18.2 录制图表宏 400 18.2.1 图表生成宏录制器输出 400 18.2.2 整理图表生成的宏录制器输出 401 18.3 常用的vba制图方法 402 18.3.1 使用vba激活图表 402 18.3.2 使用vba使得图表处于非活动状态 404 18.3.3 确定图表是否处于活动状态 404 18.3.4 从chartobjects或者charts 集合中删除图表 405 18.3.5 使用vba应用图表的格式 405 18.3.6 遍历所有图表 406 18.3.7 调整chartobject对象的大小和对齐chartobject对象 407 18.4 更多制图的示例 408 18.4.1 在series 公式中使用名称 408 18.4.2 使用vba指定图表使用的数据 410 18.4.3 使用vba确定图表中使用的单元格区域 412 18.4.4 使用vba显示图表上的任意的数据标志 415 18.4.5 在用户窗体上显示图表 416 18.5 理解图表的事件 418 18.5.1 使用图表事件的示例 419 18.5.2 为嵌入图表启用事件 421 18.5.3 在嵌入图表上使用图表事件 423 18.6 vba制图技巧 425 18.6.1 在整个页面上打印嵌入图表 425 18.6.2 创建静态图表 425 18.6.3 用mouseover事件显示文本 426 18.6.4 动态图表 428 18.6.5 创建内摆线图表 429 18.6.6 创建时钟式图表 430 18.7 不使用宏的制图技巧 431 18.7.1 使用“自动筛选”特性控制数据系列 431 18.7.2 在图表工作表上存储多个图表 433 18.7.3 创建自我扩展式的图表 433 18.7.4 创建交互式的图表 438 第19章 理解excel的事件 442 19.1 excel可以监视的事件类型 442 19.2 应该了解的有关事件的信息 442 19.2.1 理解事件的顺序 443 19.2.2 在何处放置事件处理程序的过程 443 19.2.3 禁用事件 444 19.2.4 输入事件处理程序的代码 445 19.2.5 使用参数的事件处理程序的过程 446 19.3 工作簿级别的事件 447 19.3.1 open事件 448 19.3.2 activate事件 449 19.3.3 sheetactivate事件 449 19.3.4 newsheet事件 449 19.3.5 beforesave事件 449 19.3.6 deactivate事件 450 19.3.7 beforeprint事件 450 19.3.8 beforeclose事件 451 19.4 工作表级别的事件 452 19.4.1 change事件 453 19.4.2 监视特定的单元格区域的内容是否发生变化 454 19.4.3 selectionchange事件 456 19.4.4 beforerightclick事件 457 19.5 图表事件 457 19.6 应用程序事件 459 19.6.1 启用应用程序级别的事件 460 19.6.2 确定何时打开工作簿 460 19.6.3 监视应用程序级别的事件 461 19.7 用户窗体事件 462 19.8 没有与对象关联的事件 463 19.8.1 ontime事件 463 19.8.2 onkey事件 465 第20章 与其他应用程序交互 467 20.1 从excel启动别的应用程序 467 20.1.1 使用vba的shell函数 467 20.1.2 使用 windows的shellexecute api函数 469 20.2 用excel激活别的应用程序 470 20.2.1 使用appactivate 470 20.2.2 激活某个microsoft office应用程序 471 20.3 运行“控制面板”对话框 471 20.4 在excel中使用自动化 472 20.4.1 使用automation处理外部对象 473 20.4.2 早期绑定与后期绑定 473 20.4.3 后期绑定的简单示例 475 20.4.4 从excel控制word 476 20.4.5 从另一个应用程序控制excel 479 20.5 通过outlook发送私人的电子邮件 481 20.6 使用ado 482 20.7 从excel发送电子邮件附件 484 20.8 使用sendkeys 484 第21章 创建和使用加载宏 487 21.1 加载宏的概念 487 21.1.1 加载宏与标准工作簿的比较 487 21.1.2 创建加载宏的原因 488 21.2 理解excel的加载宏管理器 489 21.3 创建加载宏 490 21.4 加载宏示例 491 21.4.1 为加载宏示例设置工作簿 491 21.4.2 为加载宏示例测试工作簿 491 21.4.3 为加载宏示例添加描述性信息 491 21.4.4 创建加载宏 492 21.4.5 安装加载宏 493 21.4.6 发布加载宏 494 21.4.7 修改加载宏 494 21.5 对比xla文件和xls文件 495 21.5.1 xls和xla文件大小和结构 495 21.5.2 xla文件的vba集合成员 495 21.5.3 xls和xla文件的可见性 496 21.5.4 xls和xla文件中的工作表和图表工作表 496 21.5.5 在加载宏中访问vba过程 497 21.6 用vba处理加载宏 499 21.6.1 理解addins 集合 499 21.6.2 addins对象属性 500 21.6.3 addins对象事件 503 21.7 优化加载宏的性能 503 21.7.1 最大化加载宏中的代码执行速度 503 21.7.2 控制加载宏的文件大小 504 21.8 加载宏存在的特殊问题 505 21.8.1 确保安装了加载宏 505 21.8.2 从加载宏中引用其他的文件 506 21.8.3 为加载宏检测使用的excel版本是否正确 506 第6部分 开发应用程序 507 第22章 创建自定义工具栏 508 22.1 关于命令栏 508 22.2 工具栏的处理 508 22.3 excel如何处理工具栏 509 22.3.1 保存工具栏 509 22.3.2 当工具栏不能正常运行时 510 22.4 手动处理工具栏和按钮 510 22.4.1 关于命令栏自定义模式 510 22.4.2 发布自定义工具栏 513 22.5 处理commandbars集合 515 22.5.1 命令栏类型 515 22.5.2 列出所有命令栏对象 515 22.5.3 创建命令栏 516 22.5.4 在vba中引用命令栏 517 22.5.5 使用vba删除命令栏 517 22.5.6 命令栏的属性 518 22.5.7 引用命令栏中的控件 522 22.5.8 列出命令栏中的控件 523 22.5.9 列出所有工具栏上的所有控件 523 22.5.10 给命令栏添加控件 525 22.5.11 从命令栏中删除控件 525 22.5.12 命令栏控件的属性 525 第23章 创建自定义菜单 534 23.1 关于excel的菜单栏 534 23.2 使用excel的菜单可以完成哪些任务 534 23.2.1 从专业术语角度理解excel的菜单 535 23.2.2 删除excel菜单元素 536 23.2.3 添加excel菜单元素 536 23.2.4 更改excel菜单元素 536 23.3 使用vba自定义excel菜单 537 23.3.1 列出excel菜单信息 537 23.3.2 往菜单栏添加新的菜单 539 23.3.3 从菜单栏中删除菜单 541 23.3.4 往菜单添加菜单项 541 23.3.5 显示菜单项的快捷键 545 23.3.6 修复重新设置了的菜单 546 23.4 处理事件的菜单程序设计 547 23.4.1 自动添加和删除菜单 547 23.4.2 禁用或者隐藏菜单 548 23.4.3 处理选中的菜单项 549 23.5 创建自定义菜单的简便方法 551 23.6 创建“工作表菜单栏”的替代品 553 23.7 处理快捷菜单 555 23.7.1 往快捷菜单添加菜单项 556 23.7.2 从快捷菜单中删除菜单项 557 23.7.3 禁用快捷菜单项 557 23.7.4 禁用快捷菜单 557 23.7.5 重新设置快捷菜单 558 23.7.6 创建新的快捷菜单 558 第24章 为应用程序提供帮助文档 561 24.1 为应用程序提供帮助 561 24.2 使用excel组件的帮助系统 563 24.2.1 为帮助系统使用单元格组件 563 24.2.2 为帮助系统使用文本框 563 24.2.3 使用工作表显示帮助文本 564 24.2.4 在用户窗体中显示帮助 565 24.2.5 使用“office 助手”显示帮助 567 24.3 在用户窗体中模拟“这是什么?”帮助 569 24.4 使用html help系统 570 24.5 将帮助文件与应用程序关联起来 571 24.6 将帮助主题与某个vba函数关联起来 572 24.7 显示html help文件的其他方法 573 24.7.1 使用help方法 573 24.7.2 从消息框中显示帮助 573 24.7.3 从输入框中显示帮助 574 第25章 开发面向用户的应用程序 575 25.1 什么是面向用户的应用程序 575 25.2 loan amortization wizard 575 25.2.1 使用loan amortization wizard应用程序 575 25.2.2 loan amortization wizard的工作簿结构 577 25.2.3 loan amortization wizard的运作原理 578 25.2.4 增强loan amortization wizard的潜能 581 25.3 应用程序开发概念 582 第7 部分 其他主题 583 第26章 兼容性问题 584 26.1 什么是兼容性 584 26.2 兼容性问题的种类 585 26.3 excel支持的文件格式 585 26.4 避免使用新特性 586 26.5 能够在mac机器上运行吗 587 26.6 创建国际通用的应用程序 588 26.6.1 多语种应用程序 589 26.6.2 vba语言考虑事项 590 26.6.3 使用本地属性 590 26.6.4 识别系统设置 590 26.6.5 日期和时间设置 592 第27章 用vba处理文件 593 27.1 执行常见的文件操作 593 27.1.1 使用vba的有关文件的命令 593 27.1.2 使用filesearch对象 595 27.1.3 使用filesystemobject对象 597 27.1.4 定位包含特定文本的文件 599 27.2 处理文本文件 599 27.2.1 打开文本文件 600 27.2.2 读文本文件 601 27.2.3 写文本文件 601 27.2.4 获得文件编号 601 27.2.5 确定或者设置文件的位置 601 27.2.6 读写文本文件的语句 602 27.3 文本文件处理示例 602 27.3.1 将数据导入到文本文件中 602 27.3.2 将单元格区域导出到文本文件 603 27.3.3 将文本文件的内容导入到单元格区域中 604 27.3.4 记录excel日志的用法 605 27.3.5 筛选文本文件 606 27.3.6 导入多于256列的数据 606 27.3.7 导出单元格区域到html格式的文件 608 27.3.8 导出单元格区域到xml格式的文件 610 第28章 处理vb组件 613 28.1 ide概述 613 28.2 ide对象模型 614 28.3 显示vba工程中的所有组件 617 28.4 对模块进行更改 618 28.5 使用vba来编写vba代码 620 28.6 在设计时往用户窗体上添加控件 621 28.6.1 设计时与运行时对用户窗体处理的比较 622 28.6.2 在设计时添加100个命令按钮 623 28.7 通过编程创建用户窗体 624 28.7.1 简单的运行时用户窗体的示例 624 28.7.2 有用的动态用户窗体示例 626 第29章 理解类模块 631 29.1 什么是类模块 631 29.2 创建numlock 类 632 29.2.1 插入类模块 632 29.2.2 添加vba代码到类模块中 632 29.2.3 使用numlock 类 635 29.3 更多有关类模块的信息 636 29.3.1 命名对象类 636 29.3.2 对对象的属性进行编程 636 29.3.3 对对象的方法进行编程 637 29.3.4 类模块事件 638 29.4 一个csv文件类 638 29.4.1 csvfileclass类模块的类模块级别的变量 638 29.4.2 csvfileclass 类模块的属性过程 639 29.4.3 csvfileclass 类模块的方法过程 639 29.4.4 使用csvfileclass对象 641 第30章 有关excel编程的常见问题 643 30.1 一般的excel问题 643 30.1.1 为什么excel有两种宏语言 643 30.1.2 需要发布工作簿给仍然使用excel 4的某些人,有办法将动作录制到某个xlm宏中吗 643 30.1.3 在excel 97以及更高的版本中还能运行为更早的excel版本而编写的xlm宏吗 643 30.1.4 能够找到将excel 4宏转换为vba宏的第三方实用程序吗 643 30.1.5 能够从excel 4.0 xlm 宏调用vba过程吗 643 30.1.6 能够自动将lotus 1-2-3或者quattro pro宏转换为vba宏吗 644 30.1.7 在哪里可以找到vba代码的示例 644 30.1.8 有将excel应用程序转换成独立的exe文件的实用程序吗 644 30.1.9 如何在单元格中添加一个下拉列表,使得用户可以从这个列表中选择某个值 644 30.1.10 如果列表存储在活动工作簿中的另一个工作表内,还可以使用这种下拉列表方法吗 644 30.1.11 使用application.calculation将计算模式设置为手动。然而,这看来会影响所有的工作簿而不仅仅是活动工作簿 644 30.1.12 如何才能增加工作表中的列数 644 30.1.13 如何才能增加工作表中的行数 645 30.1.14 能改变工作表标签的颜色吗 645 30.1.15 能改变工作表标签的字体吗 645 30.1.16 能够改变单元格批注的默认字体和颜色吗 645 30.1.17 能够在excel中播放声音吗 645 30.1.18 当打开工作簿时,excel询问是否要更新链接,搜索了所有的公式之后,在这个工作簿中都找不到任何链接,这是bug吗 645 30.1.19 每次启动excel都崩溃 645 30.1.20 在页眉如何打印出工作簿的完整路径和文件名 646 30.2 有关visual basic 编辑器的问题 646 30.2.1 在excel 95中,vba模块还在工作簿中。当从excel 97或者更高的版本中打开这个文件时,却看不到这些vba模块了 646 30.2.2 能够使用vba宏录制器录制所有的宏吗 646 30.2.3 excel 95具有“在标记处录制”特性,利用该特性可以从现有宏中的某个特殊位置开始录制宏。这个特性仍然有用吗 646 30.2.4 有一些宏比较通用,想让它们在任何时候都能够用,最好采用哪种办法 647 30.2.5 找不到“个人宏工作簿”,它在哪里 647 30.2.6 用密码锁定了vba工程,但是却忘记了命名。有什么办法可以解除锁定 647 30.2.7 如何编写宏来更改工程的密码 647 30.2.8 当插入新的模块时,总是从option explicit 代码行开始。这是为什么 647 30.2.9 为什么vba代码以不同的颜色显示?能改变这些颜色吗 647 30.2.10 能用vba代码删除vba模块吗 647 30.2.11 在excel 2000中编写了一个宏,这个宏往vb工程中添加一些vba代码。当在excel 2003中运行这个宏的时候,就会得到一条消息。这是怎么回事 648 30.2.12 如何编写宏来更改用户的宏安全性设置?希望在打开编写的应用程序时避免出现“工作簿中包含宏”消息 648 30.2.13 当打开工作簿时,得到标准的宏警告消息。可是,删除了这个工作簿中包含的所有宏。这是病毒吗 648 30.2.14 不理解保护工作表时userinterfaceonly 选项的运作原理 648 30.2.15 如何辨别工作簿是否含有宏病毒 648 30.2.16 在vba中使用符号(&)时遇到麻烦。当要连接两个字符串时,就会得到错误消息 648 30.2.17 vba换行连续字符(下划线)不起作用 648 30.2.18 删除大量的vba代码之后,发现xls文件的大小并没有相应缩减,为什么 649 30.2.19 给很多用户发布一个xls应用程序。在某些机器上,其中的vba错误处理过程不起作用。为什么 649 30.3 过程 649 30.3.1 vba过程和宏之间有什么区别 649 30.3.2 什么是过程 649 30.3.3 什么是variant 数据类型 649 30.3.4 variant 数组和variant元素构成的数组之间有什么区别 649 30.3.5 什么是类型定义字符 650 30.3.6 编写了一个vba函数,当从另一个过程调用它时运行得很好。但是当在工作表公式中使用它时却运行不了。这是怎么回事 650 30.3.7 想创建一个根据所键入的数据自动更改单元格格式的过程。例如,如果输入的值大于0,那么单元格的背景颜色就变成红色。这可能做到吗 650 30.3.8 “条件格式”特性很有用,但是更喜欢当在单元格中输入数据时执行其他类型的操作 650 30.3.9 可以监视其他类型的事件吗 650 30.3.10 试着输入了一个事件过程(sub workbook_open),但是当打开工作簿时却没有执行这个过程。这是为什么 651 30.3.11 可以为某个特殊的工作簿编写事件过程,但是能够为任意打开的工作簿编写事件过程吗 651 30.3.12 对在excel中创建公式非常熟悉。vba也使用了同样的机制和逻辑运算符吗 651 30.3.13 如何在别的工作簿中执行过程 651 30.3.14 使用vba创建了几个自定义函数。想在工作表公式中使用这些函数,但是发现在函数名称前加上工作簿的名称极其不方便。还有别的办法吗 651 30.3.15 希望在每次启动时加载某个特殊的工作簿。还希望自动执行这个工作簿中的某个宏。是不是不大可能做到 652 30.3.16 有一个工作簿使用了workbook_open过程。有没有办法避免当打开这个工作簿时执行这个过程呢 652 30.3.17 vba过程能够访问没有打开的工作簿中的某个单元格的值吗 652 30.3.18 当从vba关闭工作簿时,如何避免显示“保存文件”的提示 652 30.3.19 如何设置才能使得宏每小时运行一次 652 30.3.20 如何防止在宏列表中显示某个宏 652 30.3.21 可以将图表保存为gif文件吗 653 30.3.22 某个vba过程中的变量能在其他的vba过程中使用吗?可以在别的模块中使用另外一个模块中的过程吗?可以在别的工作簿中使用另外一个工作簿中的过程吗 653 30.4 函数 653 30.4.1 创建了一个自定义的工作表函数。当用“插入函数”对话框访问这种函数时,出现“没有帮助信息”。如何才能使得“插入函数”对话框显示关于这个函数的说明呢 653 30.4.2 还能够在“插入函数”对话框中显示出自定义函数的参数帮助信息吗 653 30.4.3 自定义工作表函数出现在“插入函数”对话框的“用户定义”类别中。怎么才能使得自定义的函数出现在别的函数类别中呢 653 30.4.4 如何创建新的函数类别 654 30.4.5 创建了一个将用在工作表公式中的自定义函数。如果用户输入的参数值不合适,怎么才能使得函数返回真正的错误值(#value!) 654 30.4.6 如何强制重算使用了自定义工作表函数的公式 654 30.4.7 能在vba代码中使用excel的内置工作表函数吗 654 30.4.8 excel 95不支持worksheetfunction方法。这意味着编写的excel 2002应用程序不能兼容于excel 95吗 655 30.4.9 在vba代码中能够使用analysis toolpak的函数吗 655 30.4.10 有办法在消息框的文本中强制换行吗 655 30.5 对象、属性、方法和事件 655 30.5.1 不理解对象的概念,有可以使用的excel对象的列表吗 655 30.5.2 有太多属性和方法可以使用。如何从中找出适用于某个特殊对象的方法和属性呢 655 30.5.3 集合的概念是什么?集合是对象吗 656 30.5.4 当在vba代码中引用工作表时,就会得到“下标越界”的错误。没有使用任何下标,怎么会出现这种错误呢 656 30.5.5 如何避免用户的鼠标指针滚动到工作表的外部 656 30.5.6 select和application.goto之间有什么区别 656 30.5.7 激活单元格区域和选中单元格区域之间有什么区别 656 30.5.8 有没有快速办法可以删除工作表的所有值,但是保持公式原封不动 657 30.5.9 知道如何编写vba指令通过使用单元格地址来选中某个单元格区域,但是如果只知道单元格区域的行号和列号,又该如何编写vba指令来选中单元格区域呢 657 30.5.10 有退出excel的vba命令吗?当试着录制“文件”“退出”命令时,还没有看到它生成的代码excel就关闭了 657 30.5.11 怎么关闭运行宏时的屏幕更新动作 657 30.5.12 在vba中创建单元格区域名称的最简单的方法是什么 657 30.5.13 如何确定某个特殊的单元格或者单元格区域是否有名称 657 30.5.14 可以禁用显示在excel的“打印预览”窗口中的“设置”和“页边距”按钮吗 658 30.5.15 宏在运行的时候能够在状态栏中显示消息吗?编写了一个很长代码的宏,如果能在状态栏中显示它的运行进度就好了 658 30.5.16 录制了一个vba宏,它复制某个单元格区域并将其粘贴到别的区域中。这个宏使用了select方法。还有更加有效率的方式进行复制粘贴吗 658 30.5.17 没有找到排序vba数组的方法。只能先把值复制到工作表中,然后再使用range.sort方法吗 658 30.5.18 宏只对选中的单元格起作用,但是如果选中了别的内容(比如图表),则会运行失败。如何能确保选中单元格区域了呢 659 30.5.19 如何确定图表是否处于活动状态 659 30.5.20 vba宏要计算用户选中的行数。当选中不相邻的行时,使用selection.rows.count 不起作用。这是bug吗 659 30.5.21 使用excel创建发票,能生成惟一的发票编号吗 659 30.5.22 想使得某个工作簿一直保持可见,这样别的应用程序窗口就不能隐藏该工作簿了,有这种属性吗 660 30.5.23 如何阻止excel在运行时显示消息?例如,下面将消除宏删除工作表时所出现的消息 660 30.5.24 可以用vba指令选中某一列或者某一行中的最后一项吗?一般而言,可以使用ctrl+shift+下箭头键或者ctrl+shift+右箭头键组合,但是用宏应该怎么办呢? 660 30.5.25 如何确定某个特殊列中的最后一个非空的单元格 660 30.5.26 如果a65536单元格不为空,上述指令就不会起作用 660 30.5.27 vba引用可以变得非常长,特别是在需要通过引用工作表和工作簿使得对对象的引用符合标准时。能缩减这种引用的长度吗 661 30.5.28 如果不知道数组包含多少元素,可以声明数组吗 661 30.5.29 能允许用户撤销宏吗 661 30.5.30 有一个1-2-3宏能够暂停运行使得用户可以在某个特定的单元格中输入数据。如何在vba宏中获得同样的效果呢 661 30.5.31 vba有一个inputbox函数,但是还有一个application对象的inputbox方法,两者一样吗 661 30.5.32 当使用rgb函数指定颜色后,有时候颜色不对。为什么 662 30.5.33 编写vba指令创建一个公式,如果需要在引号引起来的文本中插入引号("),该怎么办呢 662 30.5.34 创建了一个数组,但是数组中的第1个元素却成了第2个元素。这是为什么 662 30.5.35 希望vba代码运行的速度尽可能快,有什么建议 662 30.6 用户窗体 662 30.6.1 只需要少量的信息,而使用用户窗体似乎有些大材小用,有别的办法吗 663 30.6.2 用户窗体上有12个命令按钮。如何指定当单击其中任意一个按钮时执行某一个宏 663 30.6.3 如何在用户窗体中显示图表 663 30.6.4 如何从用户窗体的标题栏上删除“关闭”按钮,不希望用户单击这个按钮来关闭窗体 663 30.6.5 创建了一个用户窗体,其中的控件用controlsource属性链接到了工作表上的单元格。这是最佳的办法吗 663 30.6.6 能为用户窗体创建一个控件数组吗?visual basic可以这么做,但是不知道在excel vba中如何做 663 30.6.7 隐藏用户窗体和卸载用户窗体之间有区别吗 664 30.6.8 做其他事情时如何保持用户窗体的打开状态 664 30.6.9 在编写userform1.show vbmodeless时,excel 97出现一个编译错误。如何在excel 2000以及更高的版本中使得窗体成为无模式的,而同时使其在excel 97中保持模态设置 664 30.6.10 想在执行耗费长时间的过程的同时显示一个进度条,就像在安装软件时看到的那样。该怎么做呢 664 30.6.11 如何使用excel的绘图工具在用户窗体上创建简单的图形 665 30.6.12 如何才能在用户窗体上产生文件及其目录的列表,以便用户可以从这个列表中选择文件呢 665 30.6.13 想把两个字符串连接起来并将它们显示在一个列表框控件中。但是在实现的时候,对不齐这些字符串。怎么才能使得字符串之间具有相等的间距呢 665 30.6.14 想用条目填充列表框或者组合框控件,有没有简单的办法 665 30.6.15 能从vba显示内置的excel对话框吗 665 30.6.16 尝试了上一个问题中描述的方法,但是却收到错误消息。这是为什么 665 30.6.17 每次创建用户窗体时,都要重复添加“确定”按钮和“取消”按钮的步骤。有没有办法可以使得这些控件自动出现呢 665 30.6.18 可以创建不带标题栏的用户窗体吗 666 30.6.19 录制了一个打印文件的vba宏。然而,好像无法在代码中提供文件名。无论怎么试,都会得到希望提供文件名的提示 666 30.6.20 当在用户窗体上单击某个按钮时,没有任何反应。哪里做错了 666 30.6.21 不管视频显示器的分辨率是多少,能创建大小一样的用户窗体吗 666 30.6.22 可以创建用户窗体使得用户能够通过指示选中工作表的某个单元格区域吗 666 30.6.23 能改变用户窗体的启动位置吗 666 30.6.24 可以往工作簿中添加 excel 5/95对话框工作表吗 666 30.7 加载宏 666 30.7.1 从哪里可以获得excel加载宏 667 30.7.2 如何安装加载宏 667 30.7.3 当从excel的“加载宏”对话框安装加载宏时,加载宏没有名称或者说明。如何给加载宏添加说明呢 667 30.7.4 有一些加载宏不再使用,如何才能从“加载宏”对话框的“可用加载宏”列表中将它们删除呢 667 30.7.5 如何创建加载宏 667 30.7.6 想创建一个加载宏,但是“保存类型”下拉列表中没有提供加载宏方面的选项 667 30.7.7 应该将所有必要的工作簿转换为加载宏吗 667 30.7.8 需要将工作簿保存两个副本(xls版本和xla版本)吗 668 30.7.9 如何在创建加载宏之后对其进行修改呢 668 30.7.10 xls文件与依据xls文件创建的xla文件之间有什么区别?xla版本是编译后的结果吗?xla版本是否运行得更快呢 668 30.7.11 如何保护加载宏的代码,使得别人查看不到它的代码 668 30.7.12 xla加载宏安全吗?换句话说,如果发布了xla文件,能保证没有人能够查看其中的代码吗 668 30.8 命令按钮 668 30.8.1 excel 95拥有一个很方便的菜单编辑器,但是excel 97以及更高的版本中却没有这种菜单编辑器。该怎么办 668 30.8.2 能编辑用excel 95的菜单编辑器创建的菜单吗 668 30.8.3 当用“自定义”对话框更改菜单时,菜单的改变是永久性的。如何才能使得菜单的更改只应用于一个工作簿呢 669 30.8.4 知道可以使用faceld属性给工具栏控件添加图像,但是如何找到对应于某个特殊图像的faceld 值呢 669 30.8.5 往工作簿附加了一个新版的工具栏,但是excel继续使用老式的版本,如何才能使用新版本的工具栏呢 669 30.8.6 已经对excel的工具栏做了大量的修改。如何才能将所有这些工具栏恢复成原来的状态呢 669 30.8.7 如何使得自定义菜单只在某个特殊的工作簿处于活动状态时才显示出来 669 30.8.8 如何在工具栏上的两个按钮之间添加分隔栏 669 30.8.9 如何在菜单项旁边显示选中标记 670 30.8.10 不小心删除了工作表菜单中的某些项,但是找不回来,重新启动excel也不能修复 670 30.8.11 如何禁用所有单击右键出现的快捷菜单 670 30.8.12 能禁用当用户在工具栏上单击鼠标右键出现的工具栏列表吗 670 第8部分 附录 671 附录a excel在线资源 672 附录b vba语句和函数引用 677 附录c vba错误代码 684 附录d 光盘上的内容 687 · · · · · · () |
很有趣的一本书
不一样的观点
精品!强烈推荐!!
语言详实