********************************************************************************************
Catalog
1、VBA 編程時遇到的語法錯誤卻出現 Sub 或 Function 未定義的錯誤引導
2、Excel 2016 個人巨集活簿(personal.xlsb)不開啟...自己開啟後或將檔存至內設資料夾後,又出現該檔變成"唯讀" 狀態
********************************************************************************************
自學VBA遇到一堆比打手遊還會卡關的卡關,一旦卡關一堆事情就越堆越高、越堆越深、越堆越GY,加上一堆連外網的保護,真他媽的雞雞八八..尤其是那GY Yahoo,從以前就看它很不爽,現在就更不爽了...一下東改西改,跟台灣的證券主管機關一個樣,完全不便民,東改西改,東抽西抽,老說自己很公開,卻老在那裡耍手段,陷小散戶於不利,圖利大咖...真他媽的缺德...XXXXXXXX
然後一堆久了,就忘了我到底推了些什麼...MD..
下回想起時,靠,又得一切重看...
所以把自學時,現在遇到的初階卡關event 全部給它丟在這裡,不管是有解決的、或是已成懸案、或石沈大海的....又或者是.....
恩...就全堆在這裡吧,One piece是真的存在的...就像VBA真的是很不人性化的.....(或許只有我這般認為吧...)..畢竟一被卡關,Nothing can be done!
=====================================
【QA1】、編程時出現 Sub 或 Function 未定義......
一般用錄製巨集時,在編譯執行時不會遇到這種問題。但剛剛在youtube學習,然後邊看邊抄的~~~~
首先插入Moudle後,打入程序如下:
===========================================================================
Sub 批次新增工作表()
Dim i As Integer, x As streng 'i=2,3、、、、row的總數 => 用迴圈方式來分別取得在A欄裡的名稱=>類股名稱
For i = 2 To Sheets(1).Range("A2").End(xlDown).Row '讓i=A欄類股名稱裡(有含資料的連續列的部份)之所有列數
x = Sheets(1).Cells(i, "A") '令變數x=由左邊數來的第一個工作表內的儲存格(第i列,A欄)
Sheets.Add after:=Sheets(Sheets.Count) '物件後出現的框框時,綠色的表方法,有手的表示屬性
Sheets(Sheets.Count).Name = x
Next
Sheet(1).Select 'Sheet(1)處少了個複數s
End Sub
===================================
OK,看似完全沒問題,結果一按F5後跳出
按下確定偵錯,問題出在第一列,恩...很好操個B
對照參看的影片,啊一字無誤的照抄過來,人家可以跑,啊我就不給跑,三米碗哥
問問我的唯一好朋友...谷哥大神...
谷哥大神你怎麼說?
谷哥大神他冷冷的回我,麻煩你自己找,微軟的屎我總擦不完...finish...
最後只好到製造屎的地方查詢....................
已有之官方破翻中回覆:
----------------------------------------------------
Sub 或 Function 必須定義,才能呼叫。 可能導致本錯誤的原因包括:
拼錯的程序名稱。(問題是我將中文改英文也是攏甘款哦)
嘗試從另一個專案中呼叫程序,而不需要明確加入至該專案中參考參考 對話方塊。(後方翻譯是鬼打牆?)
指定看不到呼叫的程序的程序。(跳針嗎)
宣告 Windows 動態連結程式庫 (DLL) 常式或 Macintosh 不在指定的文件庫或程式碼資源的資源程式碼的常式。
更正這個錯誤
請確定程序名稱拼寫正確。
尋找包含您想要呼叫的程序的專案名稱參考 對話方塊。 如果沒有出現,請按一下瀏覽按鈕,以進行搜尋。 選取的專案名稱,左邊的核取方塊,然後按一下確定。
請檢查常式的名稱。
-------------------
老實說完全更加看不懂他在供三夥了~~
--------------------
所以這次又得棄軟叭叭的官方回覆,另找他方..
在東找西找時找得的資訊,先放此以便日後有需要時查看。
一般的程式語言都會有自訂函數的功能,讓程式設計者可以將會重複使用的程式碼編寫成函數,方便未來使用。
VBA 的自訂函數有分為兩種:
函數(Function)
VBA 的 Function 就像一般程式語言的函數,可傳入各種參數,進行自訂的運算,並將計算結果傳回。
子程序(Sub)
VBA 的 Sub 與 Function 類似,可傳入各種參數並進行運算,但是沒有傳回值(沒有辦法傳回計算結果)。
以下介紹函數(Function)與子程序(Sub)的語法。
子程序=>Sub內含的東東,又有譯成副程式
Sub 名稱() '名稱=>使用者自己定義,只要不要違反又小又軟的規則即可
'()內的主要用於放置外部要傳入的參數(或稱引數、引子)
如何輸入引數?
如下:
Sub 我的子程序(x As Integer , y As Integer)
Msgbox(" x - y = " & x - y)
End Sub
如此,這個當外部在叫 "我的子程序" 時,便可送入兩個引子,前提是必須是整數型態,因為 () 內已宣告了x,y都是整數型態
另外在查得資訊時,版主也發了在定義 Sub() 內的引子時,以上例為例,變數x,y分別都已直接在()內宣告成整數型態。
而若要在其它程序(Sub)來呼叫這個程序時(我的子程序),則可再呼叫時順帶帶入兩個引子..用法如下
Sub test()
我的子程序 3,2
End Sub
執行結果顯示如下:
x-y = 1
另外可利用Optional(中譯:可選的)
宣告方式如下
Sub 我的子程序(Optional x As Integer = 3 , Optional y As Integer = 2)
Msgbox(" x - y = " & x - y)
End Sub
然後當在另一副程式呼叫我的子程序時,就可以不用外帶引子,程序便會自動內預設值x=3,y=2來代入
當然若使用者在呼叫我的子程序時,一樣外帶自訂引子,則內部已設之預設值就會被使用者新代入的引數所取代。
例如:
Sub test() '我的子程序預設值已被定義為x=3,y=2
我的子程序 '結果會顯示 x - y = 1
我的子程序 32, '結果會顯示 x - y = 30
我的子程序 5,8 '結果會顯示 x - y = -3
我的子程序 ,10 '結果會顯示 x - y = -7
End Sub
-----------------------
上方不是我要的解答,但也不免可做日後的學習
最後終於在網友的熱心回覆下找得解答
原因出在最下方的 sheet(1).select 的 sheet 處少了個 s
改成Sheets(1).select後再將變數x 改為string字串型態..
就成事了..
哎..搞了一整晚,出在小s,但奇怪了,微軟啊,你為何跑了個未定義sub給我,害我一整晚的弄錯方向去找解答....
===================
2018/11/18
主題:個人巨集活簿不開啟...自己開啟後或將檔存至內設資料夾後,又出現該檔變成"唯讀" 狀態...真是MD..Microsoft
又出現怪現像了,一日不找麻煩,一日不是微軟。
原先開啟 Excel 時,正常預設是會順帶將 個人巨集活頁簿( personal.xlsb) 一併開啟 (只是他被預設為隱藏,所以在開啟試算表時,一般user是不知道他有連帶另開一隱藏檔的,除非使用者從 檢視索引標籤 裡去取消隱藏,否則是會被開啟但卻不顯示的)。
至於此檔的作用 => 用於存放個別使用者針對自己所撰寫的"共用程序",以便其它試算表在使用時也能一塊使用這些已編好的程序(巨集)
但今天問題莫名其妙又來了..那就是開了試算表後,卻不開 personal.xlsb
由於Office版本的不同,其存放 personal.xlsb 的位置路徑也不同。
我的版本是2016版=>(365)
我找了下安裝碟下的xlstart資料夾
顯示如下:
C:\Program Files\Microsoft Office\root\Office16\XLSTART\ PERSONAL.XLSB (該檔即是)
但點入資料夾後竟然內沒有任何檔案...驚!!! where is personal.xlsb...以前還在的..
於是想到有網友說過會被存在
"安裝碟:
C:\Users\使用者名\AppData\Roaming\Microsoft\Excel 下方
找了下,這裡果然有personal.xlsb
可是為何放在這裡卻不伴隨試算表一塊開啟呢?我也搞不懂...
所以索性乾脆將其複製到 C:\Program Files\Microsoft Office\root\Office16\XLSTART\
試試..
接續重開試算表後OK..是有開啟這檔,因為我有在裡面寫了個測試陳述式..
如
Sub test()
Range("A1") = Abc
End Sub
所以只要這隱藏檔被開啟時,當我用檢視巨集時,便可看到有個test的程式可供選擇..
唯獨..開是開了..我就將以前系統重安時匯出的.bas檔重新匯入..
之後修改程序.存檔..
好了...它又出問題了,給我顯示此檔是唯讀..你老師的..不找麻煩你不叫微軟便是?!
=-------------------
在又小又軟的官方回覆查得如下:
🍎如何在啟動 Excel 時自動開啟特定活頁簿
將活頁簿放在 XLStart 資料夾,或是使用 XLStart 資料夾以外的替代啟動資料夾。
找出 XLStart 資料夾
啟動 Excel 時,會自動開啟任何活頁簿、 範本或工作區檔案 ,您將 XLStart 資料夾中。若要找出 XLStart 資料夾的路徑,請核取 【信任中心設定】。若要這麼做:
按一下 【檔案】 > 【選項】。
按一下 【信任中心】,然後按一下 [Microsoft Office Excel 信任中心] 底下的 [信任中心設定]。
按一下【信任位置】,然後在信任位置清單中確認 XLStart 資料夾的路徑。
黑塊處為使用者名.
由於明明路徑都已有設好,但卻開了個人巨集活頁簿後又給你變唯讀..(註:已有用檔案總管右點該檔確認檔案並沒勾選唯讀選項)
所以我又重新增信任的路徑位置...結果卻被告之此路徑已新增至您的信任位置了..但本來就有了..令人搞不懂的又小又軟..
使用替代的啟動資料夾
按一下 【檔案】 >【[選項】 > 【進階】。
在 【一般】 底下的【啟動時,開啟所有檔案於】 方塊中,輸入您要設為替代啟動資料夾的資料夾完整路徑。
因為這軟件實在太詭異了,所以我又把這路徑再次貼上一回
C:\Program Files\Microsoft Office\root\Office16\XLSTART\
由於 Excel 會嘗試開啟替代啟動資料夾中的所有檔案,因此請確認您指定的資料夾只包含 Excel 可以開啟的檔案。
附註: 如果在 XLStart 資料夾和替代啟動資料夾中同時有名稱相同的活頁簿,會開啟 XLStart 資料夾中的檔案。
如果要讓啟動 Excel 時,不開啟特定活頁簿
請根據您啟動 Excel 時會自動開啟的活頁簿位置而定,執行下列其中一項操作確保活頁簿不會在啟動時開啟。
如果活頁簿存放在 XLStart 資料夾中,請從資料夾移除該活頁簿。 (見鬼,現在是又小又軟自己把我的 personal.xlsb 搞 disappear)
如果活頁簿存放在替代啟動資料夾中,請執行下列操作:
附註: 如需尋找 [啟動] 資料夾的詳細資訊,請參閱尋找 XLStart 資料夾。
按一下 【檔案】 > 【選項】 > 【進階】。
在 【一般】 底下,清除 【啟動時,開啟所有檔案於】 方塊中的內容,然後按一下 【確定】。
(即把上方新增的路徑幹掉即可,但內文明明說若內定在 XLStart 資料夾和替代啟動資料夾中同時有名稱相同的活頁簿,會開啟 XLStart 資料夾中的檔案,也就是說若這裡不放路徑,按理存放在 XLStart 資料夾的東東們還是會被一併開啟的)
在 【Windows 檔案總管】 中,移除會啟動 Excel 並從替代啟動資料夾開啟活頁簿的任何圖示。 (什意思?)
提示: 您也可以用滑鼠右鍵按一下圖示、按一下 【內容】,然後在 【捷徑】 索引標籤中移除該活頁簿的任何參照。
啟動 Excel 時自動開啟活頁簿範本或工作表範本
您可以將常用的活頁簿設定儲存在活頁簿範本中,然後在每次啟動 Excel 時自動開啟該活頁簿範本。
請執行下列其中一項操作:
如果要使用活頁簿範本,請先建立活頁簿,其中需包含要在以活頁簿範本為基礎的新活頁簿中使用的工作表、預設文字 (例如頁首以及欄和列標籤)、公式、巨集、樣式和其他格式設定。
如果要使用工作表範本,請先建立包含一個工作表的活頁簿。工作表中需包含要在以工作表範本為基礎的所有新工作表上顯示的格式設定、樣式、文字和其他資訊。
可以儲存在活頁簿或工作表範本中的設定
儲存格和工作表格式。
每個工作表的頁面格式和列印範圍設定。
儲存格樣式。
活頁簿中的工作表數量和類型。
活頁簿的保護和隱藏範圍。您可以隱藏工作表、列和欄並避免變更某些工作表儲存格。
需要重複的文字,例如頁首以及列和欄標籤。
資料、圖形、公式、圖表和其他資訊。
資料驗證設定。
表單上的巨集、超連結和 ActiveX 控制項。
活頁簿計算選項和視窗檢視選項。
按一下 [檔案] > [另存新檔]。
在 [檔案類型] 方塊中,按一下 [範本]。
在 [儲存位置] 方塊中,選取存放範本的資料夾。
若要建立預設活頁簿範本或預設工作表範本,請選取 [XLStart 資料夾或替代啟動資料夾]。若要尋找 [啟動] 資料夾的路徑,請參閱尋找 XLStart 資料夾。
如果要建立自訂的活頁簿或工作表範本,請確認您已選取 Templates 資料夾。
路徑通常是: C:\Users\ < 使用者名稱 > \AppData\Roaming\Microsoft\Templates
在 [檔案名稱] 對話方塊中,執行下列其中一項操作:
如果要建立預設活頁簿範本,請輸入 Book。
如果要建立預設工作表範本,請輸入 Sheet。
如果要建立自訂活頁簿或工作表範本,請輸入您要使用的名稱。
按一下 [儲存]。
按一下 [檔案] >關閉。
啟動 Excel 時不執行自動巨集
隨著 Excel 啟動而開啟的活頁簿如果已經錄製自動巨集 (例如 Auto_Open),會在活頁簿開啟的同時自動執行自動巨集。
如果不要自動執行巨集,請在啟動 Excel 時按住 SHIFT 鍵。
to be continue....