word表格复制到excel后有回车符的单元格不拆分的办法
在处理办公事务时,经常需要把word中的表格复制粘贴到excel中,不过粘贴后的表格有一点往往让人受不了,就是word表格单元格中有换行的,在excel中这个单元格就会拆分单元格。这在处理清单式表格时往往需要耗费大量的精力和时间,降低办公效率。
如图(示例资料来自于网络,点击图片放大看):
通过vba的方式,可以很好的解决这个问题。
使用方法
1.启动宏菜单。 在word中启动宏菜单:文件——选项——自定义功能区,开发工具打钩。
2.打开VBE(Visual Basic Editor)编辑器。 打开要粘贴到excel的word文档,按alt+f11,打开VBE(Visual Basic Editor)编辑器
3.引用excel程序。 点击菜单栏的工具——引用,右边点击浏览,点击调用excel程序,一般64位的在%ProgramFiles%/Microsoft Office [1] 下面,32位的在%ProgramFiles(x86)%/Microsoft Office下,选择office+数字的文件夹(比如office2013是“office15”)。注意在对话框中选择(*.exe)的文件类型。(点击图片放大看)
4.复制如下代码。 左边工程栏目,在normal下面,点击“thisDocument”,弹出代码窗口,粘贴以下代码,并保存( 注意,该代码目前默认文档中仅且只有一个表格 )。退出VBE。
Sub word表格复制到excel单元格不拆分()
ActiveDocument.Tables(1).Select '当前打开的word文档,选择它的第一个表,程序目前只能处理一个表
Selection.Copy '拷贝当前文档中选中的这个表的所有内容(包括图片)
Selection.MoveRight 1, 1 '将选定内容向右移动,作为取消选定用
'ActiveDocument.Close '可以不用,关掉当前的word
Dim wordApp As Word.Application '将wordApp变量定义为Word.Application类型,
Set wordApp = New Word.Application 'Application 对象代表 Microsoft Word 应用程序,新建一个word应用程序,名字叫做wordApp,
With wordApp
.Visible = False '这个wordApp应用程序不可见。
.Application.StatusBar = "正在创建word。。。" '如果这个wordApp应用程序可见,那么在它的状态栏中会出现’正在创建word‘字样,似乎从2010起已不再支持此属性。
.Documents.Add '根据 Normal 模板新建一篇文档,返回一个 Document 对象
.ActiveDocument.Paragraphs(1).Range.Paste '新建文档处于活动状态,range代表首段的全部内容,已选定,并粘贴刚才的复制的表格。
End With
With wordApp.ActiveDocument.Content.Find '这里不能缺省wordApp,否则会报错,代表的意思是开始查找。
.Forward = False '不要只向前搜索,也可以搜索完后回头搜索
.Wrap = wdFindContinue '到达文档末尾时,继续从文档开头进行搜索。
.Text = Chr(13) '搜索回车符,这个是关键,正是因为回车符在excel复制后会变新的单元格,所以我们要找到它。
.Replacement.Text = "い" '替换成一个不常用的字符。
.Execute Replace:=wdReplaceAll '执行时全部都要替换
wordApp.ActiveDocument.Tables(1).Select '替换后选择这个表格。wordApp.ActiveDocument.不能省略。
End With
wordApp.ActiveDocument.ActiveWindow.Selection.Copy '拷贝这个替换后表格的内容。这里注意,wordApp.ActiveDocument.ActiveWindow中一定要加一个ActiveWindow,代表活动窗口,有Selection属性
'以下是在word中创建一个excel表格,需要用到CreateObject("Excel.Application"),还需要用add方法新建一个工作簿 叫excelWB
Dim excelApp
Dim excelWB As Object
Dim savePath
Dim saveName As String
Set excelApp = CreateObject("Excel.Application")
Set excelWB = excelApp.Workbooks.Add
'选择A1单元格,粘贴刚才从word中复制的内容
excelWB.Worksheets("Sheet1").Range("A1").Select
excelWB.Worksheets("Sheet1").Paste
'定义整数型,获得当前复制的表格的列宽数
Dim a As Integer
Dim b As Integer
a = excelWB.Worksheets("Sheet1").UsedRange.Rows.Count
b = excelWB.Worksheets("Sheet1").UsedRange.Columns.Count
'测试的时候用,不要了
'MsgBox "表格的行有" & a & "行,列有" & b & "列。"
'MsgBox "当前活动的工作簿" & excelWB.ActiveWorkbook.Name
'MsgBox "当前活动的工作表" & excelWB.ActiveSheet.Name
'下面这一行比较复杂,主要是指引用这块,excel工作簿(excelwb,这里不需要到应用这个层面,比word要好,应该只有一个应用吧,而且wordapp是没有定义下面的document变量的).所选的区域,里面的cell也需要完整引用。选择这块有内容区域
excelWB.Worksheets("Sheet1").Range(excelWB.Worksheets("Sheet1").Cells(1, 1), excelWB.Worksheets("Sheet1").Cells(a, b)).Select
'开始遍历每一个单元格,一旦发现值是之前word里面的那个"い",就把"い"给替换掉,替换成Chr(10),这个是excel专有的换行符。InStr是找字符串,如果找的到就返回其在原字符串中的位置,否则就返回0
For Each c In excelWB.Worksheets("Sheet1").Range(excelWB.Worksheets("Sheet1").Cells(1, 1), excelWB.Worksheets("Sheet1").Cells(a, b))
If InStr(c.Value, "い") > 0 Then
c.Value = Replace(c.Value, "い", Chr(10))
End If
'不断提醒用户保存文件,直到用户键入文件名为止。
FName = excelApp.GetSaveAsFilename(fileFilter:="Excel Files (*.xlsx), *.xlsx", Title:="请输入转换后要保存的Excel文件名。。。")
Loop Until FName <> False