VBA+批处理实现WORD转EXCEL数据分析开发日志
·
VBA+批处理实现WORD转EXCEL数据分析开发日志
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!,而不是&
- 在循环中变量刷新要用感叹号而不是百分号:!var!
坑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
业务流程分以下几步:
- 将WORD程序导出为TXT文件(相对路径为WORDPATH\TXT) 2. TXT文件转换为EXECL文件
-
- 将TXT文件按指令行提取生成新文件(相对路径为WORDPATH\TXT\TXT2)
- 将TXT2中的文本导入EXCEL文件,并自动分离出ECS码和位置信息(相对路径为WORDPATH\导出EXCEL文件)
- 向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
- 窗体操作
- 自定义进度条
添加用户窗体,用累加器记录文件处理的进度,以百分数方式展示;
进度条窗体模式必须是非独占的 - 窗体的显示模式
UserForm1.Show(0) 非独占模式,允许后台代码自动运行
UserForm1.Show(1) 独占模式,必须等窗体关闭或隐藏后才执行后续代码
在设计窗体时,也可手动更改ShowModal属性实现
- 自定义进度条
- 文件操作
- 手动获取文件列表
FileSets = Application.GetOpenFilename _ (filefilter:="Doc文件,*.doc", Title:="选择Doc文件", MultiSelect:=True)- For EACH 循环实现文件遍历操作
For Each FileName In FileSets code Next FileName
- 用VBA打开WORD,并保存
首先要在引用中选择Microsoft Word XX Object Library

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
- 用VBA打开EXCEL,并保存
Workbooks.Add ‘新建工作簿
ActiveWorkbook.Worksheets.Add ‘新建工作表
Workbooks.Open
ActiveWorkbook.SaveAs FileName:=”name”, FileFormat:= xlOpenXMLWorkbook
ActiveWorkbook.Close
- 文件遍历
'======获取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
- 判断文件是否存在 (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
- EXCEL VBA交互
- 判断某列的最后一行
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可以判断整列最后一个非空单元格的行号

- 向单元格写入公式
例如,向当前工作簿的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
- 停止页面刷新和自动计算
Application.ScreenUpdating = False ‘停止页面刷新
Application.Calculation = xlCalculationManual ‘手动计算
Application.CalculateBeforeSave = False ‘保存时更新计算,即使关闭,再打开时仍会计算刷新
- 多文件操作时,路径设置问题
Chdir(“D:\1\”)
更多推荐
所有评论(0)