OM可以將任何HTML描繪成一個由多層節點構成的結構。節點分為12種不同類型,每種類型分別表示文檔中不同的信息及標記。每個節點都擁有各自的特點、數據和方法,也與其他節點存在某種關系。節點之間的關系構成了層次,而所有頁面標記則表現為一個以特定節點為根節點的樹形結構。
節點中的各種關系可以用傳統的家族關系來描述,相當于把文檔樹比喻成家譜。接下來,將把DOM節點關系分為屬性和方法兩部分進行詳細說明
屬性
父級屬性parentNode
每個節點都有一個parentNode屬性,該屬性指向文檔樹中的父節點。對于一個節點來說,它的父節點只可能是三種類型:element節點、document節點和documentfragment節點。如果不存在,則返回null
parentElement
parentNode跟parentElement除了前者是w3c標準,后者只ie支持(chrome現在都支持)
當父節點的nodeType不是1,即不是element節點的話,它的parentElement就會是null
一般情況parentNode可以取代parentElement的所有功能
parentElement匹配的是parent為element的情況,而parentNode匹配的則是parent為node的情況。element是包含在node里的,它的nodeType是1
<div id="myDiv"></div> <script> console.log(myDiv.parentElement);//body console.log(document.body.parentElement);//html console.log(document.documentElement.parentElement);//null console.log(document.parentElement);//null </script>
[注意]在IE瀏覽器中,只有Element元素節點才有該屬性,其他瀏覽器則是所有類型的節點都有該屬性
<div id="test">123</div> <script> //IE瀏覽器返回undefined,其他瀏覽器返回<div id="test">123</div> console.log(test.firstChild.parentElement); //所有瀏覽器都返回<body> console.log(test.parentElement); </script>
childNodes
childNodes是一個只讀的類數組對象NodeList對象,它保存著該節點的第一層子節點
<ul id="myUl"> <li><div></div></li> </ul> <script> var myUl = document.getElementById('myUl'); //結果是只包含一個li元素的類數組對象[li] console.log(myUl.childNodes); </script>
children
children是一個只讀的類數組對象HTMLCollection對象,但它保存的是該節點的第一層元素子節點
<div id="myDiv">123</div> <script> var myDiv = document.getElementById('myDiv'); //childNodes包含所有類型的節點,所以輸出[text] console.log(myDiv.childNodes); //children只包含元素節點,所以輸出[] console.log(myDiv.children); </script>
childElementCount
返回子元素節點的個數,相當于children.length
[注意]IE8-瀏覽器不支持
<ul id="myUl"> <li></li> <li></li> </ul> <script> var myUl = document.getElementById('myUl'); console.log(myUl.childNodes.length);//5,IE8-瀏覽器返回2,因為不包括空文本節點 console.log(myUl.children.length);//2 console.log(myUl.childElementCount);//2,IE8-瀏覽器返回undefined </script>
firstChild
第一個子節點
lastChild
最后一個子節點
firstElementChild
第一個元素子節點
lastElementChild
最后一個元素子節點
上面四個屬性,IE8-瀏覽器和標準瀏覽器的表現并不一致。IE8-瀏覽器不考慮空白文本節點,且不支持firstElementChild和lastElementChild
//ul標簽和li標簽之間有兩個空白文本節點,所以按照標準來說,ul的子節點包括[空白文本節點、li元素節點、空白文本節點]。但在IE8-瀏覽器中,ul的子節點只包括[li元素節點] <ul> <li></li> </ul>
<ul id="list"> <li>1</li> <li>2</li> <li>3</li> </ul> <script> console.log(list.firstChild);//標準瀏覽器中返回空白文本節點,IE8-瀏覽器中返回<li>1</li> console.log(list.lastChild);//標準瀏覽器中返回空白文本節點,IE8-瀏覽器中返回<li>3</li> console.log(list.firstElementChild);//標準瀏覽器中<li>1</li>,IE8-瀏覽器中返回undefined console.log(list.lastElementChild);//標準瀏覽器中<li>3</li>,IE8-瀏覽器中返回undefined </script>
nextSibling
后一個節點
previousSibling
前一個節點
nextElementSibling
后一個元素節點
previousElementSibling
前一個元素節點
與子級屬性類似,上面四個屬性,IE8-瀏覽器和標準瀏覽器的表現并不一致。IE8-瀏覽器不考慮空白文本節點,且不支持nextElementSibling和previousElementSibling
<ul> <li>1</li> <li id="myLi">2</li> <li>3</li> </ul> <script> var myLi = document.getElementById('myLi'); console.log(myLi.nextSibling);//空白節點,IE8-瀏覽器返回<li>3</li> console.log(myLi.nextElementSibling);//<li>3</li>,IE8-瀏覽器返回undefined console.log(myLi.previousSibling);//空白節點,IE8-瀏覽器返回<li>1</li> console.log(myLi.previousElementSibling);//<li>1</li>,IE8-瀏覽器返回undefined </script>
包含方法hasChildNodes()
hasChildNodes()方法在包含一個或多個子節點時返回true,比查詢childNodes列表的length屬性更簡單
<div id="myDiv">123</div> <script> var myDiv = document.getElementById('myDiv'); console.log(myDiv.childNodes.length);//1 console.log(myDiv.hasChildNodes());//true </script>
<div id="myDiv"></div> <script> var myDiv = document.getElementById('myDiv'); console.log(myDiv.childNodes.length);//0 console.log(myDiv.hasChildNodes());//false </script>
contains()
contains方法接受一個節點作為參數,返回一個布爾值,表示參數節點是否為當前節點的后代節點。參數為后代節點即可,不一定是第一層子節點
<div id="myDiv"> <ul id="myUl"> <li id="myLi"></li> <li></li> </ul> </div> <script> console.log(myDiv.contains(myLi));//true console.log(myDiv.contains(myUl));//true console.log(myDiv.contains(myDiv));//true </script>
[注意]IE和safari不支持document.contains()方法,只支持元素節點的contains()方法
//IE和safari報錯,其他瀏覽器返回true console.log(document.contains(document.body));
compareDocumentPosition()
compareDocumentPosition方法用于確定節點間的關系,返回一個表示該關系的位掩碼
000000 0 兩個節點相同
000001 1 兩個節點不在同一個文檔(即有一個節點不在當前文檔)
000010 2 參數節點在當前節點的前面
000100 4 參數節點在當前節點的后面
001000 8 參數節點包含當前節點
010000 16 當前節點包含參數節點
100000 32 瀏覽器的私有用途
<div id="myDiv"> <ul id="myUl"> <li id="myLi1"></li> <li id="myLi2"></li> </ul> </div> <script> //20=16+4,因為myUl節點被myDiv節點包含,也位于myDiv節點的后面 console.log(myDiv.compareDocumentPosition(myUl)); //10=8+2,因為myDiv節點包含myUl節點,也位于myUl節點的前面 console.log(myUl.compareDocumentPosition(myDiv)); //0,兩個節點相同 console.log(myDiv.compareDocumentPosition(myDiv)); //4,myLi2在myLi1節點的后面 console.log(myLi1.compareDocumentPosition(myLi2)); //2,myLi1在myLi2節點的前面 console.log(myLi2.compareDocumentPosition(myLi1)); </script>
isSameNode()和isEqualNode()
這兩個方法都接受一個節點參數,并在傳入節點與引用節點相同或相等時返回true
所謂相同(same),指的是兩個節點引用的是同一個對象
所謂相等(equal),指的是兩個節點是相同的類型,具有相等的屬性(nodeName、nodeValue等等),而且它們的attributes和childNodes屬性也相等(相同位置包含相同的值)
[注意]firefox不支持isSameNode()方法,而IE8-瀏覽器兩個方法都不支持
<script> var div1 = document.createElement('div'); div1.setAttribute("title","test"); var div2 = document.createElement('div'); div2.setAttribute("title","test"); console.log(div1.isSameNode(div1));//true console.log(div1.isEqualNode(div2));//true console.log(div1.isSameNode(div2));//false </script>
寫在后面
這里列的很多方法大家可能都沒見過,或者學過JQuery之后對這些方法既熟悉又陌生,大家可以把我當這些小例子運行一下,就能更直觀的區分這些方法之間的關聯和區別,這對我們后面的分享和學習有一定的理解。
1、JavaScript設計模式之策略模式(Strategy Pattern)
2、JavaScript設計模式之職責鏈模式(Chain of Responsibility...)
3、JavaScript設計模式之享元模式(flyweight Pattern)
4、JavaScript設計模式之裝飾者模式(Decorator Pattern)
5、JavaScript設計模式之代理模式(Proxy Pattern)
6、JavaScript設計模式之組合模式(Composite Pattern)
7、JavaScript設計模式之工廠模式(Factory Method Pattern)
8、JavaScript設計模式之中介者模式(Mediator Pattern)
....
參考文章:
https://www.cnblogs.com/xiaohuochai/p/5785297.html
http://www.voidcn.com/article/p-gasrrkzi-bpb.html
https://www.cnblogs.com/zhishaofei/p/4091865.html
一節我們說JS主要由三部分組成:ES、DOM和BOM,接下來學生就給大家簡單介紹一下他們。
ECMAScript
ECMAScript是什么
ES主要定義了基礎的語法結構,以及一些內置對象。
語法就是進行溝通的規則,比如我們在代碼中寫“彈出提示框”,這樣并不會彈出來,而寫“alert()”就可以彈出來了,這就是因為ES的語法是那么規定的。對于一種編程語言來說通常都會規定定義變量、判斷、循環、運算、語句集(比如函數)的定義及調用等規則,ES當然也不例外,也規定了這些內容。以前學生在單位的一次講課中說:什么是程序,程序就是流程加順序。雖然這種說法不夠嚴謹,不過程序的核心應該還是流程。
ES是一種面向對象的語言,所以他的語法中還定義了很多對象相關的內容,比如最常見的this、prototype等,而且還定義了一些內置的對象,比如Number、String、Array、Math以及RegExp等。
ES的通用語法是很容易學習的,只要有點其他語言的基礎,入手非常簡單,這也就是一般都會覺得JS入門很容易的原因。不過ES中對象相關的語法就沒那么容易了,這也是ES(或者JS)的重點和難點,學生會在后面重點進行講解,讓大家徹底掌握。
發展
ES所對應的ECMA-262標準從1997年發布的第一個版本一直到現在一共發布到了六個版本,第六版于今年(2015年)6月份剛剛發布,他的正式名稱是ECMAScript 2015(簡稱ES2015),因為是第六版所以也有的地方叫他ECMAScript6,我們看到后知道他們是同一個東西就可以了。
ES2015中增加了很多新的特性,特別是啟用了class關鍵字(不過并不是面向類的語言,學生會在ES2015相關章節中給大家詳細分析),這樣使用起來就更加方便了。不過ES的本質并沒有發生變化,他依然是一種基于對象的語言,在理解了其本質之后無論哪個版本都可以非常容易地掌握,他們之間的區別無非就是一些具體語法和功能上的增強。學生后面將以現在最通用的ES5.1版為基礎給大家進行講解,最后再補充ES2015中新增的內容。
另外,我們要清楚ES只是一套標準,具體的實現還需要各個瀏覽器的支持,不同瀏覽器對ES的支持也不完全相同,而且在ES的基礎上不同的瀏覽器也都進行了自己相應的擴充,這就造成了瀏覽器兼容性的問題。
DOM
我們前面說過,ES的標準化主要是為了解決各大瀏覽器廠商(特別是微軟和網景公司)對腳本語言語法的實現不統一。不過他們在瀏覽器上的競爭并沒有因為ES的出現而終止,微軟為了占領更大的市場就在自己的Internet Explorer瀏覽器上加入了很多專有的屬性,比如VBScript和ActiveX,而使用了這些技術的網頁必須使用微軟的平臺和瀏覽器才可以正常顯示,這就給開發者帶來了麻煩,這時W3C的一些成員公司就提議創建一套標準將頁面文檔的結構暴露給腳本,從而使腳本可以統一操作頁面的內容,這樣最后就制定出了DOM標準。
DOM是Document Object Model的縮寫,表示文檔對象模型,他定義了文檔對象的結構及其操作方法等內容。為什么叫對象模型呢?我們前面說過ES是一種面向對象的語言,他要操作的目標是對象,而DOM就是將html文檔轉換(或者對應)成ES可以操作的對象的一種模型。
DOM雖然是因為瀏覽器而制定的,但他現在不僅可以用在瀏覽器所用的Html文件中,而且還可以用到很多其他格式的文件中,比如服務端經常用來配置信息的XML文件、Flex的mxml文件以及表示矢量圖的SVG格式文件等,這些都符合DOM標準。
另外,DOM主要是定義了文檔(可以理解為符合相應格式的頁面文件)和文檔對象以及其操作方法的對應關系,而跟具體的語言無關,所以DOM不僅適用于ES,還適用于很多別的語言,比如Java中的dom4j也是DOM的一種實現。而且DOM中規定操作文檔的方法都是通過接口定義的,這樣不同的語言就可以按照自己的語法來進行實現了。
BOM
JS的功能并不僅限于對文檔的操作,有時候還需要對瀏覽器直接進行操作,比如查看當前頁面的url地址、控制瀏覽器前進、后退、以及HTML5中獲取位置信息、WebSocket等都需要對瀏覽器進行操作,而且最簡單的alert、setTimeout和setInterval也是需要瀏覽器來完成的。
ES對瀏覽器操作的處理方法和對文檔操作的處理方法一樣,依然是將瀏覽器轉換為一個對象,這就是瀏覽器對象(Browser Object),他所對應的模型就叫瀏覽器對象模型(Browser Object Mode),簡稱BOM。
HTML5
Html5是近兩年非常熱的一個名詞,到底什么是Html5呢?
從名字就可以看出來他是和網頁相關的一個東西,而網頁的三大組成部分依然是文檔結構、展示和動作控制,他們所對應的技術分別是html、css和JS,前兩者都屬于DOM中的內容(CSS作為文檔的一種特殊節點或者屬性,也屬于DOM的一部分,而且DOM中有專門的相關標準),JS可以對DOM進行操作。
Html5的主要貢獻就是擴展了html的標簽(同時也去掉了一些原先的標簽),比如新增了section、article、header、footer、audio、video以及備受關注的canvas標簽,當然也相應地擴展了DOM,另外Html5也對BOM進行了擴展,使得JS操作瀏覽器的功能更加強大,而且也促進了BOM標準化。
節內容是"VBA信息獲取與處理"教程中第八個專題"VBA與HTML文檔"的第五節。,希望想掌握這方面知識的朋友能參考我的教程學習。
大家好,我們繼續對HTML文檔進行學習,在前幾節中我們認識了網頁文檔上面的各種元素,那么我們又該怎么訪問他們呢,是如何實現呢?其實,HTML文檔,提供了訪問其元素的端口,這就是HTML DOM,其定義了一套標準的針對 HTML 文檔的對象訪問或操作的機制。HTML DOM 定義了所有 HTML 元素的對象和屬性,以及訪問它們的方法。換言之,HTML DOM 是關于如何獲取、修改、添加或刪除 HTML 元素的標準。
每個載入瀏覽器的 HTML 文檔都會成為 Document 對象。Document 對象使我們可以從腳本中對 HTML 頁面中的所有元素進行訪問。Document 對象是 HTML 文檔的根節點。
特別注意:Document 對象是 Window 對象的一部分,可通過 window.document 屬性對其進行訪問。
集合 描述
all[] 提供對文檔中所有 HTML 元素的訪問。
anchors[] 返回對文檔中所有 Anchor 對象的引用。
applets 返回對文檔中所有 Applet 對象的引用。
forms[] 返回對文檔中所有 Form 對象引用。
images[] 返回對文檔中所有 Image 對象引用。
links[] 返回對文檔中所有 Area 和 Link 對象引用。
VBA直接支持調用的對象有限,如下:
對象 描述
Document 代表整個 HTML 文檔,可被用來訪問頁面中的所有元素
Anchors 代表 <a> 元素集合
Body 代表 <body> 元素
Forms 代表 <form> 元素集合
Frames 代表 <frame> 元素或<iframe> 元素集合
Images 代表 <img> 元素集合
Links 代表 <link> 元素集合
Options 代表 <option> 元素集合(select元素里面可以直接使用)
Cells 代表 <td> 元素集合(table元素里面可以直接使用)
Rows 代表 <tr> 元素集合(table元素里面可以直接使用)
All 對象集合,提供對文檔中所有 HTML 元素的訪問。
上述VBA支持直接調用對象的元素,調用起來就非常方便了,可以用序號調用,例如forms(0),也可以按名稱/ID調用,例如forms("名稱/ID")。其他沒法直接調用對象的元素,可以間接從通用all對象集合中去調用該元素或該元素對應的dom對象。
在HTML DOM中,所有事物都是節點。DOM 是被視為節點樹的 HTML文檔的每一部分都是節點,整個文檔被定義為一個文檔節點,每個標簽是一個元素節點,包含在元素中的文本是文本節點,每一個元素的屬性是一個屬性節點。如下:
1)整個文檔是一個文檔節點
2)每個 HTML 元素是元素節點
3)HTML 元素內的文本是文本節點
4)每個 HTML 屬性是屬性節點
5)注釋是注釋節點
HTML DOM 將 HTML 文檔視作樹結構。這種結構被稱為節點樹,這時一個非常形象的比喻,根節點就是html,主干就是body等,枝干就是body內含的各種元素節點,葉子和花就是元素節點關聯的元素的屬性(屬性節點)或內含文本(文本節點)。
通過 HTML DOM,樹中的所有節點均可通過 JavaScript 進行訪問。所有 HTML 元素(節點)均可被修改,也可以創建或刪除節點。節點樹中的節點彼此擁有層級關系。父(parent)、子(child)和同胞(sibling)等術語用于描述這些關系。父節點擁有子節點。同級的子節點被稱為同胞(兄弟或姐妹)。
網頁文檔,可以說是由元素組合而成的,也可以說是由節點連接而成的樹構造的。節點是文檔樹結構中特有的名詞,元素是節點,但是節點不一定是元素,節點還有文檔節點、文本節點、屬性節點等;元素是元素節點的擴展,元素可以擁有屬性還有文本。初學者不是很必要糾結元素和節點的區別,這個需要甚至數據結構、類和繼承等知識。可大致理解為,同一個html dom對象,提供的兩個不同接口。如下的程序,你會發現,他既有支持node(節點)的相關屬性和方法,也提供了element(元素)的相關屬性和方法。
Sub MYNZ()
Dim ie, dmt, bd
Set ie = CreateObject("InternetExplorer.Application") '創建一個IE對象
With ie
.Visible = True '顯示它
.navigate "http://www.baidu.com" '加載某個頁面
Do Until .ReadyState = 4 '等待頁面加載完畢
DoEvents
Loop
Set dmt = .document '將IE瀏覽器加載的頁面文檔,賦予dmt變量
Set bd = dmt.body '將文檔的body賦予bd變量
End With
End Sub
代碼截圖:
按F8鍵運行截圖:
屬性是節點(HTML 元素)的值,您能夠獲取或設置。所有 HTML 元素被定義為對象,而編程接口則是對象方法和對象屬性。我們看看下面一些常見的屬性:
1)innerHTML 屬性 對象內部的HTML代碼,是獲取元素內容的最簡單方法。innerHTML 屬性對于獲取或替換 HTML 元素的內容很有用。
下面的代碼獲取 id="intro" 的 <p> 元素的 innerHTML:
<script>
var txt=document.getElementById("intro").innerHTML;
document.write(txt);
2)OuterHtml:對象的HTML代碼,包括對象本身的HTML標簽
3)innerText:對象內部的文本
4)OuterText:對象的文本,包括對象本身的文本
5)nodeName 屬性 nodeName 屬性規定節點的名稱。
nodeName 是只讀的
元素節點的 nodeName 與標簽名相同
屬性節點的 nodeName 與屬性名相同
文本節點的 nodeName 始終是 #text
文檔節點的 nodeName 始終是 #document
注釋:nodeName 始終包含 HTML 元素的大寫字母標簽名。
6)nodeValue 屬性 nodeValue 屬性規定節點的值。
元素節點的 nodeValue 是 undefined 或 null
文本節點的 nodeValue 是文本本身
屬性節點的 nodeValue 是屬性值
7)nodeType 屬性 nodeType 屬性返回節點的類型。nodeType 是只讀的。
比較重要的節點類型有:
元素類型 NodeType
元素 1
屬性 2
文本 3
注釋 8
文檔 9
以上只是給出了屬性值,大家在使用的時候要注意。
本節知識點回向:
什么是HTML DOM文檔的屬性,常用的屬性有哪些。
本節參考文件:008工作表.xlsm
在我的系列書籍中一直在強調"搭積木"的編程思路,這也是學習利用VBA的主要方法,特別是職場人員,更是要采用這種方案。其主要的內涵:
1 代碼不要自己全部的錄入。你要做的是把積木放在合適的位置然后去修正代碼,一定要拷貝,從你的積木庫中去拷貝,然后修正代碼,把時間利用到高效的思考上。
2 建立自己的"積木庫"。平時在學習過程中,把自己認為有用的代碼放在一起,多積累,在用到的時候,可以隨時拿來。你的積木庫資料越多,你做程序的思路就會越廣。
VBA是利用Office實現個人小型辦公自動化的有效手段(工具)。這是我對VBA的應用界定。在取代OFFICE新的辦公軟件沒有到來之前,誰能在數據處理方面做到極致,誰就是王者。其中登峰至極的技能非VBA莫屬!
我記得20年前自己初學VBA時,那時的資料甚少,只能看源碼自己琢磨,真的很難。20年過去了,為了不讓學習VBA的朋友重復我之前的經歷,我根據自己多年VBA實際利用經驗,推出了六部VBA專門教程:
第一套:VBA代碼解決方案 是VBA中各個知識點的講解,教程共147講,覆蓋絕大多數的VBA知識點,初學必備;
第二套:VBA數據庫解決方案 數據庫是數據處理的專業利器,教程中詳細介紹了利用ADO連接ACCDB和EXCEL的方法和實例操作,適合中級人員的學習。
第三套:VBA數組與字典解決方案 數組和字典是VBA的精華,字典是VBA代碼水平提高的有效手段,值得深入的學習,是初級及中級人員代碼精進的手段。
第四套:VBA代碼解決方案之視頻 是專門面向初學者的視頻講解,可以快速入門,更快的掌握這門技能。這套教程是第一套教程的視頻講解,聽元音更易接受。
第五套:VBA中類的解讀和利用 這是一部高級教程,講解類的虛無與肉身的度化,類的利用雖然較少,但仔細的學習可以促進自己VBA理論的提高。這套教程的領會主要是讀者的領悟了,領悟一種佛學的哲理。
第六套教程:《VBA信息獲取與處理》,這是一部高級教程,涉及范圍更廣,實用性更強,面向中高級人員。教程共二十個專題,包括:跨應用程序信息獲得、隨機信息的利用、電子郵件的發送、VBA互聯網數據抓取、VBA延時操作,剪切板應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定制工作表信息函數等等內容。
大家可以根據以上資料1→3→2→6→5或者是4→3→2→6→5的順序逐漸深入的逐漸學習。教程提供講解的同時提供了大量的積木,如需要可以WeChat: NZ9668
如太白詩云:眾鳥高飛盡,孤云獨去閑。相看兩不厭,只有敬亭山。學習的過程也是修心的過程,修一個平靜的心。在代碼的世界中,心平靜了,心情好了,身體自然而然就好。心靜則正,內心里沒有那么多邪知邪見,也就沒有那么多妄想。利人就是利己。這些教程也是為幫助大家起航,助上我自己之力,我的上述教程是我多的經驗的傳遞,
"水善利萬物而不爭",綿綿密密,微則無聲,巨則洶涌。學習亦如此,知道什么是自己所需要的,不要蜷縮在一小塊自認為天堂的世界里,待到暮年時再去做自欺欺人的言論。要努力提高自己,用一顆充滿生機的心靈,把握現在,這才是進取。越是有意義的事情,困難會越多。愿力決定始終,智慧決定成敗。不管遇到什么,都是風景。看淡紛爭,看輕得失。茶,滿也好,少也好,不要計較;濃也好,淡也好,其中自有值得品的味道。去感悟真實的時間,靜下心,多學習,積累福報。而不是天天混日子,也不是天天熬日子。在后疫情更加嚴峻的存量殘殺世界中,為自己的生存進行知識的儲備,特別是新知識的儲備。學習時微而無聲,利用時則巨則洶涌。
每一分收獲都是成長的記錄,怎無憑,正是這種執著,成就了朝霞的燦爛。最后將一闕詞送給致力于VBA學習的朋友,讓大家感受一下學習過程的枯燥與執著:
浮云掠過,暗語無聲,
唯有清風,驚了夢中啼鶯。
望星,疏移北斗,
奈將往事雁同行。
阡陌人,昏燈明暗,
忍顧長亭。
多少VBA人,
暗夜中,悄聲尋夢,盼卻天明。
怎無憑!
回向學習利用VBA的歷歷往事,不勝感慨,謹以這些文字給大家,分享我多年工作實際經驗的成果,隨喜這些有用的東西,給確實需要利用VBA的同路人。
分享成果,隨喜正能量
*請認真填寫需求信息,我們會在24小時內與您取得聯系。