生活中如何善用简单脚本,提高工作效率,分享一个实现自动分类的vbs脚本Demo

一、demo功能介绍

   在生活中或者工作之中,我们经常会遇到的一件事情就是查文件,或者说根据给定的文件,例如.txt文档、excel表格等文档,来进行分类,如果只是少量的工作量,那么手动给它分分类,手动找找,手动copy一下都是无所谓的。但是如果文件达到上百上千了呢,你是否还是愿意自己手动来进行这些操作呢,恐怕就费力不讨好了吧~~~
   如果你有过C/C++语言或者其他语言编程基础的话,相信你可以轻松的看懂本文,如果你还只是个小白的话,只要花点心思,相信你也可以学会的。以下就是我在生活中遇到的实际例子,需要根据给定的excel表格完成相应的操作,使用vbs脚本可以在windows系统上轻松的完成以上操作要求,读者可以根据所给的本文所给的Demo,触类旁通,举一反三,也写出属于自己的工作小工具吧,废话不多说,接下来就要详细介绍本文的Demo了。

要求: 根据excel表格中的内容,实现自动分类指定文件夹内的文件
输入: excel表格 、待分类文件
输出: 分类好文件的文件夹

例如:
(1)输入excel表格

test.xls

表格内容为:

(2)输入文件(此外示例为txt格式文件,实际上其他格式的文件均可)

(3)输出文件

二、vbs脚本基本语法介绍

(1)子函数创建

sub Name()//无返回值类型
...
end sub
function name()//返回值函数,返回值即为句柄:name
...
end function

以上两种类型的函数皆可以传参,即Name(n)

(2)常见运算符

1、算术运算符

+-*/    除
\    整除
mod  取余
^&    字符串连接符

2、比较运算符

>    大于
<    小于
=    等于
<>   不等于
>=   大于等于
<=   小于等于

3、逻辑运算符

not    非
and    与
or     或
xor    异或
eqv    等价
imp    隐含

(3)控制结构

1、条件语句

if(xxx)then //then必须与条件判断在同一行
...
end if
if(xxx)then
...
else
...
end if

2、循环语句

Do Until XXX
...
Loop
For i=1 To n step 1//从i到n,步长为1
...
Next

以上为最基本常见的语句,如有兴趣进一步了解,可以参考以下博文:VBS基本语法

三、Demo介绍

(1)子函数----getRow()

功能:获取excel表格中的有效数据行数

Function getRow()
rowCount =objWorkbook.ActiveSheet.UsedRange.Rows.Count
Dim Count:Count = 1
getRow = 0
Do Until Count > rowCount
       stringFlag = Left( objExcel.Cells(Count,2),10 )
       if( isDate( stringFlag )=True )then
            if(flagStart = 1)then
               flagStart = Count
            end if
       getRow = getRow + 1
       end if
      Count = Count +1
Loop
End Function

实现思路:

利用Left( Left( objExcel.Cells(Count,2),10 ) )函数
使用objExcel.Cells(Count,2)取出excel表格中第Count行,第2列中的字符串 (这里只取第2列中的数据,是因为表格内容排版格式原因,读者因根据具体情况具体分析)
再将取得的字符串从左开始,取10个字符长度的内容
遍历整个表格,当读取到的文本为 “日期” 类型的数据时,即判断为一行有效数据,并将最终的行数返回:

getRow = getRow + 1

注意:excel表格最左上角是:第1行,第一列,excel表中的汉字也为一个字符大小

(2)子函数----getFileNum(text)

功能:获取所需分类的文件内容

Function getFileNum(text)
Dim result(3),Count:Count = 1
num1 = 0
num2 = 0
num3 = 0
textLen = len(text)
Do Until Count > textLen 
      if( isNumeric( mid(text,Count,1) ) = False )then
          num1 = num1 + 1
      else
          exit Do
      end if
Count = Count +1
Loop
result(0) = mid(text,1,num1)


Do Until Count > textLen 
      if( isNumeric( mid(text,Count,1) ) = True)then
          num2 = num2 + 1
      else
          exit Do
      end if
Count = Count +1
Loop
result(1) = mid(text,num1+1,num2)


Do Until Count > textLen 
      if( isNumeric( mid(text,Count+1,1) ) = True)then
          num3 = num3 + 1
      else
          exit Do
      end if
Count = Count +1
Loop
result(2) = mid(text,num1+num2+2,num3)
getFileNum = result
End Function

实现思路:

表中的 “周易1-2卦” 代表包括文件周易中的第一卦文件、第二卦文件 (符号“-”的意思表示:XXX至XXX)
首先定义一个三维数据:

Dim result(3)

接着将excel表中的 “周易1-2卦” 分解为:“周易”“1”“2”,并且分别存储于result(0)、result(1)、result(2)中,最后利用下句将数组result返回

getFileNum = result

其中:

isNumeric()   判断是否为数值内容,是则返回True,否则返回False
mid(text,m,n)  取出字符串text中第m到第n个字符之间的内容

(3)子函数----createFolder()

功能:创建文件夹并实现分类

Sub createFolder()
set fso = Wscript.CreateObject("Scripting.FileSystemObject")
if(not fso.FolderExists(currentpath & name)) then
fso.CreateFolder(currentpath & name)
realRow = getRow()
flagEnd = realRow + flagStart - 1
Dim Count1:Count1 = 0 
Dim Count2:Count2 = 3
rem Dim saveStart,saveEnd
Do Until Count1 >= realRow 
     Count1 = Count1 +1 
     targetPath  = currentpath & name & "/" & "第" & Count1 & "周"
     fso.CreateFolder(targetPath)
     realCols = 5//此处设置扫描列数为5列,实际上读者可以修改为:根据excel表格某行的列数动态变化
     Count2 = 3
     Do Until Count2 > realCols
           if(objExcel.Cells(Count1 + flagStart - 1,Count2)="")then
                exit Do
           end if
           data= getFileNum( objExcel.Cells(Count1 + flagStart - 1,Count2) )
          if(data(2)="")then
                saveStart = data(1)
                saveEnd = data(1)
          else
                saveStart = data(1)
                saveEnd = data(2)
          end if
          For i = saveStart To saveEnd step 1
                sourceFile = currentpath & "file\" & data(0) & "\check" & i & ".txt"
	fso.getfile(sourceFile).copy(targetPath & "\" & data(0) & i & ".txt")
          Next
           Count2 = Count2 + 1
     Loop 
Loop 
end if
End Sub

实现思路:

利用 targetPath = currentpath & name & “/” & “第” & Count1 & “周” 语句生成目标文件夹的目录,并根据此目录创建相应的文件夹: fso.CreateFolder(targetPath)
当创建好相应的文件夹之后,接着根据 getFileNum(text) 函数读取的内容进行文件复制,并同步将文件重命名,此处命名为: data(0) & i & ".txt(eg.周易1.txt)

sourceFile = currentpath & "file\" & data(0) & "\check" & i & ".txt"
fso.getfile(sourceFile).copy(targetPath & "\" & data(0) & i & ".txt")

(4)主函数

功能:打开指定的excel表格,并进行创建文件夹和分类,完成后显示:Success!!!

name = InputBox("请输入生成文件夹名称!")
excel = InputBox("请输入xls表格名称!")
flagStart = 1
flagEnd = 0
currentpath = createobject("Scripting.FileSystemObject").GetFolder(".").Path
currentpath = currentpath & "\"
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open (currentpath & excel & ".xls" )

rem Set objWorkbook = objExcel.Workbooks.Open (currentpath & "test.xls" )
createFolder()

objExcel.Workbooks(1).Close(true) '关闭工作表
objExcel.Quit  ' 退出
msgbox "Success!!!"

四、运行效果

附录(完整代码)

/*在windows系统下创建.txt文件后,将代码复制到文本中,修改文档为.vbs文件,双击即可运行
  author:Mr.silver
  date:2019/8/31 */

name = InputBox("请输入生成文件夹名称!")
excel = InputBox("请输入xls表格名称!")
flagStart = 1
flagEnd = 0
currentpath = createobject("Scripting.FileSystemObject").GetFolder(".").Path
currentpath = currentpath & "\"
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open (currentpath & excel & ".xls" )

rem Set objWorkbook = objExcel.Workbooks.Open (currentpath & "test.xls" )
createFolder()

objExcel.Workbooks(1).Close(true) '关闭工作表
objExcel.Quit  ' 退出
msgbox "Success!!!"

Sub createFolder()
set fso = Wscript.CreateObject("Scripting.FileSystemObject")
if(not fso.FolderExists(currentpath & name)) then
fso.CreateFolder(currentpath & name)
realRow = getRow()
flagEnd = realRow + flagStart - 1
Dim Count1:Count1 = 0 
Dim Count2:Count2 = 3
rem Dim saveStart,saveEnd
Do Until Count1 >= realRow 
     Count1 = Count1 +1 
     targetPath  = currentpath & name & "/" & "第" & Count1 & "周"
     fso.CreateFolder(targetPath)
     realCols = 5
     Count2 = 3
     Do Until Count2 > realCols
           if(objExcel.Cells(Count1 + flagStart - 1,Count2)="")then
                exit Do
           end if
           data= getFileNum( objExcel.Cells(Count1 + flagStart - 1,Count2) )
          if(data(2)="")then
                saveStart = data(1)
                saveEnd = data(1)
          else
                saveStart = data(1)
                saveEnd = data(2)
          end if
          For i = saveStart To saveEnd step 1
                sourceFile = currentpath & "file\" & data(0) & "\check" & i & ".txt"
	fso.getfile(sourceFile).copy(targetPath & "\" & data(0) & i & ".txt")
          Next
           Count2 = Count2 + 1
     Loop 
Loop 
end if
End Sub

Function getRow()
rowCount =objWorkbook.ActiveSheet.UsedRange.Rows.Count
Dim Count:Count = 1
getRow = 0
Do Until Count > rowCount
       stringFlag = Left( objExcel.Cells(Count,2),10 )
       if( isDate( stringFlag )=True )then
            if(flagStart = 1)then
               flagStart = Count
            end if
       getRow = getRow + 1
       end if
      Count = Count +1
Loop
End Function

Function getFileNum(text)
Dim result(3),Count:Count = 1
num1 = 0
num2 = 0
num3 = 0
textLen = len(text)
Do Until Count > textLen 
      if( isNumeric( mid(text,Count,1) ) = False )then
          num1 = num1 + 1
      else
          exit Do
      end if
Count = Count +1
Loop
result(0) = mid(text,1,num1)

Do Until Count > textLen 
      if( isNumeric( mid(text,Count,1) ) = True)then
          num2 = num2 + 1
      else
          exit Do
      end if
Count = Count +1
Loop
result(1) = mid(text,num1+1,num2)

Do Until Count > textLen 
      if( isNumeric( mid(text,Count+1,1) ) = True)then
          num3 = num3 + 1
      else
          exit Do
      end if
Count = Count +1
Loop
result(2) = mid(text,num1+num2+2,num3)
getFileNum = result
End Function
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章