開始前,說明一下,如果你能用三天把下面的實例看懂,也同一樣會給你帶來收獲,不要急,慢慢來,最最重要的是要懂,不懂就要問 ======================================== Sub 判斷1() '單條件判斷,下面我一條條的幫你解釋一下 If Range('a1').Value > 0 Then '如果 A1 單元格的值 大于 0 的話,那么。注意,注意了,if 和 Then 必須在同一行上的哦 Range('b1') = '正數(shù)' '在 B1 單元格中輸入 '正數(shù)' Else '否則 Range('b1') = '負(fù)數(shù)或0' '在B1單元格中輸入”負(fù)數(shù)“ End If '結(jié)束判斷 End Sub ********************************************** Sub 判斷2() '多條件判斷 If Range('a1').Value > 0 Then '如果...........那么 Range('b1') = '正數(shù)' ElseIf Range('a1') = 0 Then '否則如果.........那么 Range('b1') = '等于0' ElseIf Range('B1') <= 0 Then '否則如果..........那么 Range('b1') = '負(fù)數(shù)' End If '結(jié)束判斷 End Sub ********************************************** Sub 多條件判斷2() '如過程名所描述,下面的如果后面接了很多的條件,中間用 AND 連接,AND 就是且的意思,表示兩個條件要同時成立,才會執(zhí)行其內(nèi)部的代碼。 If Range('a1') <> '' And Range('a2') <> '' Then Range('a3') = Range('a1') * Range('a2') End If End Sub *************************************************** Sub 判斷4() Range('a3') = IIf(Range('a1') <= 0, '負(fù)數(shù)或零', '負(fù)數(shù)') '這里提到的這個 IIF(條件判斷, 條件成立時的結(jié)果, 不成立時的結(jié)果) , 作用類似于在前端的 IF 函數(shù)。 End Sub ============================== 學(xué)習(xí)使用 select case 條件判斷 .........case.....end select Sub 判斷1() '單條件判斷 Select Case Range('a1').Value '這個語句的作用是根據(jù)條件的具體結(jié)果進行分別 Case Is > 0 ‘如果條件的結(jié)果大于0,則執(zhí)行下面的代碼 Range('b1') = '正數(shù)' '如果滿足上面的條件,則執(zhí)行此行代碼 Case Else '當(dāng)所有 case 條件都不滿足時,默認(rèn)執(zhí)行此條件下的代碼 Range('b1') = '負(fù)數(shù)或0' End Select '退出 select End Sub Sub 判斷2() '多條件判斷 Select Case Range('a1').Value '獲取這個條件結(jié)果 Case Is > 0 '條件結(jié)果大于0,則 單元格 B1填充 正數(shù) Range('b1') = '正數(shù)' Case Is= 0 '條件結(jié)果等于0,則 單元格 B1 填充 0 Range('b1') = '0' Case Else '以上條件都不滿足,默認(rèn)填充 負(fù)數(shù) Range('b1') = '負(fù)數(shù)' End Select End Sub Sub 判斷3() If Range('a3') < 'G' Then MsgBox 'A-G' End If End Sub ==================================== Sub if區(qū)間判斷() '如過程名描述 這是一個區(qū)間判斷 If Range('a2') <= 1000 Then '如果 單元格A2 的值 小于等于 1000,那么 執(zhí)行以下代碼 Range('b2') = 0.01 '填充B2單元格的值為 0.01 ElseIf Range('a2') <= 3000 Then '否則 如果 A2 的值 小于等于 3000,那么執(zhí)行以下代碼 Range('b2') = 0.03 '填充 B2 單元格的值為 0.03 ElseIf Range('a2') > 3000 Then '否則 如果單元格 A2 的值 大于 3000,那么執(zhí)行以下代碼 Range('b2') = 0.05 '填充 B2 單元格的值為 0.05 End If End Sub Sub select區(qū)間判斷() '仍是區(qū)間判斷的例子,不過這次使用 select case 語句操作的 Select Case Range('a2').Value '獲取條件值,即 A2 單元格的值 Case 0 To 1000 '如果值在 0 與 1000 之間 Range('b2') = 0.01 '執(zhí)行,將 B2 單元格的值填充為 0.01 Case 1001 To 3000 '如果值在 1001 與 3000 之間 Range('b2') = 0.03 '則執(zhí)行將 B2 單元格的值填充為 0.03 Case Is > 3000 '如果 值 大于 3000 Range('b2') = 0.05 ‘則執(zhí)行將 B2 單元格的值填充為 0.05 End Select End Sub ======================================= 以下代碼看看就可以,能理解最好 '移除VBA編碼保護,即解密 Sub MoveProtect() Dim FileName As String '定義一個字符串變量 FileName FileName = Application.GetOpenFilename('Excel文件(*.xls & *.xla),*.xls;*.xla', , 'VBA破解') '打開用戶指定的文件并返回打開文件的文件名,再將文件名賦于 FileName 這個變量 If FileName = CStr(False) Then '如果 FileName 變量得到的返回值是 False , 注意這個 FileName 的值是文件的絕對路徑,包含有驅(qū)動器號等信息在里,所以下面有個 Dir 函數(shù)要對這個值進行操作。 Exit Sub '那么退出此過程 Else '否則 VBAPassword FileName, False '調(diào)用私有函數(shù) VBAPassword ,并傳遞 FileName 和 False 這兩個參數(shù)過去 End If End Sub '設(shè)置VBA編碼保護 Sub SetProtect() Dim FileName As String '定義一個字符串變量 FileName FileName = Application.GetOpenFilename('Excel文件(*.xls & *.xla),*.xls;*.xla', , 'VBA破解') '同上面的過程一樣 If FileName = CStr(False) Then '意思同上面的過程,CStr() 函數(shù)說的作用是將 布爾值 false 轉(zhuǎn)換成 字符串 Exit Sub Else VBAPassword FileName, True End If End Sub Private Function VBAPassword(FileName As String, Optional Protect As Boolean = False) ' 這里是一個 私有函數(shù) (Private定義的),函數(shù)名是 VBAPassword, 參數(shù)是 FileName 和 一個可選的(optional) 參數(shù) ' Protect , 這里所謂的可選參數(shù),即表示,調(diào)用時可以傳遞函數(shù),也可以只傳遞一個 FileName 參數(shù), ' 默認(rèn) Protect 這個參數(shù)的值是 False If Dir(FileName) = '' Then '如果 FileName 這個絕對路徑下沒有獲取到具體的文件名,或說文件不存在 Exit Function '那么退出此函數(shù) Else '否則 FileCopy FileName, FileName & '.bak' '調(diào)用FileCopy 這個函數(shù),修改文件名,在原文件名的后面添加 .bak 的后綴,保留副本 End If Dim GetData As String * 5 '定義一個字符串,長度為5 字節(jié) Open FileName For Binary As #1 '以二進制的模式打開文件,并將文件編號為 1號 文件 Dim CMGs As Long '定義一個 長整型變量 CMGs Dim DPBo As Long '定義一個 長整型變量 DPBo For i = 1 To LOF(1) '使用循環(huán)來讀取這個文件,LOF(1) 是用來獲取文件的最后一個有效字符 Get #1, i, GetData '不知道這個 Get 函數(shù)的具體用法,從本意上觀察,意思是,讀取 1號文件,將內(nèi)容存放到 GetData 這個字符串變量中 If GetData = 'CMG=''' Then CMGs = i '如果 GetData 的值是 'CMG=''', 那么 CMGs = i ,這個 i 值就是循環(huán)的當(dāng)前序號。 If GetData = '[Host' Then DPBo = i - 2: Exit For '如果 GetData 的值是 '[Host' ,那么 DPBo = i-2 并退出 此循環(huán) Next '循環(huán)下一次 If CMGs = 0 Then '如果 CMGs=0 MsgBox '請先對VBA編碼設(shè)置一個保護密碼...', 32, '提示' '彈窗提示此信息 Exit Function '退出當(dāng)前函數(shù) End If If Protect = False Then '如果 Protect=False Dim St As String * 2 '定義一個字符串變量 St 且 字符串的長度為 2 字節(jié) Dim s20 As String * 1 '定義一個字符串變量 s20 且 字符串長度為 1 字節(jié) '取得一個0D0A十六進制字串 Get #1, CMGs - 2, St '從文件 #1 的 CMGs-2 的位置讀取數(shù)據(jù),并賦值給 St '取得一個20十六制字串 Get #1, DPBo 16, s20 '從文件 #1 的 DPBo 16 的位置讀取數(shù)據(jù),并賦值給 s20 '替換加密部份機碼 For i = CMGs To DPBo Step 2 '把 CMGs 的值作為此次循環(huán)的初始值,以 DPBo 為最終值,在這個循環(huán)范圍中以 2 的步幅進行循環(huán) Put #1, i, St '在 i 的位置將 St 中的數(shù)據(jù) 寫入到 #1 文件中 Next '加入不配對符號 If (DPBo - CMGs) Mod 2 <> 0 Then '如果 DPBo - CMGs 的差 不能 被2整除 Put #1, DPBo 1, s20 '則將 s20中的數(shù)據(jù)寫入到 #1 文件中 DPBo 1 的位置 End If MsgBox '文件解密成功......', 32, '提示' Else '否則,protect <> false 時 Dim MMs As String * 5 '定義一個 長度為5 的字符串 MMs = 'DPB=''' '定義變量 MMs Put #1, CMGs, MMs '將MMs 的值寫入到 #1 文件中 CMGs 的位置 MsgBox '對文件特殊加密成功......', 32, '提示' End If Close #1 '最后必須要記得關(guān)閉文件 End Function @@@@@@@@@@@@@@@@@@@@@ 關(guān)于上題,我收集了一些相關(guān)資料,可看可不看,目前你可能比我還菜,可以有不用看 ************************ 關(guān)于 dir 函數(shù)的 第1.12例 Dir函數(shù) 一、題目: 要求編寫一段代碼,運用Dir函數(shù)返回一個文件夾的文件列表。 二、代碼: Sub 示例_1_12() Dim wjm wjm = Dir('C:\WINDOWS\WIN.ini') MsgBox wjm wjm = Dir('C:\WINDOWS\*.ini') wjm = Dir End Sub 三、代碼詳解 1、Sub 示例_1_12():宏程序的開始語句。宏名為示例_1_12。 2、Dim wjm :變量wjm聲明為可變型數(shù)據(jù)類型。 3、wjm = Dir('C:\WINDOWS\WIN.ini') : 如果該文件存在則返回“WIN.INI”(在C:\Windows 文件夾中) ,把返回的文件名賦給變量wjm 。如果該文件不存在則wjm=””。 4、wjm = Dir('C:\WINDOWS\*.ini') : 返回帶指定擴展名的文件名。如果超過一個 *.ini 文件存在,函數(shù)將返回按條件第一個找到的文件名。 5、wjm = Dir : 若第二次調(diào)用 Dir 函數(shù),但不帶任何參數(shù),則函數(shù)將返回同一目錄下的下一個 *.ini 文件。 Dir函數(shù) 返回一個字符串 String,用以表示一個文件名、目錄名或文件夾名稱,它必須與指定的模式或文件屬性、或磁盤卷標(biāo)相匹配。
Dir[(pathname[, attributes])] Dir 函數(shù)的語法具有以下幾個部分: pathname 可選參數(shù)。用來指定文件名的字符串表達式,可能包含目錄或文件夾、以及驅(qū)動器。如果沒有找到 pathname,則會返回零長度字符串 ('')。 attributes 可選參數(shù)。常數(shù)或數(shù)值表達式,其總和用來指定文件屬性。如果省略,則會返回匹配 pathname 但不包含屬性的文件。 ********************** VBA 中數(shù)據(jù)類型的符號 數(shù)據(jù)類型 類型標(biāo)識符 字節(jié) 字符串型 String $ 字符長度(0-65400) 字節(jié)型 Byte 無 1 布爾型 Boolean 無 2 整數(shù)型 Integer % 2 長整數(shù)型 Long & 4 單精度型 Single ! 4 雙精度型 Double # 8 日期型 Date 無 8公元100/1/1-99/12/31 貨幣型 Currency @ 8 小數(shù)點型 Decimal 無 14 變體型 Variant 無 以上任意類型,可變 對象型 Object 無 4 如例: 這是VB語言里的隱式聲明。 dim a$ 相當(dāng)于 dim a as string 定義一個變量a,類型為字符串 ************************************ Dim a As String *5 是什么意思?定義定長字符串 長度是 5 ************************************* Open FileName For Input Lock Read As #1 Line Input #1, dataLine 請教達人們這個'#1'是什么意思啊? 是指打開的文件編號! 你也可以 #2 ***************************************************** 使用get和put讀寫數(shù)據(jù),生成的文本在末尾會有空字符 簡單講一下請況吧,由于工作需要,經(jīng)常會將大量的數(shù)據(jù)輸出為utf8的文件,然后就會用到get和put語句。但是一直以來比較困擾我的問題就是,輸出的文件末尾經(jīng)常會有幾個空字符(但不是空格),我需要手動打開文件把這幾個空字符刪掉。 最后我發(fā)現(xiàn)get是問題的根源: 語法:Get [#]filenumber, [recnumber], varname get讀取打開的文件[#]filenumber,并將讀取到的數(shù)據(jù)存入varname變量 varname變量需要先聲明數(shù)據(jù)類型。我們以long型舉例,get每次會讀取filenumber中的4個字符存入varname變量,然后我們再用put將varname寫入到我們需要輸出的文件中,如此重復(fù),直到get到整個filenumber的EOF為止。 現(xiàn)在問題來了:由于get固定每次讀取4個字符,當(dāng)讀到文件末尾,最后一次讀取的時候,假若只有3個,2個,或1個字符,那么get會自動在后面填充1個,2個或3個空字符來湊夠4個字符,然后我們再用put輸出的文件就會出現(xiàn)末尾的空字符了。 樓主的問題是,有沒有辦法讓文件末尾不出現(xiàn)空字符? 你這個問題…… 如果我說你問的問題本來就不是問題,你可能會生氣。但是你自己都已經(jīng)知道了,你用Long會因為字節(jié)對齊的原因而導(dǎo)致多出字節(jié)來,那你換成字節(jié)數(shù)組不就行了么? 如果你的要讀取的數(shù)據(jù)本身就是數(shù)據(jù)類型,那么根本就不存在“多出”這個概念,就算是一個長整了的0,它還是四個字節(jié)跟長整的655365長度是一樣。 我明白了,我整理了下思路,做了如下改動: 1.變量類型設(shè)置為byte類型 2.不再用do loop或者while wend語句來循環(huán),而是用for循環(huán)。因為我需要輸出無BOM的UTF8文件,因此我用了seek #filenum,4的語句,所以是for i=1 to LOF(filenum)-3,這樣就剛好做到單字符讀取,單字符輸出,而且可以精確設(shè)置循環(huán)次數(shù),避免了過多循環(huán)輸出空字符。 3.現(xiàn)在可以正確輸出我想要的文件和格式了。 感謝版主大大幫助我解決了困擾我多年的問題 **************************************************** VBA: Seek 語句 語法:Seek [#]filenumber, position 其中position 為介于 1~ 2,147,483,647(相當(dāng)于 2^31 – 1)之間的數(shù)字,指出下一個讀寫操作將要發(fā)生的位置。 功能:在 Open 語句打開的文件中,設(shè)置下一個讀/寫操作的位置。 說明:可以用Seek語句指定Get語句的讀取位置,但在 Get 及 Put 語句中指定的記錄號將覆蓋由 Seek 語句指定的文件位置。 示例: Dim MaxSize, NextChar, MyChar Open 'TESTFILE' For Input As #1 MaxSize = LOF(1) ' 取得文件的總字符數(shù)。 ' 用循環(huán)讀入所有記錄,但是從最后的記錄開始往前讀。 For NextChar = MaxSize To 1 Step -1 Seek #1, NextChar ' 設(shè)置讀寫位置。 MyChar = Input(1, #1) ' 讀入一字符。 Next NextChar Close #1 VBA、Seek 函數(shù) 語法:Seek(filenumber) 功能:返回一個 Long,在 Open 語句打開的文件中指定當(dāng)前的讀/寫位置。 說明:在使用Get語句讀取文件時,必須用LOF函數(shù)來判斷是否到達文件末尾,而不是用EOF函數(shù)??梢允褂肧eek函數(shù)判斷當(dāng)前位置,然后與LOF的值比較。 示例: Do While Seek(1) < LOF(1) '繼續(xù)讀取 ...... Loop |
|
來自: L羅樂 > 《全民學(xué)VBA》