ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3446|回复: 7

VBA中的表格请教

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-9-14 13:07 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
1。我想问,下面两段代码都是添加表格,但是它们有什么区别呢?从效率上说,哪种好呢? Set oTable = oDoc.Tables.Add(Range:=oDoc.Range(Start:=0, End:=0), NumRows:=5, NumColumns:=9) Set oTable = oDoc.Tables.Add(Selection.Range, NumRows:=5, NumColumns:=9)

2。假设打开的文档有三张表,那么如何用VBA代码来将这三张表合为一个表呢?

3。如何在表格中用代码来定义/添加/运行域呢?

请版主和懂VBA的朋友指点和帮助,最好是能给出个例子。在此先谢谢了。

[此贴子已经被作者于2005-9-14 13:09:22编辑过]

TA的精华主题

TA的得分主题

发表于 2005-9-14 16:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

Set oTable = oDoc.Tables.Add(Range:=oDoc.Range(Start:=0, End:=0), NumRows:=5, NumColumns:=9) 比Set oTable = oDoc.Tables.Add(Selection.Range, NumRows:=5, NumColumns:=9) 更好,更方便,关于两者比较请参考我的VBA教程

请参:http://club.excelhome.net/viewthread.php?tid=110721

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-9-14 16:37:49 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '№ 00024^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Option Explicit Sub Example() Dim i As Integer, oTable As Table, myRange As Range With ActiveDocument '全并三个表格 For i = 3 To 2 Step -1 Set myRange = .Range(.Tables(1).Range.End, .Tables(1).Range.End) .Tables(i).Range.Cut myRange.Paste Next End With End Sub '---------------------- Sub Example2() Dim i As Integer, oTable As Table, myRange As Range With ActiveDocument '合并三个表格 For i = 3 To 2 Step -1 Set myRange = .Tables(1).Range myRange.Collapse wdCollapseEnd .Tables(i).Range.Cut myRange.Paste Next End With End Sub '---------------------- Sub Example3() Dim myRange As Range, oCell As Cell With ActiveDocument.Tables(1) '在表格1的单元格最前面插入编号域 For Each oCell In .Range.Cells Set myRange = oCell.Range myRange.Collapse wdCollapseStart ActiveDocument.Fields.Add Range:=myRange, Type:=wdFieldListNum Next End With End Sub '----------------------

运行域,我不太清楚你的意思,请描述一下。

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-9-17 23:30 | 显示全部楼层

我还有点不清楚,比如说我要建两个表,两个表之间是空了一行,如下:

Set oDoc = ActiveDocument Set oRange = oDoc.Range(Start:=0, End:=0)

‘建第一张表

Set oTable1 = oDoc.Tables.Add(Range:=oRange,NumRows:=2, NumColumns:=9) With oTable1

……

End With

’插入一行

Selection.MoveDown Unit:=wdLine, Count:=2

Selection.TypeParagraph

‘建第二张表

Set oTable2 = oDoc.Tables.Add(Selection.Range, NumRows:=20, NumColumns:=9)

以上运行能达到我想要的结果,但根据守柔版主所讲的Range和Selection的区别,我这样改写新建第二张表时的代码:

Set oTable1 = oDoc.Tables.Add(Range:=oRange, NumRows:=2, NumColumns:=9)

结果就是在第一张表的第一个单元格插入新表了,我就想不通,为什么会这样呢?如果说是START指定错了,那又该如何写呢?

还建立新表后,另插入一行,我当时是用的:

Selection.MoveDown Unit:=wdLine, Count:=2

Selection.TypeParagraph

能感觉出来这种方法不是很适用,那如果用Range来表示,该怎么写呢?

[此贴子已经被作者于2005-9-18 0:28:31编辑过]

TA的精华主题

TA的得分主题

发表于 2005-9-18 06:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

请参阅以下三个代码:

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-9-18 6:32:30 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '№ 00027^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Option Explicit Sub Example() Dim oDoc As Document, oRange As Range, oTable1 As Table, oTable2 As Table Set oDoc = ActiveDocument '定义一个文档对象为活动文档 With oDoc '定义一个RANGE对象为活动文档的起点位置 Set oRange = oDoc.Range(Start:=0, End:=0) '建第一张表 Set oTable1 = .Tables.Add(Range:=oRange, numrows:=2, numcolumns:=9) oTable1.Style = "网格型" '网格型样式 '重新定义RANGE对象,为表格的结束位置 Set oRange = .Range(oTable1.Range.End, oTable1.Range.End) '插入一个空白段落 oRange.InsertAfter Chr(13) '折叠到结束点位置 oRange.Collapse wdCollapseEnd '建第二张表 Set oTable2 = oDoc.Tables.Add(Range:=oRange, numrows:=20, numcolumns:=9) oTable2.Style = "网格型" End With End Sub '---------------------- Sub Sample() Dim myTable As Table, myRange As Range With ActiveDocument '定义一个RANGE对象,始终是文档结束标记的前一个位置 Set myRange = .Range(.Content.End - 1, .Content.End - 1) Set myTable = .Tables.Add(Range:=myRange, numrows:=2, numcolumns:=9) myTable.Style = "网格型" '插入一个空白段落 .Content.InsertAfter Chr(13) '再次定义RANGE对象 Set myRange = .Range(.Content.End - 1, .Content.End - 1) Set myTable = .Tables.Add(Range:=myRange, numrows:=20, numcolumns:=9) myTable.Style = "网格型" End With End Sub '---------------------- Sub Example2() Dim myTable As Table, myRange As Range With ActiveDocument Set myRange = .Content '定义一个RANGE对象为主文档部分 myRange.Collapse wdCollapseEnd '折叠到结束位置 Set myTable = .Tables.Add(Range:=myRange, numrows:=2, numcolumns:=9) myTable.Style = "网格型" Set myRange = .Content '重新定义RANGE对象 myRange.InsertAfter Chr(13) '插入空白段落 myRange.Collapse wdCollapseEnd '折叠到结束位置 Set myTable = .Tables.Add(Range:=myRange, numrows:=20, numcolumns:=9) myTable.Style = "网格型" End With End Sub '----------------------

[此贴子已经被作者于2005-9-18 6:33:24编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-9-21 00:13 | 显示全部楼层

守柔版主,我觉得你给出合并三个表的代码好像有点问题,以第二个代码来说明

Sub Example2() Dim i As Integer, oTable As Table, myRange As Range With ActiveDocument '合并三个表格 For i = 3 To 2 Step -1 Set myRange = .Tables(1).Range myRange.Collapse wdCollapseEnd .Tables(i).Range.Cut‘我觉得这行代码像有点问题 myRange.Paste Next End With End Sub 我对这段代码的分析是:通过 myRange.Collapse wdCollapseEnd把光标放在表1之后,然后剪切表2,并粘贴在表1之后,这个时候表1表2就合并为一张表,即表1,但你的.Tables(i).Range.Cut却是在t=3时剪切表3,并粘在表1之后,在t=2时,在我这机子上表现为剪切粘贴没有起作用了。

我自己把.Tables(i).Range.Cut改成.Tables(2).Range.Cut,这样两个表合并成一个表后,就对下一个表即始终是表2进行剪切和粘贴。

不知我的分析是否正确呢?

[此贴子已经被作者于2005-9-21 0:14:46编辑过]

TA的精华主题

TA的得分主题

发表于 2005-9-23 07:19 | 显示全部楼层
以下是引用janeyb在2005-9-21 0:13:06的发言:

守柔版主,我觉得你给出合并三个表的代码好像有点问题,以第二个代码来说明

Sub Example2() Dim i As Integer, oTable As Table, myRange As Range With ActiveDocument '合并三个表格 For i = 3 To 2 Step -1 Set myRange = .Tables(1).Range myRange.Collapse wdCollapseEnd .Tables(i).Range.Cut‘我觉得这行代码像有点问题 myRange.Paste Next End With End Sub 我对这段代码的分析是:通过 myRange.Collapse wdCollapseEnd把光标放在表1之后,然后剪切表2,并粘贴在表1之后,这个时候表1表2就合并为一张表,即表1,但你的.Tables(i).Range.Cut却是在t=3时剪切表3,并粘在表1之后,在t=2时,在我这机子上表现为剪切粘贴没有起作用了。

我自己把.Tables(i).Range.Cut改成.Tables(2).Range.Cut,这样两个表合并成一个表后,就对下一个表即始终是表2进行剪切和粘贴。

不知我的分析是否正确呢?

我非常希望楼主能就代码认真执行并分析,而非分析!

请按下F8进行逐行调试,然后在WORD页面中,查看每行代码执行后的结果!

这段落代码的意思非常简单,就是从最后的表格向前循环,注意STEP为-1,你是如何分析的??

把最后一个表格剪切,在第一个表格的最后位置复制,二个表格自动合并为一个表格;再将最后第二个表格(剪切后是最后一个表格了)剪切,再回到第一个表格的最后位置(此位置已经在第二次循环中刷新了)进行粘贴。

先测试,再发言。有问题,可以交流。

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-9-27 22:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

如何在单元格中用代码来定义公差呢?

问题如图所示:

1.如何用VBA在单元格里编写公差代码,我只知道这只能用域来解决,但我不知在VBA里,如何把域插在单元格的指定位置.

2.表格生成后,在表格最下面,往往有一行,用del也好,还是Backspace也好,总是无法把这一行去掉,如果用VBA来删除,这代码又该怎么写呢?

VBA中的表格请教

VBA中的表格请教

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-9-28 23:58 | 显示全部楼层

回复守柔:

我是测试了,并分析了,才说出上面的话.当然,我在这方面是新手,说得不对的地方,还请多包涵和继续指出,我愿意改正.

我上传了两个文档,其区别就在于 .Tables(i).Range.Cut这段代码里,守柔版主的那段代码虽然把三个表合为了一个表,但将原三个表之间的顺序打乱了,见表1,所以我改为 .Tables(2).Range.Cut,见表2,其意思我在四楼里已表达,在此就不多说了.

GfUCmViK.rar (9.29 KB, 下载次数: 20)

CioBxhho.rar

9.59 KB, 下载次数: 16

VBA中的表格请教

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-15 17:32 , Processed in 0.049939 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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