close

VBA語法基本觀念

物件.屬性.方法

物件.屬性.方法 引數名稱

物件.屬性.方法 引數名稱:=(引數1,引數2,、,、,、,、,引數n)                  '引數又譯參數

物件.子物件.屬性.方法 引數名稱:=(引數1,引數2,、、、、引數n)   

物件導向 => 將人類的現實世界模擬至程式語言世界去...所以叫做..物件Objects  導向  去程式碼...

 

這麼說來何謂物件?

人類世界中,物件舉凡:衣服、碗、杯子、車子、飛機、時鐘、電風扇、冷氣機、鞋子、、、、、統統稱為物件..

又諸如物種也可用物件的觀念來細分:

諸如:動物分哺乳、非哺乳、、、

          植物分、、、、

          然後  動物.哺乳又可細分人類或非人類、、、

          由此可知若一個十分龜毛的人,他的分類將可到無窮無盡

那物件這麼多要怎麼細分...很簡單,按人類的分類就是..

衣服、鞋子、褲子類丟到【衣物類】

碗丟到食物器材去、杯子丟到也可以丟到【食物器材】去

車子、飛機、、、等全丟到【交通工具類】去

、、、、

故我們可知這樣若要細分起來可真是族繁(煩)不及備(負)載呢

例如:又可細分成

交通工具類->飛行器類->垂直起降類->直升機、、、、

                                   ->加速起降類->民航機、戰鬥機、運輸機、、、

然後轉成程式語言後就變成

大物件.中物件.小物件.細物件.微物件......

看你要分多細然後就可以  .  多少下去

諸如:若某個找自己麻煩的傢伙要分的很細..

有可能會分到如下:

大物件.中物件.小物件.細物件.微物件.奈米物件、、、、、、、

當然要寫程式應該不要把自己逼到絕境......

我的意思是指..假設我們要講述一輛車子的椅墊

可能人類就是直接講 "車椅"

但在程式語言裡就須轉化成..例如:

汽車.椅子

(物件.子物件)

那假設這椅子的顏色你想要咖啡色..

則人類用語=>車椅為咖啡色

轉程式碼=>  汽車.椅子.顏色=咖啡

(物件.子物件.屬性=屬性值)

====================================

打了一串不相干的東東..

今想要改良一下某個每日要更新記錄的EXCEL檔,主要予改良的地方在 (另存新檔) 這一塊

因為我習慣性將每日要追蹤更新的東西放在同一個資料,

這樣一來有個好處,就是你比較不會忘了哪個檔案沒去更新,日後就得手動再去抓資料..

(註:雖然目前還是無法做到自動補資料...因為那個層次感覺好像很深)

但目前有一個試算表檔案每日抓完資料後要歸建統一存到另一個資料夾裡..

舉例如:

每日要更新的檔案全放在【ABC】這資料夾內

但這個每日更新後要另存新檔的歸建位置在【ABC】\【another document】內

以前的做法就是在Excel標題列做一個另存新檔的快捷鍵...按一下,然後再選擇要存放的資料夾內,此例為【another document】

但我是個懶人...哈哈...所以我一定要想方法達成懶人的最高境界

只是苦惱的是....不知道要怎麼寫..= ="   
畢竟我心中的理想方法是,我按一鍵,然後跳出一視窗要求我輸入檔名即可自動存放至歸建夾【another document】內..(若更好的是能自動補前面未抓到的日期,以及能夠不用開試算表直接按一鍵背後全部抓好存檔)這些都是可行的,只是功力太淺..打不到那武術境界

好了..這用白話的說法很簡單..可是要轉成程式碼...我就..頭大了...因為底子太差.....正如國父所說~知易總是行難啊..

外加又是好一陣子沒去碰VBA..

只好G別人的來參考..

按照我前述的基本觀念

可知,我必得要先叫出一物件,使這物件可以跳出視窗格供我自行輸入檔名,當然更理想的做法是最好他能自動幫我抓取當下的日期做檔名,這豈不又更乎我這懶人的大名嗎...哈哈哈..

只可惜啊..我前面都沒個譜呢..這自動抓日期做檔名的...恩..期待自己精進再來改裝.....T T ....

---------------

然後發現我心中想做的短短幾個動作...恩..要不少語碼(程式碼)動作來補足..

首先要叫出能顯示可供我輸入日期的【物件】,查了下,可利用VBA裡的 【inputbox】這函式

作用:用來讓使用者(也就是在下畢人小弟我)在按下按鍵後,跳出視窗來要求半自動的輸入檔名..

然後查了下這函式的用法..

補充1如下:(因為官方的翻譯很多時候老是讓人有看沙攏嘸)

補充2:下方是我直接從我VBE裡程式區中複製貼過來的註解,所以前方會有個  '  引號.

'【功能】
 ' 利用【InputBox】函式 在對話視窗方塊顯示提示,等待使用者輸入文字或按一下按鈕,傳回包含文字方塊內容的字串
 '【語法】
 'InputBox(1.prompt, 2.title, 3.default, 4.left(x座標), 5.Top(y座標), 6.helpfile, HelpContextID, 7.Type)
 '引數中譯 1.提示, 2.標題, 3.預設值, 4.水平, 5.垂直, 6.說明檔案, 語境(內容), 7.(後述))
 '1.必要。字串,在對話窗中顯示的訊息,可以是字串、數字、日期或布林值(長度最大約255字元。若包含多行,可使用歸位  字元(Chr(13)),換行字元(Chr(10)),或歸位字元/換行字元組合  ((Chr(13) & (Chr(10))來分隔多行
 '2.選用。字串運算式,顯示在對話窗的標題列,若省略,則顯示應用程式名 =>Microsoft Excel
 '3.選用。若未提供其他輸入,根據預設回應,會在文字方塊中顯示字串運算式。若省略該引數,則顯示空的文字方塊
 '4.xpos,選用。數值運算式,指定對話方塊左側與螢幕左側之間的水平距離 (以 Twip 為單位)。 省略 xpos ,則會將對話方塊水平置中。
 '5.ypos,選用。數值運算式,指定對話方塊上端與螢幕頂端之間的垂直距離 (以 Twip 為單位)。 省略 ypos,則會將對話方塊垂直放在螢幕上方約三分之一的位置
 '6.說明檔案,選用。識別要使用之說明檔案的字串運算式會提供對話方塊的即時線上說明。 如果提供_說明檔案_,則也必須提供_內容_。
 '6.context內容,選用。說明內容數字的數值運算式會指派至說明作者的適當說明主題。 如果提供_內容_,則也必須提供_說明檔案_。
關於7有點看不懂,沒關係再查別的人寫的看看發現其 type 可是要加上引數的..
故加上引數的方式=>  Type:=類型代碼
值=0   表示:公式
值=1   表示:數字
值=2   表示:文字(字串)
值=4   表示:邏輯值(True 或 False)(1 或 0)   '話說3跑哪去了
值=8   表示:儲存格參照,視為Range物件   '恩..文中之文
值=16   表示:錯誤值,如 #N/A 
值=64   表示:陣列值
 
查到的陳述式如下,假設只想讓使用人只能輸入數字
'只可輸入數字
UserData = Application.InputBox("請輸入數字:", Type:=1)
 
執行後故意輸入非數字來試試
2020-05-14-001.png
注意的是,上方程式碼函式 InputBox 前有加入物件=>Application  (物件中的老大)
 
我試著去除Application  (幹掉老大)
使程式碼變為
UserData = InputBox("請輸入數字:", Type:=1)
則執行後將變成
 
2020-05-14-002.png
 
換言之,InputBox 跟加了老大使用  Application.InputBox  兩者是有差異的..
查了下其主要小差異是多了 Application 這物件老大,則多了可以指定輸入資料類型的功能..
也就是上方註解中引數裡第7選項,唯有當老大有出現時才可設定此參數值,沒老大=此引數設了自動無效,同時不讓你動..
強制執行後便會出現如上圖中的錯誤視窗
"找不到指名引數"
OS:....恩..你給了我回應,但一整個讓人看攏嘸咧公三的回應
 
不過目前可知道的物件?函式?還是方法?
=>必須使用有 InputBox ,我才能完成半手工的輸入文字...對於全自動的自抓日期嗎.....目前看來遙遙無期中、、、
那可以輸入文字日期後,接下來我要怎麼樣才能讓笨蛋程式能幫我做【收件&記錄(存檔)】的動作呢???
其它查得的陳述句寫法如下:
  CreateFileDate = InputBox("請輸入予存檔之檔名 ex:202X-XX-XX :", "另存新檔為...", "2020-")
🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏🍏
接下來

因為寫不出來所以天下一大抄,抄的不好叫偷竊,抄的美好叫藝術..

恩卡關時不彷搞切割..所以想跳到【另存新檔】

在試算表中不過是個簡單的一指神功,按一下就搞定的另存新檔,要自個搞就....又是一個工程了..

G大神找得他人分享之程式碼

-----------------

Sub 另存新檔匯出工作表()

    Dim MyPath,MyFile作為字符串

    '將目前所開啟的檔案所在位置及工作表名稱儲存到字串變數

    MyPath = ThisWorkbook.Path   '設定MyPath這變數=目前開啟這工作表的路徑

    MyFile = ActiveSheet.Name       '設定MyFile這變數=啟用中的工作表之名

    '儲存的格式很多,請參照:位置

        ChDir MyPath    '切換系統目錄到指定位置 (切到目前開啟的工作表的路徑去)

        ActiveWorkbook.SaveAs FileName:= MyPath&“ \”&MyFile,FileFormat := xlCSV,_

                                   CreateBackup:=false     

             '將予另存的新檔存到MyPath(目前開啟這工作表的路徑)\啟用中的工作表之名 ,存檔格式=副檔名格式為.csv,

End Sub

-------------

另一個查得的使用方法:

另存為(FileName,FileFormat,Password,WriteResPassword,ReadOnlyRecommended,CreateBackup,AccessMode,ConflictResolution,AddToMru,TextCodepage,TextVisualLayout,Local)

參數

Filename可選,表示要保存文件的文件名的字符串。可包含完整路徑,如果不指定路徑,將文件保存到當前文件夾中。使用SaveAs方法將工作簿另存為新文件後,將關閉原工作簿文件。

 

Sub MySaveAsWork()

     ThisWorkbook.SaveAs Filename:= ThisWorkbook.Path &“ \ book123.xls”

End Sub

'以上程序大致上快符合我意了

'如果要保存為指定的文件名,可以使用 INPUTBOX , 彈出對話框,讓使用者錄入一個文件名後再保存。

'使用SaveAs方法將工作簿另存為新文件後,將關閉原工作簿文件。

所以我必須改用

若希望工作簿在保存為另一文件名後,能繼續編輯原工作簿,則可以使用 SaveCopyAs 方法,

 

SaveCopyAs:方法將指定工作簿的副本保存到文件,但不修改內存中的打開工作簿,語法如下:SaveCopyAs(Filename)

參數Filename是必需的,用於指定工作簿副本的文件名。

下面介紹一下利用SAVECORYAS的方法保存工作薄的方法,如下面的代碼所示。

Sub MySaveCopyWork()

ThisWorkbook.SaveCopyAs ThisWorkbook.Path & "\BOOK123.xls"

End Sub

代碼解析:MySaveCopyWork過程使用SaveCopyAs方法保存代碼所在的工作簿副本,並指定其名稱。

四 實例介紹,將工作表單獨保存為工作薄的方法。

我們首先介紹一下COPY方法:應用於Worksheet對象的Copy方法將指定工作表複製到工作簿的另一位置,語法如下:Copy (Before, After)

參數Before是可選的,用來指定工作表,複製的工作表將置於此工作表之前。

After是可選的,用來指定工作表,複製的工作表將置於此工作表之後。

注意點:不能同時指定Before參數和After參數。當Copy方法省略參數時,應用程式將新建一個空工作簿(新建工作簿將成為活動窗口),並將Copy方法引用的工作表複製到該空工作簿中。

下面介紹一下將工作簿中的幾個工作表單獨保存為一個工作簿文件的方法,此方法可以以數組的形式指定要複製的工作表,如下面的代碼所示。

Sub MyArrSheetCopy()

On Error GoTo 100

Worksheets(Array("Sheet1", "Sheet2")).Copy

ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\book1234.xls"

ActiveWorkbook.Close SaveChanges:=True

Exit Sub

100:

ActiveWorkbook.Close False

End Sub

代碼解析:MyArrSheetCopy過程將"Sheet1"和"Sheet2"工作表單獨保存為一個工作簿文件。

第4行代碼使用SaveAs方法保存活動工作簿,

下面我們看看三種方法的代碼窗口及運行後結果:

 

以上大多取材自網路熱心網友分享...除了一堆廢話為我自己的...哈哈..因為怕日後又給忘了這是什麼玩意..所以廢話總是要有..

其它..此篇文章尚未整理完畢,距我的懶人目標還十分遙遠,為了方便日後整理所以才先放上..

故很多地方都還未編排與細看..

先醬

 

 

 

 

 

 

 

 

arrow
arrow

    Ray 發表在 痞客邦 留言(0) 人氣()