WORD程序转EXCEL并处理数据

项目意义,通过将WORD中的信息处理为有序的EXCEL信息,进而与其他数据进行比对,实现大数据对比功能

项目目的

  • WORD信息有序提取到EXCEL;
  • 通过数据处理后的EXCEL与其他EXCEL信息进行交叉比对

开发日志2020-09-01(批处理)

WORD先另存为TXT,然后用批处理来处理TXT文本数据

  • 发现问题,WORD转成TXT后,换行符无法在DOS中识别,造成读取异常。
  • 用find或findstr只能显示找到的字符串及行号
  • 语法错误记录
    • 在循环中变量刷新要用感叹号而不是百分号:!var!
      且要设置setlocal enabledelayedexpansion
    • 变量赋值要使用SET VAR=XXX,而不是VAR=XXX
    • 字符串联合应用 SET str3=!str1!!str2!,而不是&

坑1:变量%VAR%在翻译的时候,如果有空格,会自带"",所以不用另外加,否则会出现两个""
坑2:FOR 中,需要加上usebackq 指令,以防止%filename%文件名中有空格,导致翻译时自带引号后,误将文件名称当成字符串。(如"12 3.txt",若不加usebackq,会被当成字符串处理)
主要代码:


FOR /F "usebackq eol=  tokens=1* delims=。" %%i in (%filename%) do (
	rem echo %%i>>%filename%.y
	set str_temp=%%i
	echo 当前指令:!str_temp!
	for /f "tokens=1" %%j in ("!str_temp!") do (
		rem echo %%j
		if !str1!=="" (
			if %%j==?  (
				set str1= !str_temp!
				rem call :debug
			)
		)else (
			rem echo **********str1==!str1!
			rem call :debug
			if %%j==? (
				rem call :debug
				echo !str1!>>%filename%.y
				set str1= !str_temp!
			)else (
				set str1=!str1! !str_temp!
			)
		)
	)
)	

开发日志V1.2.1 2020-09-05

业务流程分以下几步:

  1. 将WORD程序导出为TXT文件(相对路径为WORDPATH\TXT) 2. TXT文件转换为EXECL文件
    1. 将TXT文件按指令行提取生成新文件(相对路径为WORDPATH\TXT\TXT2)
    2. 将TXT2中的文本导入EXCEL文件,并自动分离出ECS码和位置信息(相对路径为WORDPATH\导出EXCEL文件)
  2. 向EXCEL文件中添加SAP数据比对功能,生成自动对比后的EXCEL文件(相对路径为WORDPATH\导出EXCEL文件\自动比对后)

用户仅需顺次点击每个步骤对应的按钮,即可完成相应功能

当前版主要的问题

  • 第三步时,由于SAP数据量大,容易造成假死,进度条无法正常显示
  • 第三步,好像无法通过下列命令关闭 VBA输入Vlookup公式后的自动计算,导致卡
    Application.Calculation = xlCalculationManual
    Application.CalculateBeforeSave = False

当前版次要的问题

  • 没有做一键三联功能(好实现,如果启动一键,设置全局参数OneKeyStart as Boolean,在弹出MSGBOX前加判断,如果OneKeyStart =true, 则调用下一个功能,不弹对话框)
  • 步骤2,3是对指定文件夹下所有文件进行处理,反复运行时,或用户部分选择WORD程序更新时,原有文件会重复处理,或造成保存时提示冲突。可增加清理对应文件夹文件的按钮。后续可实现通过记录步骤1中的选择文件名称进行步骤2,3的继续处理,而不是通过文件系统遍历实现
  • 第3步添加公式用的是formula,不够简洁,可改用formuR1C1格式

技术小结2020-09-05

  1. 窗体操作
    1. 自定义进度条
      添加用户窗体,用累加器记录文件处理的进度,以百分数方式展示;
      进度条窗体模式必须是非独占的
    2. 窗体的显示模式
      UserForm1.Show(0) 非独占模式,允许后台代码自动运行
      UserForm1.Show(1) 独占模式,必须等窗体关闭或隐藏后才执行后续代码
      在设计窗体时,也可手动更改ShowModal属性实现
  2. 文件操作
    1. 手动获取文件列表
    FileSets = Application.GetOpenFilename _
    (filefilter:="Doc文件,*.doc", Title:="选择Doc文件", MultiSelect:=True)
    
    1. For EACH 循环实现文件遍历操作
    For Each FileName In FileSets
    	code
    Next FileName
    
  1. 用VBA打开WORD,并保存
    首先要在引用中选择Microsoft Word XX Object Library
    引用WORD LIB
Dim WordApp As Word.Application
Set WordApp = New Word.Application
Dim WordD As Word.Document
'Set WordD = WordApp.Documents.Add
Set WordD = WordApp.Documents.Open(FileName)
'另存后关闭文档,退出WORD应用
WordD.SaveAs2 FileName:=需要的文件名称 ‘其他参数略
WordD.Close
WordApp.Quit
  1. 用VBA打开EXCEL,并保存
Workbooks.Add ‘新建工作簿
ActiveWorkbook.Worksheets.Add ‘新建工作表
Workbooks.Open
ActiveWorkbook.SaveAs FileName:=”name”, FileFormat:= xlOpenXMLWorkbook
ActiveWorkbook.Close
  1. 文件遍历
'======获取EXCEL文件列表=======
Dim FileSets() As String  ‘动态数组用于包含查找到的文件名
arr = Dir(Range("EXCELPATH").Value & "*.xlsx") 'Dir()找到的第一个文件给arr
ReDim Preserve FileSets(1)  '动态数组非清空preserve,改变长度
If arr<>"" then FileSets(0) = arr '找到的第一个文件名称赋值给FileSets()第一个元素
i = 1
Do Until arr = ""
    arr = Dir  '重复执行该命令会顺序将DIR的结果输出到arr
    If arr = "" Then Exit Do 'arr为空时说明dir输出结束
    ReDim Preserve FileSets(i) 'arr非空时FileSets()个数更新
    FileSets(i) = arr
    i = i + 1
Loop
  1. 判断文件是否存在 (Err.Number = 9 表示文件已存在)
ChDir ThisWorkbook.Path
On Error Resume Next
Set WB1 = Workbooks(DATABASE)
If Err.Number = 9 Then  '如果DATABSE文件已经打开,则不二次打开
    Workbooks.Open DATABASE
End If
  1. EXCEL VBA交互
  1. 判断某列的最后一行
Dim EndR1, EndR2 As Integer
EndR1 = Range("A1048576").End(xlUp).Row  
EndR2 = Range("A1").End(xlDown).Row  
'2003版本最大行是65536,2007版本是1048576

可以看出EndR1和EndR2的区别,当列中有空格时,EndR1只能判断第一个空格以上的行数,EndR2可以判断整列最后一个非空单元格的行号
VBA获取最后一个非空行

  1. 向单元格写入公式
    例如,向当前工作簿的C列写如VlookUP查找DataBase.xlsx中data页面A:H列
For i=1 to 100
	Range(“C1”).offset(i-1,0).FormulaR1C1 = _ 
"=VLOOKUP(RC[1],[DataBase]data!C[-2]:C[5],2,FALSE)"
Next i
  1. 停止页面刷新和自动计算
Application.ScreenUpdating = False  ‘停止页面刷新
Application.Calculation = xlCalculationManual  ‘手动计算
Application.CalculateBeforeSave = False ‘保存时更新计算,即使关闭,再打开时仍会计算刷新
  1. 多文件操作时,路径设置问题
Chdir(“D:\1\”)
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐