ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Word 应用与开发] [第8期] 表格行列转置[已完成]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-2-6 06:30 | 显示全部楼层 |阅读模式

要求:

针对WORD中的表格,在不借助于EXCEL的情况下,达到行列转置的结果。

说明:

1. 在WORD解决的框架内,方法不限.

2.前台操作得分要高VBA得分,两者均完成者,得合计分.

示例见附件.

糟糕,漏了一个重要的关键字。应该是不借且于Excel的情况下,本着WORD解决的框架,即不管前台还是后台,均不得调用EXCEL。

------------------------------------------------------

常规操作法:

1. 单击编辑/OFFICE剪贴板,调用OFFICE剪贴板。

2. 将鼠标移至表格首行,呈“↓”状,单击鼠标(注意,此时不要移动鼠标),按下 CTRL+X”。首行被剪切到OFFICE剪贴板。

3. 单击鼠标以选中新的第一列,按下“CTRL+X

4. 重复上述步骤,直至表格所有列被剪切结束。

5. 单击剪贴板上的“全部粘贴按钮”,所有列以一列的形式粘连在一起形成一个表格。

6. 选中表格,以段落标记为文本分隔符,将表格转换为文本。

7. 以段落标记为分隔符转换为11列15行的表格。

VBA编程处理:

Option Explicit
Sub TableTranspose()
'表格行列转置
Dim myTable As Table, myRange As Range, myString As String
Dim myArray() As String, aArray As Variant, CR() As String
Dim RowCount As Integer, ColCount As Integer, R As Integer, C As Integer
Dim Times As Single
Times = VBA.Timer '当前时间数
With Selection '如果光标不位于表格中或者没有选定表格则退出程序
If Not .Information(wdWithInTable) Then MsgBox "Word没有找到光标处的表格,请重新选定表格!", vbExclamation: Exit Sub
Set myTable = .Tables(1) '定义一个表格对象
End With
With myTable
'如果表格有合并的列或者行,提示
If .Uniform = False Then MsgBox "表格中含有合并单元格,Word无法进行正确的行列转置!", vbExclamation: Exit Sub
myString = .Range.Text '取得表格中的文本
ColCount = .Columns.Count '取得表格列数
RowCount = .Rows.Count '取得表格行数
.Delete '删除表格
Set myRange = Selection.Range '取得光标所在位置的RANGE对象
End With
'如果当前表格最大行数超过63,则提示
If RowCount > 63 Then MsgBox "表格的列数超过63,Word无法进行正确的行列转置", vbExclamation: Exit Sub
ReDim CR(1 To ColCount, 1 To RowCount) '声明一个下标为1的(列数*行数)动态二维数组
myArray = VBA.Split(myString, Chr(7)) '以CHR(7)--单元格分隔竖线为分隔符返回一个数组
myString = "" '从内存中初始化变量
C = 1: R = 1 '初始化变量,对应数组下标
For Each aArray In myArray '在数组中循环
If C <= ColCount Then '如果C<=表格列数
CR(C, R) = aArray '向数组赋值
Else
If R = RowCount Then Exit For '如果R=表格行数时退出循环
R = R + 1: C = 0 'R递加,C归零(相当于循环到表格的下一行时,行号增加,列数归零)
End If
C = C + 1 '列数递加
Next
For C = 1 To ColCount '二维数组中建立一个循环,相当于在各值中取值
For R = 1 To RowCount '建立一个循环
myString = myString & CR(C, R) '取得数组值,此处实现转置
Next
Next
myRange.InsertAfter myString '插入文本
'文本转化为表格
Set myTable = myRange.ConvertToTable(Separator:=wdSeparateByParagraphs, NumColumns:=RowCount, NumRows:=ColCount)
myTable.Style = "网格型" '设置表格样式
Debug.Print Timer - Times
End Sub

注意:

WORD中表格循环和单元格中的循环速度是很慢的(相对于EXCEL),把文本写入数组中,在数组中循环要比填接在单元格中循环快得多.另外,先写文本再转表格要比先设计表格,再把文本逐一写到单元格中要快得多.

[此贴子已经被作者于2006-2-27 7:18:49编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

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

word 我不熟 不过看题目 可以用excel帮助 那就比较好做了

1、将word的表格复制粘贴到excel

2、在excel里选择表格 复制-选择性粘贴-转置 得到转置后表格

3、将转置后的表格复制回word 即可


*****************************************************

抱歉,守柔搞错了,下贴继续!

[此贴子已经被守柔于2006-2-25 7:16:47编辑过]

TA的精华主题

TA的得分主题

发表于 2006-2-7 15:55 | 显示全部楼层


*******************************************************

抱歉,守柔搞错了,下贴继续.

另,附件中,我没有看到步骤.

[此贴子已经被守柔于2006-2-25 7:18:46编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2006-2-7 17:51 | 显示全部楼层

选择整个表格——》CTRL+C——》打开EXCEL(空白的)——》CTRL+V——》CTRL+C——》(另选一空白处)右键——》选择性粘贴——》转置——》CTRL+C——》(回到WORD)CTRL+V

*******************************************************

抱歉,守柔搞错了,下贴继续.

[此贴子已经被守柔于2006-2-25 7:19:21编辑过]

TA的精华主题

TA的得分主题

发表于 2006-2-8 08:46 | 显示全部楼层

试答:

第一步:在WORD中复制原表格到EXCEL表中

第二步:在EXCEL中将表格选择性粘贴-转置粘贴成目标表格

第三步:将EXCEL中的目标表格复制粘贴回WORD文档中

*******************************************************

抱歉,守柔搞错了,下贴继续.

[此贴子已经被守柔于2006-2-25 7:19:55编辑过]

TA的精华主题

TA的得分主题

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

可以将Word 文档放到EXCEL中。在EXCEL中复制粘贴,在粘贴时,选择“选择性粘贴”在“选择性粘贴”中的转置画上勾。这样粘贴的就达到效果了。

*******************************************************

抱歉,守柔搞错了,下贴继续.

[此贴子已经被守柔于2006-2-25 7:20:18编辑过]

TA的精华主题

TA的得分主题

发表于 2006-2-8 12:39 | 显示全部楼层

复制表格,打开空白的excel文件,在A1单元格粘贴,复制粘贴的表格,然后选择性粘贴,选中转置,确定。然后复制,粘贴在word文档里,(可能需调整边框),OK。

TA的精华主题

TA的得分主题

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

再答一下,以体现版主“在WORD解决的框架内”的要求:

  在word中插入15行11列的EXCEL表,复制word表格到插入的EXCEL表中,在excel中选中表格,

复制至excel的空白处,并转置粘贴形成目标表格,再将目标表格复制到word的空白处形成纯wor表格

然后删除插入的excel表即可。


*******************************************************

抱歉,守柔搞错了,下贴继续.

[此贴子已经被守柔于2006-2-25 7:20:54编辑过]

TA的精华主题

TA的得分主题

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

用WORD 常规方法还没做,先贴个用VBA的方法

Sub rowTocolumn() 'by sailorgg
Dim TableRows As Integer, TableColumns As Integer
Dim r As Integer, c As Integer
Dim temptext As String
Dim lentext As Byte
Dim Myarry() As Variant
TableRows = Me.Tables(1).Rows.Count
TableColumns = Me.Tables(1).Columns.Count
ReDim Myarry(1 To TableRows, 1 To TableColumns)
For r = 1 To TableRows
For c = 1 To TableColumns
lentext = VBA.Len(Me.Tables(1).Rows(r).Cells(c).Range.Text)
temptext = VBA.Mid(Me.Tables(1).Rows(r).Cells(c).Range.Text, 1, lentext - 2)
Myarry(r, c) = temptext
Next
Next

Selection.EndKey Unit:=wdStory
Selection.TypeText Text:="行列转换后的结果"
'生成表格
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=TableColumns, NumColumns:=TableRows, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
wdAutoFitFixed
'写入表格
For r = 1 To TableRows
For c = 1 To TableColumns
Me.Tables(2).Columns(r).Cells(c).Range.Text = Myarry(r, c)
Next
Next
End Sub

TA的精华主题

TA的得分主题

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

附件是用vba实现的.主要就是把各个cell赋给数组,再把数组反赋给新表的cell

在word框架内实现,就是先插入excel对象(不要插在表格内啊),把表格剪粘进去,在excel对象内,复制,再找一空白处,本题如A30,用选择性粘贴(要选中转置),再把转置后的内容剪切,在word正文部分粘贴,并删除excel对象,也可剪切完成后,先点word正文部分,再左击excel对象,然后再右击excel对象,选中粘贴.

用纯word的操作方法,我怎么也实现不了.至多可以实现这样:这个不是要求的15行,而是只有1行.

字段1

字段2

字段3

字段4

字段5

字段6

字段7

字段8

字段9

字段10

字段11

字段12

字段13

字段14

字段15

数据1

数据2

数据3

数据4

数据5

数据6

数据7

数据8

数据9

数据10

数据11

数据12

数据13

数据14

数据15

数据1

数据2

数据3

数据4

数据5

数据6

数据7

数据8

数据9

数据10

数据11

数据12

数据13

数据14

数据15

数据1

数据2

数据3

数据4

数据5

数据6

数据7

数据8

数据9

数据10

数据11

数据12

数据13

数据14

数据15

数据1

数据2

数据3

数据4

数据5

数据6

数据7

数据8

数据9

数据10

数据11

数据12

数据13

数据14

数据15

数据1

数据2

数据3

数据4

数据5

数据6

数据7

数据8

数据9

数据10

数据11

数据12

数据13

数据14

数据15

数据1

数据2

数据3

数据4

数据5

数据6

数据7

数据8

数据9

数据10

数据11

数据12

数据13

数据14

数据15

数据1

数据2

数据3

数据4

数据5

数据6

数据7

数据8

数据9

数据10

数据11

数据12

数据13

数据14

数据15

数据1

数据2

数据3

数据4

数据5

数据6

数据7

数据8

数据9

数据10

数据11

数据12

数据13

数据14

数据15

数据1

数据2

数据3

数据4

数据5

数据6

数据7

数据8

数据9

数据10

数据11

数据12

数据13

数据14

数据15

数据1

数据2

数据3

数据4

数据5

数据6

数据7

数据8

数据9

数据10

数据11

数据12

数据13

数据14

数据15


************************************************************

shuyee兄的代码:

Sub TransPose()
Dim iR%, jC%, i%, j%, TabTxt As Variant, iW%
With ThisDocument.Tables(1)
iR = .Rows.Count
jC = .Columns.Count
ReDim TabTxt(1 To iR, 1 To jC) As String
For i = 1 To iR
For j = 1 To jC
TabTxt(i, j) = Left(.Cell(i, j).Range.Text, Len(.Cell(i, j).Range.Text) - 2)
Next
Next
iW = .Range.End
ThisDocument.Range(iW, iW).Text = "用vba行列转换后的结果:" & Chr(13) & Chr(10)
ThisDocument.Tables.Add ThisDocument.Range(iW + 14, iW + 14), _
jC, iR
iW = .Columns(1).Width
End With
With ThisDocument.Tables(2)
For j = 1 To jC
For i = 1 To iR
If j = 1 Then .Columns(i).Width = iW
.Cell(j, i).Range.Text = TabTxt(i, j)
Next
Next
.Rows(jC).Range.Font.Italic = True
.Columns(iR).Select
Selection.Font.Italic = True
iW = .Range.Start
End With
ThisDocument.Range(iW, iW).Select
End Sub
很好,把列宽和字体都考虑进去了.

[此贴子已经被守柔于2006-2-25 8:17:16编辑过]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

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

本版积分规则

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

GMT+8, 2024-12-4 01:11 , Processed in 0.059306 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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