前言:
此为备忘篇,零部件计算器已经用VBA制作了Excel版,CMD版后序几乎很少用到。但是其使用到的代码对文件新建复制整理重命名等仍有一定作用。
今年六七月份时,由于工作以来经常使用Excel计算单元体零部件数量,于是学了下Cmd/Bat,用Cmd/Bat批处理做的一个单元体零部件计算器,运行效率不高,需要几十秒时间计算。主要使用了Bat的判断/循环/进度条等功能制作。另外最近学了下 VBA,用Excel 制作了类似工具,使用了数组与字典,计算速度达到了0.5秒以内,稍后发布。
1,使用方法
压缩包打开后的几个文件
(1)单元体数据(Assy.xls),零部件数据(Part.xls),以及要计算的清单(List.xls),分别按表格格式要求,填好相关数据。(注:此数据格式为数据库原有格式,能用数据库的可直接复制数据。没有数据库的,填入关键数据信息即可,多余数据可以不管)
Assy.xls
Part.xls (除箭头所指数据外,其他可不填)
List.xls
(2)点击 零部件计算器7.0.exe 等等运行完毕。
(3)补充,只需要零部件数量,不需要尺寸的,可以删除Part.xls ,程序也可正常运行。 或者,在程序运行到最后询问时,按 N 键,取消零部件尺寸提取。
2,代码原理
利用最基本的CMD命令(判断与循环),将单元体数据(Assy.xls),零部件数据(Part.xls),以及要计算的清单(List.xls),分别存入单独的文件中,然后用CMD循环读取List.xls数据,再去一一对比Assy.xls中的数据,判断二者数据是否相同,如果相同,则提取相对应的数据,存到一个临时文件中,在对提取的数据进行分类汇总,最后输出到Count.xls中。
单元体零部件编号,通常只有3级,即单元体(0级),组装件(1级),零部件(2级),零部件中的零部件(3级)。因此可以只写3~4个循环即可。但为了代码简洁,以及后续需要,实际代码可以无限循环,直到找出最后一级为止,既可以无限循环套娃。
注:CMD实际只能读取文本文件,也就是说文件夹中的 .xls 文件实际是直接用 .txt 文件改后缀得到的,改成 .xls 文件是为了更方便对数据进行操作。
3,原代码分享
以下为CMD源代码,复制到.txt文件后,更改后缀为.cmd或.bat即可运行。(复制时,不能含代码序号)
@echo off
chcp 936 >nul
mode con cols=56 lines=18 &color 9f
title 单元体零部件计算
echo.
echo 单元体零部件计算 (作者:Duke.Cao) %Date:~0,4%-%Date:~5,2%-%Date:~8,2% %Time:~0,2%:%Time:~3,2%
echo ------------------------------------------------------
echo.
echo 等候处理...
echo.
rem 参数设置--------------------------------------------------------------------------------------------
setlocal enabledelayedexpansion
set dd="C:\Users\%username%\tempduke"
set li=List.xls
set assy=Assy.xls
set part=Part.xls
set co=Count.xls
set num=0
set per=10
set sub=sub.xls
if exist %dd% (rd /s /q %dd% & md %dd%) else (md %dd%)
attrib +h %dd%
if exist %li% (copy /y %li% %dd%\%li% >nul ) else (echo 缺少%li% 请核对! && goto :End )
if exist %assy% (copy /y %assy% %dd%\%assy% >nul ) else (echo 缺少%assy% 请核对! && goto :End )
if exist %part% (copy %part% %dd%\%part%) >nul
cd /d %dd% >nul
if exist %co% (del %co% && cd. > %co%) else (cd. > %co%)
echo "PART_NO" "DESCRIPTION" "DIM_A" "DIM_B" "PART_QTY" "REMARKS" >> %co%
copy /y %co% tmp.xls >nul
rem 原始级----------------------------------------------------------------------
copy /y %li% t1 >nul
call :Subtotal
if exist t4 (ren t4 %sub%) else (goto :choice)
for /f "tokens=1,2 " %%a in (%sub%) do (
echo %%a "-" "-" "-" %%b "第 %num% 级" >> %co% )
rem 进度条-----------------------------------------------------------
set a=^set /p=■%b%^<nul^&ping/n 0 127.1^>nul^&
set/p= <nul&%a%%a%%a%%a%%a%%a%%a%%a%%a%%a% echo %per%%%
echo.
rem 循环 第N级----------------------------------------------------------------------
:loop
for /f "skip=1 tokens=1,2" %%a in (%sub%) do (
for /f "skip=1 tokens=1,2,3" %%A in (%assy%) do (
if %%a==%%A (
set /a result=%%b*%%C && echo %%B !result! >> t1
)
)
)
if exist t1 (call :Subtotal) else (goto :choice)
set /a num+=1
set sub=sub%num%.xls
ren t4 %sub%
for /f "tokens=1,2 " %%a in (%sub%) do (
echo %%a "-" "-" "-" %%b "第 %num% 级" >> %co% )
rem 进度条-----------------------------------------------------------
set /a per+=10
set a=^set /p=■%b%^<nul^&ping/n 0 127.1^>nul^&
set/p= <nul&%a%%a%%a%%a%%a%%a%%a%%a%%a%%a% echo %per%%%
echo.
goto :loop
rem 分类汇总----------------------------------------------------------------------
:Subtotal
setlocal
for /f "tokens=1,2 delims=" %%a in (t1) do (
set "a=%%a"
set "a=!a:-=.!"
echo !a! !b! >> t2 )
for /f "tokens=1,2" %%i in (t2) do set /a "#%%i#+=%%j"
for /f "tokens=1,2 delims=#=" %%i in ('set #') do echo %%i %%j >> t3
for /f "tokens=1,2 delims=" %%a in ('type "t3"') do (
set "a=%%a"
set "a=!a:.=-!"
echo !a! !b!>> t4 )
del t1 t2 t3
goto:eof
rem 循环结束判断是否提取尺寸----------------------------------------------------------------------
:choice
if not exist %part% (goto :BB)
echo ----是否提取尺寸?(2秒后自动提取)
CHOICE /T 2 /C YN /D Y /M "----是请按Y,否请按N。"
if errorlevel 2 goto :BB
if errorlevel 1 goto :AA
rem 提取尺寸----------------------------------------------------------------------
:AA
for /f "skip=1 tokens=1,2,3,4,5,6 delims= " %%a in (%co%) do (
for /f "skip=1 tokens=1,2,3,4 delims= " %%A in (%part%) do (
if %%a==%%A (
echo %%A %%B %%C %%D %%e %%f >> tmp.xls
)
)
)
copy /y tmp.xls "%~dp0\%co%" >nul
goto :CC
:BB
copy /y %co% "%~dp0\%co%" >nul
:CC
rem 进度条-----------------------------------------------------------
set a=^set /p=■%b%^<nul^&ping/n 0 127.1^>nul^&
set/p= <nul&%a%%a%%a%%a%%a%%a%%a%%a%%a%%a% echo 100%%
echo.
echo 计算完成
cd /d "%~dp0"
start count.xls
:End
rd /s /q %dd%
choice /t 2 /d y /n >nul
exit /b
4,文件分享
链接:https://pan.baidu.com/s/1C7DQitraWVXr0qFEtjNtRw
提取码:aodn