小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

VBA基礎(chǔ)03--判斷分支

 L羅樂 2016-10-15

開始前,說明一下,如果你能用三天把下面的實例看懂,也同一樣會給你帶來收獲,不要急,慢慢來,最最重要的是要懂,不懂就要問


========================================


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




    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多