我給VBA的定義:VBA是個人小型自動化處理的有效工具。利用好了,可以大大提高自己的勞動效率,而且可以提高數據處理的準確度。我推出的VBA系列教程共九套和一部VBA漢英手冊,現在已經全部完成,希望大家利用、學習。
如果您只是一般的職場VBA需求,可以打包選擇7.1.3.9教程+漢英手冊,第7套教程是入門,第1套教程是入門后的提高,第3套教程字典是必備的VBA之精華,第9套教程是實用的典型案例講解。這四套教程內容掌握后足以處理一般工作中的問題,實際寫代碼的時候再輔助代碼漢英手冊,足矣!如果您想進一步提高,就需要選擇高級階段的教程了。
VBA是面向對象編程的語言,博大精深。很多朋友咨詢VBA的學習方法,我會陸續給大家講解一些我的經驗,大家可以慢慢體會。今日的內容是如何學習VBA_3.3.9:利用“搭積木”思想,快速有效地完成你的VBA代碼
【分享成果,隨喜正能量】262 什么是成年人最頂級的自律呢?就是不拆穿,但是會遠離,不動聲色的淘汰身邊的爛人爛事。黃連救人無功,人參殺人無過,世上的大部人,寧愿在甜言蜜語中死去,也不愿在忠言逆耳中重生。這就是人性,所以要克制自己去糾正別人的欲望,不要隨意介入你的因果,你介入誰的因,你就要承擔誰的果。
3.3.9 利用“搭積木”思想,快速有效地完成你的VBA代碼
完成你的VBA代碼只要三步:找到“積木”;修正“積木”;放好“積木”
在上一篇講如何寫代碼程序的時候,我講了換一種思路來解決問題,今日我將繼續此思路的延伸——如何寫VBA的程序。
我一直在推廣搭積木的思想,對于一塊積木,在不同的程序中只是參數的不同,起的作用是相同的,那么怎么樣利用好這些積木呢?就是要修正必要的語句。這個程序中是這種寫法,在另外的程序中就是其他的表述形式,當你理解了我給出的積木的作用,你就可以靈活地利用了。
今日仍講解一個查找程序,這個查找程序在我之前的文章中有過講解,是利用《VBA代碼解決方案》的內容完成的一個多種查找方式的匯總,在推出了《VBA數據庫解決方案》后,今日我們將利用數據庫的知識來完成這段程序,讓大家體會一下兩者的不同。教程可以作為你的積木庫,里面有大量的積木等你選擇。當然,程序無所謂好與壞,都是一樣的應用,我也反復的聲明,我推出的系列教程是面向職場人員,以實用為目的,以解決工作中的實際問題為主要方向,一些細枝末節的推敲在這里很少提到。
我們的查找數據,和被查找數據如下圖:
“FIND”頁是數據源,我們要在源數據中按照條件1查找“MY”工作表中各行的數值,然后將對應的數據放到后面的各列中,如何實現呢?
1 分析:要想用數據庫解決上述問題,我們首先想到用數據庫去連接上述兩個工作表,然后提取出“FIND”工作表中與“NY”工作表中A列相同的BCD列的值,建立什么連接呢? 很顯然,用左外連接和右外連接都能解決此問題,這里我們選擇的是左外連接。
2 找積木:打開左外連接的積木塊:要選擇工作表相關的內容,因為我們要連接的是EXCEL工作表。到VBA數據庫解決方案第58講拷貝出代碼,注意《VBA數據庫解決方案》一書我是提供EXCEL程序文件的,要從程序文件中拷貝,由于有很多漢字字符,要打開漢字的錄入后拷貝:
3 修改積木:
代碼:
Sub mychazhaoONE()
Dim cnADO, rsADO As Object
Dim strPath, strSQL As String
Worksheets("MY").Select
[B:D].ClearContents
Set cnADO = CreateObject("ADODB.Connection")
Set rsADO = CreateObject("ADODB.Recordset")
strPath = ThisWorkbook.FullName
TT1 = Sheets("find").Range("a1")
SS1 = Sheets("find").Range("b1")
SS2 = Sheets("find").Range("C1")
SS3 = Sheets("find").Range("D1")
cnADO.Open "provider=Microsoft.ACE.OLEDB.12.0;extended properties='excel 12.0;hdr=yes;imex=1';data source=" & strPath
strSQL = "Select b." & SS1 & ",b." & SS2 & ",b." & SS3 & " From [MY$] as a LEFT JOIN [FIND$] as b ON (a." & TT1 & "=" & "b." & TT1 & ") "
rsADO.Open strSQL, cnADO, 1, 3
For i = 1 To rsADO.Fields.Count
Cells(1, i + 1) = rsADO.Fields(i - 1).Name
Next
Range("b2").CopyFromRecordset rsADO
rsADO.Close
cnADO.Close
Set rsADO = Nothing
Set cnADO = Nothing
End Sub
代碼截圖:
在上面的代碼中,我修正了幾處:
1 工作表名稱的修正
2 條件的修正
3 提取字段的修正
其余的沒有做任何改變。下面我們看代碼的運行:
完全符合我們的預期。
我們看到,這種修正積木再搭建的辦法可以大大節省你寶貴的時間,當然,要能順利地修正這些積木,對這些積木要理解,比如在我今天的例子中,你要深刻理解的知識點包括:
1 什么是左外連接?
2 左外連接的返回值是怎么樣的?
3 如何建立起左外連接的SQL語句?
4 SQL 語句的有效寫法。
這些當你在學習第58講的時候要解決。
4 問題的引申
上述的過程實現了對于單條件的查找,那么雙條件呢如何實現呢?這里我只給出代碼的截圖:
- MyFind.xlsm
我20多年的VBA實踐經驗,全部濃縮在下面的各個教程中: