目录

示例

实现代码

ListObject对象

ListObject对象的表示方法

1.序号表示法

2.名称表示法

ListColumn对象

向ListObject中添加新数据

使用VBA添加ListObject对象

Excel中数据存储的结构

(1)用输入界面的表格或者汇总形式的表格直接代替数据库存储。

(2)使用多维表(交叉表)记录数据。


示例

如图所示,该表为某公司供应商信息录入表以及供应商数据表。现希望在“数据输入”表中输入各个数据,然后添加至“数据表”中,如何用VBA完成?

实现代码

将单元格区域转换为ListObject对象,然后利用该对象进行输入。

激活表“数据”并选中数据表中数据区域的任意单元格,按组合键【CtrI+L]创建列表(ListObject),如图所示。

Option ExplicitDim rngFind As Range            '存放查找的起始单元格Sub 跨表录入数据()Dim lastRow As Long         '数据表中的数据行Dim lstData As ListObject   '数据表中的ListObject对象Dim rngTitle As Range       '单元格对象,用于遍历输入表中的标题'设置ListObject对象变量Set lstData = Sheets("数据").ListObjects(1)'获取当前数据的最后一行(数据表中除标题行外,至少要有一行数据,否则出错)lastRow = lstData.DataBodyRange.Rows.Count'遍历数据录入表中的各个标题For Each rngTitle In Union(Sheets("sheet1").Range("A4:A10"), Sheets("sheet1").Range("C7:C10"))'将数据录入表中标题之右的单元格(即录入数据单元格)的值赋值给数据表中相应的列lstData.ListColumns(rngTitle.Value).DataBodyRange(lastRow).Offset(1, 0).Value _= rngTitle.Offset(0, 1).ValueNext
End Sub

ListObject对象

ListObject是存放于工作表中的一个列表对象,它是Excel在工作表中开辟出的一个特殊的区域,用以存放结构化的数据。这个区域由标题行和数据区域组成,数据的每一行称为一条记录,其每一列称为字段,用以存放相同属性的数据。使用ListObject对象存储数据可以方便地被其他软件调用,也可以使用ListObject对象引用其他数据库的数据,因而在Office编程中,开发者常常使用ListObject对象存储数据。

ListObject对象的表示方法

ListObject对象是一个特殊的单元格区域,因而其必须依赖于工作表(Worksheet)而存在。换言之,ListObject对象和Worksheet对象是子对象和父对象的关系。在Worksheet对象中,以ListObjects属性表示所有的ListObject集合对象(ListObjects)。ListObject
对象可以采用以下表示方式。

1.序号表示法

序号表示法是以ListObject在工作表中创建的先后顺序来表示的,其语法如下:

Worksheet.ListObjects(indexNo)

该表达式将返回一个ListObject对象。其中,Worksheet为指定的工作表对象。参数indexNo表示ListObject的序号,该序号从1开始,最大值为工作表中ListObject的数量。

2.名称表示法

本方法以ListObject的名称来表示ListObject对象,其语法如下:

Worksheet.ListObjects(name)

该表达式将返回一个ListObject对象。其中,参数name为ListObject对象的名称。该对象常用的属性如表所示。

ListObject对象常用的基本属性

属  性

说  明

Name

ListObject的名称

Querytable

当ListObject为外部查询时,与查询相关的QueryTable对象

HeaderRowRange

标题行单元格区域对象

DataBodyRange

数据区域单元格对象

TotalsRowRange

汇总行单元格区域对象。当ShowTotals属性为True时有效

ListColumns

列的集合。可以用阻下两种方法访问每一列的ListColumn对象:

ListColumns(IndexNo)

ListColumns(FieldName)

其中,IndexNo为列的顺序号,从第1列为1开始编号。 FieldName为该列的字段名称(标题行名称)

ListRows

行的集合

ShowAutoFilter

是否显示筛选箭头。True为显示,False不显示

ShowHeaders

是否显示标题行。True为显示,False不显示

ShowTotaLs

是否显示汇总行。True为显示,False不显示

ListColumn对象

ListColumn对象表示ListObject中的某一列。ListObject允许开发者利用ListColumn对象对某一列进行操作,其常用属性见表。

ListColumn对象常用的基本属性

属  性

说  明

Nmne

字段名称(标题行名称)

Index

列序号

DataBodyRange

数据单元格区域对象

TotalsCalculation

汇总列的类型,可阻为以下任意常虽

xlTotalsCalculationAverage平均值

xlTotalsCalculationCount非空行的计数

xlTotalsCalculationCountNums数字计数

xlTolalsCalculatiouCustom自定义公式;当为此设置时需要在汇总单元格中设置公式

xlTotalsCalculationMax最大值

xlTotalsCalculationMin最小值

xlTotalsCalculatlonNone无汇总

xlTotalsCalculatlonStdDev标准差

xlTotalsCalculatlonSum求和

xLTotalsCalculationVar方差

向ListObject中添加新数据

当需要向ListObject中添加新数据时,应将汇总行隐藏,然后找到数据行的最后一行,其下一行即为新数据所在的行。当在数据行的下一行写入内容之后,ListObject会自动扩大并把新的行纳入ListObject数据区域的范围之内。
    由于可以使用ListColumns属性通过字段名称找到所要添加数据所在的列,因而开发者可以不必关心某个属性的数据究竟处于哪一列,而只需使用其字段名称即可。本例正是利用此功能,直接以字段名称(标题行名称)来访问某一列。结合上述找到新数据行的方法,首先声明一个变量LastRow,表示当前数据总共的行数,变量FieldName表示字段的名称。因而当前某列最后一个单元格可以表示为

ListColumns(FieldName).DataBodyRange(LastRow)

其下一行单元格可以表示为

ListColumns(FieldName).DataBodyRange(LastRow).Offset(1, 0)

本例中,在数据录入工作表中所有字段的名称与数据存储表中的字段名称一致,在数据录入表中,所有的数据在标题向右偏移一列的位置(如图4-10所示)。因而采用遍历所有标题的方式,同时找到待录入的数据以及数据存储表存放该数据所在的单元格,从而实现跨工作表赋值。

使用VBA添加ListObject对象

当需要添加ListObject对象时,可以使用ListOjects集合的Add方法进行添加,其语法为

Worksheet.ListOjects.Add(SourceType,Source,LinkSource,XlListObjectHasHeaders,Destination)

该方法可以返回一个ListObject对象。其中,Worksheet为一个工作表对象,表示ListObject所在的工作表。参数SourceType为ListObject数据源的类型,可以为表中的任意常量。

ListObjects.Add方法的SourceType参数

常    量

说  明

xlSrcExternal

0

外部数据

xlSrcRange

1

单元格

xlSrcXml

2

XML

xlSrcQuery

3

查询

  • 参数Source表示数据源,可以为单元格对象(SourceType为xISrcRange时)或者是一个连接字符串的数组(SourceType为 xISrcExternal时) 。
  • 参数LinkSource为一个逻辑值,表示是否连接源,只有在SourceType为 xISrcExternal时有效。True表不连接到数据源,False表示不连接数据源。
  • 参数xlistObjectHasHeaders表示源数据是否含有标题行,可以为xIGuess(由Excel决定是否有标题)、xIYes(含有标题)、xINo(不含有标题)。
  • 参数Destination为单元格对象,表示ListObject创建在哪个单元格。当 SourceType为xISrcExternal时,必须指定单元格,而当SourceType为xISrcRange时,则必须省略该参数。

本例需要创建的是一个以单元格区域为数据源的ListObject对象,因而其SourceType为xISrcRange,Source可以指定其标题行,即Range(”A1:M1”),XIListObjectHasHeaders为xIYes。因而其语句为

Sheet2.ListObjects.Add SourceType:=xlSrcRange,Source:=Range("A1:M1"),xlListObj ectHasHeaders:=xlYes

Excel中数据存储的结构

本例使用了ListObject对象存放数据,其目的是为了方便其他软件调用,对于程序的灵活性也有着积极的意义。诸如此类第1行为标题行,数据连续存储的格式是Excel中常用的数据存储方式。该数据存储方式的特点如下。

  • 同一行内存储的数据是具有内在联系的,而不同行的数据是相对独立的。如图4-11所示的数据,其同一行内的数据都表示一个员工,各个数据都表示同一个员工的属性,具有内在联系;而不同行的数据表示不同的员工,是相对独立的。
  • 同一列内存储的数据具有相同的属性,而不同列的数据是相对独立的。如图所示的数据,同一列的数据,其属性是相同的,如姓名列里存放的都是姓名;而不同列的数据是相对独立的,如姓名、性别和年龄分别为3个完全不同的属性,其值不能相互通用。

在设计Excel程序之前,必须对存放的数据结构进行设计,其设计规则应尽量符合上述两条规则,切忌有以下几种情形。

(1)用输入界面的表格或者汇总形式的表格直接代替数据库存储。

如图所示,虽然此种表格在一定程度上具备友好的用户界面,但如此的数据存储由于数据位置的不确定,若需要执行查询或汇总时,将会造成代码编写困难。如此的数据存储往往会将一句语句就能够完成的任务变成一个耗时一整天的庞大工程。

若由于特殊情况需要采取此种方式进行记录,应将数据进行分拆:每个班组每天使用一张表格记录数据,并保证所有数据所在的位置相同。如此才能够找出其中的规律进行批量处理。

(2)使用多维表(交叉表)记录数据。

如图所示,该表是一个使用多维表(交叉表)记录的数据示例。所谓多维表,就是将具有相同属性的数据作为字段来使用,使得数据产生大量冗余,造成数据处理的不便。

该表将各个型号作为字段使用,并且不同员工的数据存储在不同的表中。当需要进行汇总时,会造成许多不便。另一种情况是当数据批量修改时,将会是初学者的梦魇。作为推荐的格式,该表应该以如图所示的方式存储。

尽管VBA是非常高效的数据处理手段,然而不规范的数据存储将会造成VBA编程效率低下。因而,养成规范的数据存储的习惯将会使工作效率增倍。

Excel 2010 VBA 入门 063 跨表数据录入相关推荐

  1. Excel 2010 VBA 入门 062 跨表数据查询

    目录 示例 实现代码 跨表操作单元格 连续查找功能 示例 如图所示,该工作簿中建立"数据表"和"数据查询"表分别用于存储客户信息以及客户信息的查询.现希望在数据 ...

  2. Excel 2010 VBA 入门 070 工作表事件之双击鼠标BeforeDoubleClick

    目录 示例 实现代码 工作表双击事件(BeforeDoubleClick) 示例 如图所示,该表为某公司员工工资表.为方便对比,现希望能够通过双击标题行即可对该列数据进行降序排列.该如何用VBA完成? ...

  3. Excel 2010 VBA 入门 072 工作表事件之activate

    目录 示例 实现代码1 工作表(Worksheet)对象的Select方法 实现代码2 附件:显示所有工作表 目录工作表中加入事件 其它工作表中加入事件 实现代码3 工作簿事件 类模块和Me变量 示例 ...

  4. Excel 2010 VBA 入门 034 创建图片批注

    目录 批注(Comment)对象 批注的添加与删除 FiIIFormat对象 OnError语句 示例: 批注(Comment)对象 Comment对象是单元格的一个属性,表示单元格的批注.Comme ...

  5. Excel 2010 VBA 入门 087 数据处理之按单列汇总多个工作表

    示例 如图所示,该工作簿中包含若干个工作表,工作表中为各个学校书籍销售明细.如  何使用VBA按其工作表中的图书名称汇总各种图书的数量? 示例数据表 序号 图书名称 版  别 年版 定价 适读范围 订 ...

  6. Excel 2010 VBA 入门 082 数据处理之对比两个表的数据

    示例: 如图所示,该工作簿中有两个来自不同数据源的材料表,这两个表中的数据可能不同.如何使用VBA比较两张表的编号与数量,并建立一张对照表,分别列出两张表的不同:编号同时存在但数量不同:编号在其中一张 ...

  7. Excel 2010 VBA 入门 036 替换所有的错误值

    目录 Range对象的Find方法 参数省略表示法 查找格式 示例: 实现代码 使用Is Nothing判断对象是否初始化 IsError函数 SpeciaICells方法 Find方法的一般形式 C ...

  8. Excel 2010 VBA 入门 001显示开发工具选项卡

    目录 VBA简介 宏简介 显示"开发工具"选项卡 ​ VBA简介 Visual Basic for Application (VBA)是Visual Basic的一种宏语言,是依附 ...

  9. Excel 2010 VBA 入门 006 设置宏安全性

    目录 操作方法 步骤1单击"开发工具"选项卡中的"宏安全性"按钮,如图所示. ​ 步骤2在"信任中心"的"宏设置"选项中 ...

最新文章

  1. 浅谈Django的中间件与Python的装饰器
  2. 如何利用CSS给同一个网页中的超链接设置设置不同的样式?
  3. Swift - 添加、修改、删除通讯录联系人
  4. 谷歌开源 tf-seq2seq,你也能用谷歌翻译的框架训练模型
  5. .NET中常见的 IL 指令集
  6. java语言怎样判断文件夹_JAVA语言之如何判断文件,判断文件夹是否存在的代码...
  7. 训练日志 2018.12.2
  8. MySQL索引优化分析
  9. Unity3d 新建xml 读取xml
  10. redis 分布式锁流程图
  11. 程序员为什么 365 天背电脑包?这答案我服!
  12. flutter实战1:完成一个有侧边栏的主界面
  13. weblogic 启动 startWebLogic.sh
  14. 学生社团管理系统(Java+Swing+mysql)(超简陋)
  15. ipadpro画流程图_Paper 推出适用于快速制作流程图的 Think 套件
  16. mac系统安装搭载Windows系统虚拟机方法教程
  17. 最简行阶梯矩阵生成器
  18. Improved autoencoder for unsupervised anomaly detection
  19. PotPlayer不支持S/W HEVC(H.265)解码怎么办?一招解决所有的不支持解码
  20. 医院招聘护士 计算机证,医院招聘护士面试自我介绍

热门文章

  1. 4-Arm-PEG-Benzaldehyde,四臂聚乙二醇苯甲醛,4-Arm-PEG-DF
  2. 利用Dynamo自动创建Revit楼板
  3. 如何选择一块真正“好用的、性能高”的远程控制软件
  4. 基因数据处理37之bdg-formats编译成功
  5. 我现在才知道,原来女孩子学大数据更有优势
  6. 北京实行电子保单后外地六年内新车年检分享
  7. 用python爬取伯乐在线的准备
  8. P2183 [国家集训队]【一本通提高组合数学】礼物
  9. R语言计算31省份(除港澳台地区)省会城市的球面距离代码
  10. QTA自动化测试框架(一)