生活中如何善用簡單腳本,提高工作效率,分享一個實現自動分類的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章