大家好,我們今日講解「VBA信息獲取與處理」教程中第十二個專題「VBA中剪貼板(Clipboard)的應用」的第三節「利用API函數完成剪貼板Clipboard的操作」,這個專題是非常有用的知識點,希望大家能掌握利用。
第三節 利用API函數完成剪貼板Clipboard的操作在上一講中,我們對剪貼板中的文本簡單操作進行了了解,是利用MSForms.DataObject對象來完成的,這種對象有前期綁定和後期綁定兩種方式都可以實現目標。今天我們講解利用API函數來完成對剪貼板的操作。這種方式的操作可以設計到各個方面。1 必要的API函數了解為了利用API函數達到我們的目的,我們先來了解一下將利用到的API函數。1)OpenClipboard函數:作用是打開剪貼板聲明及引用:Declare Function OpenClipboard Lib "user32" Alias "OpenClipboard" (ByValhwnd As Long) As Long如果調用成功,它會返回一個非0值;如果失敗,則返回0;如果有其他窗口已經打開剪貼板,這個函數會調用失敗。如果函數調用成功,一定要記得使用CloseClipboard函數關閉它。2)GetClipboardData函數:作用是讀取剪貼板裡面的數據聲明及引用:Declare Function GetClipboardData Lib "user32" (ByValwFormat As Long) As Long 如果調用成功,返回剪貼板中以指定格式存放的剪貼板對象的句柄;如果調用失敗,返回Null;在使用GetClipboardData之前,必須先成功調用OpenClipboard3)CopyMemory函數將一定字節長度的數據從內存中的一個位置(源)複製到另一個位置(目的地)聲明及引用:Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Destination:目的地的第一個字節的內存地址(指針)Source: 源的第一個字節的內存地址(指針)4)GlobalLock函數鎖定一個全局內存對象並返回它所佔用內存塊的第一個字節的內存地址(指針)聲明及引用:Declare Function GlobalLock Lib "kernel32" (ByValhMem As Long) As Long5)GlobalSize函數返回給定內存對象的字節長度聲明及引用:Declare Function GlobalSize Lib "kernel32" (ByValhMem As Long) As Long6)GlobalUnlock函數將可移動(GMEM_MOVEABLE)內存對象的鎖計數器數值-1,對於固定位置(GMEM_FIXED)的內存對象,這個函數不起作用聲明及引用:Declare Function GlobalUnlock Lib "kernel32" (ByValhMem As Long) As Long聲明及引用:Declare Function CloseClipboard Lib "user32"() As Long有了上面的7個API函數,我們就可以利用API函數來操控剪貼板了。2 利用API函數實現剪貼板操作的代碼實現Declare Function OpenClipboard Lib "user32" (ByValhwnd As Long) As LongDeclare Function GetClipboardData Lib "user32" (ByValwFormat As Long) As LongDeclare Function CloseClipboard Lib "user32" () As LongDeclare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Declare Function GlobalLock Lib "kernel32" (ByValhMem As Long) As LongDeclare Function GlobalUnlock Lib "kernel32" (ByValhMem As Long) As LongDeclare Function GlobalSize Lib "kernel32" (ByValhMem As Long) As LongPrivate Const CF_TEXT = 1 Dim bytClipData() As Byte Dim sClipString As String If OpenClipboard(ByVal 0&) Then '如果OpenClipboard函數返回非0值,說明成功打開剪貼板hMem = GetClipboardData(CF_TEXT) '獲取剪貼板中以文本格式存在的內存對象的句柄 If CBool(hMem) Then '如果剪貼板中對應的格式不存在,此時的hMem會是0(Null),這裡用CBool把它轉換成Boolean類型加以判斷lpData = GlobalLock(hMem) '獲取內存對象第一個字節的內存地址nClipSize = GlobalSize(hMem) '獲取內存對象的字節長度ReDimbytClipData(1 To nClipSize) '修改緩衝字節數組的長度,確保能夠容納內存對象的全部數據CopyMemorybytClipData(1), ByVallpData, nClipSize '複製內存對象的數據到字節數組中,注意Byval的用法sClipString = StrConv(bytClipData, vbUnicode) '將字節轉化成字符串MsgBox "當前剪貼板內的文本是:" &vbCrLf&sClipString '將結果顯示給用戶代碼截圖:1)If OpenClipboard(ByVal 0&) Then '打開剪貼板,如果OpenClipboard函數返回非0值,說明成功打開剪貼板。2)hMem = GetClipboardData(CF_TEXT) '獲取剪貼板中以文本格式存在的內存對象的句柄,各個值如下:Public Const CF_BITMAP = 2Public Const CF_METAFILEPICT = 33)If CBool(hMem) Then '當取得hMem的返回之後,如果剪貼板中對應的格式不存在,此時的hMem會是0(Null),這裡用CBool把它轉換成Boolean類型加以判斷4) lpData = GlobalLock(hMem) '獲取內存對象第一個字節的內存地址nClipSize = GlobalSize(hMem) '獲取內存對象的字節長度5)CopyMemorybytClipData(1), ByVallpData, nClipSize '複製內存對象的數據到字節數組中,注意Byval的用法sClipString = StrConv(bytClipData, vbUnicode) '將字節轉化成字符串,6)StrConv函數返回按指定類型轉換的 Variant (String)。語法:StrConv(string, conversion, LCID) conversion 必要參數。Integer。其值的和決定轉換的類型。LCID 可選的。如果與系統LocaleID不同,則為LocaleID(系統LocaleID為預設值。)vbUpperCase 1 將字符串文字轉成大寫。vbLowerCase 2 將字符串文字轉成小寫。vbProperCase 3 將字符串中每個字的開頭字母轉成大寫。vbWide* 4* 將字符串中單字節字符轉成雙字節字符。vbNarrow* 8* 將字符串中雙字節字符轉成單字節字符。vbKatakana** 16** 將字符串中平假名字符轉成片假名字符。vbHiragana** 32** 將字符串中片假名字符轉成平假名字符。vbUnicode 64 根據系統的預設碼頁將字符串轉成 Unicode。vbFromUnicode128 將字符串由 Unicode 轉成系統的預設碼頁。7)CloseClipboard關閉剪貼板,以便其他程序再次訪問。3 利用API函數實現剪貼板操作的實現效果這講給大家講解了利用API函數實現剪貼板操作的方法,是非常重要的一講內容。 積木編程的思路內涵:在我的系列書籍中一直在強調「搭積木」的編程思路,這也是學習利用VBA的主要方法,特別是職場人員,更是要採用這種方案。其主要的內涵:1 代碼不要自己全部的錄入。你要做的是把積木放在合適的位置然後去修正代碼,一定要拷貝,從你的積木庫中去拷貝,然後修正代碼,把時間利用到高效的思考上。2 建立自己的「積木庫」。平時在學習過程中,把自己認為有用的代碼放在一起,多積累,在用到的時候,可以隨時拿來。你的積木庫資料越多,你做程序的思路就會越廣。VBA的應用界定及學習教程:VBA是利用Office實現個人小型辦公自動化的有效手段(工具)。這是我對VBA的應用界定。在取代OFFICE新的辦公軟體沒有到來之前,誰能在數據處理方面做到極致,誰就是王者。其中登峰至極的技能非VBA莫屬!我記得20年前自己初學VBA時,那時的資料甚少,只能看源碼自己琢磨,真的很難。20年過去了,為了不讓學習VBA的朋友重複我之前的經歷,我根據自己多年VBA實際利用經驗,推出了六部VBA專門教程:第一套:VBA代碼解決方案是VBA中各個知識點的講解,教程共147講,覆蓋絕大多數的VBA知識點,提供的程序文件更是一座不可多得的代碼寶庫,是初學及中級人員必備教程;目前這套教程提供的版本是修訂第二版,程序文件通過32位和64位兩種OFFICE系統測試。第二套:VBA資料庫解決方案資料庫是數據處理的專業利器,教程中詳細介紹了利用ADO連接ACCDB和EXCEL的方法和實例操作,適合中級人員的學習。目前這套教程提供的是修訂第一版教程,程序文件通過32位和64位兩種OFFICE系統測試。第三套:VBA數組與字典解決方案 數組和字典是VBA的精華,字典是VBA代碼水平提高的有效手段,值得深入的學習,是初級及中級人員代碼精進的手段。目前這套教程提供的版本是修訂第一版,程序文件通過32位和64位兩種OFFICE系統測試。第四套:VBA代碼解決方案之視頻是專門面向初學者的視頻講解,可以快速入門,更快的掌握這門技能。這套教程是第一套教程(修訂一版)的視頻講解,聽元音更易接受。這套教程還會額外提供通過32位和64位兩種OFFICE系統測試的程序文件。第五套:VBA中類的解讀和利用 這是一部高級教程,講解類的虛無與肉身的度化,類的利用雖然較少,但仔細的學習可以促進自己VBA理論的提高。這套教程的領會主要是讀者的領悟了,領悟一種佛學的哲理。第六套教程:《VBA信息獲取與處理》,這是一部高級教程,涉及範圍更廣,實用性更強,面向中高級人員。教程共二十個專題,包括:跨應用程式信息獲得、隨機信息的利用、電子郵件的發送、VBA網際網路數據抓取、VBA延時操作,剪切板應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定製工作表信息函數等等內容。上述教程的學習順序:1→3→2→6→5或者4→3→2→6→5。提供的程序文件更是一座巨大的代碼庫,供讀者使用,如需要可以WeChat: NZ9668學習VBA是個過程,也需要經歷一種枯燥的感覺「眾鳥高飛盡,孤雲獨去閒。相看兩不厭,只有敬亭山」。學習的過程也是修心的過程,修一個平靜的心。在代碼的世界中,心平靜了,心情好了,身體自然而然就好。心靜則正,內心裡沒有那麼多邪知邪見,也就沒有那麼多妄想。利人就是利己。我的教程助力給正在努力的朋友。「水善利萬物而不爭」,綿綿密密,微則無聲,巨則洶湧。學習亦如此,知道什麼是自己所需要的,不要蜷縮在一小塊自認為天堂的世界裡,待到暮年時再去做自欺欺人的言論。要努力提高自己,用一顆充滿生機的心靈,把握現在,這才是進取。越是有意義的事情,困難會越多。願力決定始終,智慧決定成敗。不管遇到什麼,都是風景。看淡紛爭,看輕得失。學習時微而無聲,利用時則巨則洶湧。「路漫漫其修遠兮,吾將上下而求索」每一分收穫都是成長的記錄,怎無憑,正是這種執著,成就了朝霞的燦爛。最後將一闕詞送給致力於VBA學習的朋友,讓大家感受一下學習過程的枯燥與執著:分享我多年工作實際經驗的成果,隨喜這些有用的東西,給確實需要利用VBA的同路人。回向學習利用VBA的歷歷往事,不勝感慨,謹以這些文字以紀念,
加微信NZ9668可獲得詳細資料信息
_____________________________
更多關聯閱讀
![]()
![]()
![]()
![]()
![]()
![]()