發(fā)布時間:2025-03-14 文章來源:xp下載站 瀏覽:
辦公軟件是指可以進行文字處理、表格制作、幻燈片制作、圖形圖像處理、簡單數(shù)據(jù)庫的處理等方面工作的軟件。目前辦公軟件朝著操作簡單化,功能細化等方向發(fā)展。辦公軟件的應用范圍很廣,大到社會統(tǒng)計,小到會議記錄,數(shù)字化的辦公,離不開辦公軟件的鼎力協(xié)助。另外,政府用的電子政務,稅務用的稅務系統(tǒng),企業(yè)用的協(xié)同辦公軟件,這些都屬于辦公軟件。 在 Excel 中,如果批量生成不重復的隨機,用公式不容易做到,但用 VBA 卻很容易實現(xiàn)。VBA 生成隨機數(shù)十分靈活,可滿足生成多種要求的隨機數(shù),例如:可以大批量生成不限定范圍的小數(shù)或整數(shù)隨機數(shù)、指定范圍的小數(shù)或整數(shù)隨機數(shù)(包括負數(shù))。 用 VBA 生成隨機數(shù)通常分為兩步,一步是創(chuàng)建窗體和添加控件,另一步是編寫代碼,如果不要求在窗體上操作,直接編輯代碼即可,但靈活度沒那么大。以下列舉了兩用 VBA 生成隨機數(shù)的實例,一個功能簡單,另一個功能多、能大批量生成滿足多種要求的隨機數(shù),它們都提供生成文檔下載。 一、Excel用VBA批量生成指定行數(shù)和列數(shù)的固定不變的小數(shù)隨機數(shù)(一)創(chuàng)建窗體和添加控件 1、創(chuàng)建窗體。在 Excel 窗口,按 Alt + F11 打開 VBA 編輯窗口,單擊“插入”,在彈出的菜單中選擇“用戶窗體”,新建一個用戶窗體;單擊“屬性”小窗口中“(名稱)”右邊的輸入框,選中里面的文字,輸入 ufRand 作為窗體名稱;再單擊 Caption 右邊的輸入框,選中里面的文字,輸入“生成隨機數(shù)”作為窗體的名稱。 2、添加標簽和文本框控件。 A、單擊一下新建的窗體,在它左邊顯示“工具箱”,把鼠標移到大寫字母 A 上,按住左鍵并拖到窗體,則添加一個標簽控件;把它的“名稱”改為 lblRows,再把它的 Caption 改為“行數(shù)”;單擊 Font 右邊的輸入框,再單擊輸入框右邊出的“...”按鈕,打開“字體”窗口,“大小”選擇“小四”,單擊“確定”,把標簽的字體設置為“小四”; B、同樣方法把一個文本框控件(有 ab| 的哪個)拖到窗體,把它的“名稱”改為 tbRows,把它的字體也設置為“小四”。 C、按住 Shift,單擊“行數(shù)”標簽,把它們選中,按 Ctrl + C 復制,再按 Ctrl + V 粘貼,把“行數(shù)和文本框”復制一份;單擊窗體空白處釋放副本的選中狀態(tài),選中復制的“行數(shù)”,把它的“名稱”改為 lblCols、Caption 改為“列數(shù)”;再選中復制的文本框,把“名稱”改為 tbCols。 3、添加按鈕。單擊一下“生成隨機數(shù)”窗體,把一個按鈕控件拖到窗體,把它的“名稱”改為 btnSubmit、Caption 改為“提 交”,再它把的字體設置為“小四”;單擊一下窗體空白處,再選中按鈕,按 Ctrl + C 復制,再按 Ctrl + V 把按鈕粘貼一份,選中粘貼的按鈕,把它的“名稱”改為 btnConser,再把它的 Caption 改為“取 消”。操作過程步驟,如圖1所示: 圖1 (二)給按鈕添加代碼并生成隨機數(shù) 1、給按鈕添加代碼。雙擊“提 交”按鈕,打開代碼輸入窗口,把以下代碼 復制到 Private Sub btnSubmit_Click() End Sub 之間,雙擊 ufRand 返回“生成隨機數(shù)”窗體,雙擊“取 消”按鈕,把 Unload Me 復制到 Private Sub btnConser_Click() End Sub 之間。 2、生成隨機數(shù)。單擊“運行”,選擇“運行子過程/用戶窗體”,打開“生成隨機數(shù)”窗口,并切換到 Excel 窗口,“行數(shù)”輸入 8,“列數(shù)”輸入 3,單擊“提 交”,則生成 8 行 3 列的隨機數(shù);單擊“取 消”,結束代碼運行;操作過程步驟,如圖2所示: 圖2 3、代碼說明: A、Dim 用于定義變量,Dim rowNum As Integer 是把 rowNum 定義為整型,colNum 也被定義為整型。 B、Val() 函數(shù)用于把文本轉為整型,Val(tbRows.Text) 把輸入的“行數(shù)”轉為整型。 C、For To Next 為循環(huán)語句,代碼中使用了兩 For 循環(huán),其中外層循環(huán)(For i = 1 To rowNum)用于控制要生成隨機數(shù)的行數(shù),內(nèi)層循環(huán)(For c = 1 To colNum)用于控制每行生成幾列隨機數(shù)。 4、下載以上生成隨機數(shù)的 Excel 文件:.xlsx 版(Excel 2007 以上版本),.xls 版(Excel 2003 版)。下載后,用 Excel 打開,按Alt + F11 切換到 VBA 編輯窗口,單擊窗口左邊的“窗體”把它展開,再單擊 ufRand 顯示窗體,按 F5 運行即可。 二、Excel用VBA自定義批量生成絕對不重復的隨機數(shù)(一)生成隨機數(shù)演示 1、生成 0 到 1 的指定行數(shù)和列數(shù)的不重復的小數(shù)隨機數(shù)。在 Excel 窗口,按 Alt + F11 切換到 VBA 編輯窗口,單擊“運行子過程/用戶窗體”的“綠色三角”圖標(或按 F5)執(zhí)行代碼,打開“生成隨機數(shù)”窗口并切換回 Excel 窗口。在“起始行和起始列”都輸入 2,“行數(shù)”輸入 100,“列數(shù)”輸入 10,單擊“提交”,則生成 1000 個 0 到 1 的小數(shù)隨機數(shù)。操作過程步驟,如圖3所示: 圖3 2、生成保留兩位小數(shù)的不重復的隨機數(shù)。單擊“清除”把上次生成的隨機數(shù)刪除,“起始行和起始列”都改為 1,“行數(shù)和列數(shù)”都改為 4,勾選“生成小數(shù)隨機數(shù)”,“小數(shù)位數(shù)”輸入 2,單擊“提交”,則生成 16 個保留兩位小數(shù)的隨機數(shù)。勾選“生成指定范圍的隨機數(shù)”,“起始值”輸入 0.5,“結束值”輸入 1.8,單擊“提交”,則生成 16 個 0.5 到 1.8 的保留兩位小數(shù)的隨機數(shù)。操作過程步驟,如圖4所示: 圖4 3、生成指定范圍、行數(shù)和列數(shù)的不重復的整數(shù)隨機數(shù)。在“起始行和起始列”都輸入 1,“行數(shù)”和“列數(shù)”都輸入 10,勾選“生成指定范圍的隨機數(shù)”,“起始值”輸入 100,“結束值”輸入 200,單擊“提交”,則生成 100 個 100 到 200 的整數(shù)隨機數(shù);把“起始值”改為 -100,“結束值”不變,“單擊“提交”,則生成 100 個 -100 到 200 的整數(shù)隨機數(shù)。操作過程步驟,如圖5所示: 圖5 提示:一次能生成隨機數(shù)的數(shù)量與電腦內(nèi)存有關,如果電腦內(nèi)存在 8 GB 以上,一次能生成 100 萬個以上;另外,運行代碼前要選中窗體或在代碼編輯窗口,不能選中單個控件運行,這樣會發(fā)生錯誤。 (二)創(chuàng)建窗體和添加控件 像上例一樣創(chuàng)建窗體與添加控件,它們的“名稱”和 Caption 分別如下: “起始行”標簽:lblStartRow “起始行”文本框:tbStartRow “起始列”標簽:lblStartCol “起始列”文本框:tbStartCol “行數(shù)”標簽:lblRowNum “行數(shù)”文本框:tbRows “列數(shù)”標簽:lblCols “列數(shù)”文本框:tbCols “生成指定范圍的隨機數(shù)”復選框:cbRandBetween “生成小數(shù)隨機數(shù)”復選框:cbFloatRand “小數(shù)位數(shù)”標簽:lblDeciPlace “小數(shù)位數(shù)”文本框:tbDeciPlace “起始值”標簽:lblMinValue “起始值”文本框:tbMinValue “結束值”標簽:lblMaxValue “結束值”文本框:tbMaxValue “提交”按鈕:btnSubmit “取消”按鈕:btnCancel “清除”按鈕:btnClear “生成進度”標簽:lblProgressText “當前生成數(shù)目”標簽:lblProgress “錯誤提示”標簽:lblErrorr (三)給按鈕控件添加代碼 1、單擊一下“窗體”,右鍵 ufRandBetween(如果“工具箱”遮擋了 ufRandBetween,單擊一下“屬性”窗口以把“工具箱”隱藏),在彈出的菜單中選擇“查看代碼”,打開代碼編輯窗口,把以下代碼復制過去: If tbStartRow.Text <> "" Then 操作過程步驟,如圖6所示: 圖6 (四)代碼解析: 1、總體說明。 代碼最前定義的 flag 為全局變量,用于終止生成隨機數(shù);btnCancel_Click() 是“取消”按鈕的執(zhí)行事件;Sub btnClear_Click 是“清除”按鈕的執(zhí)行事件;btnSubmit_Click() 是“提交”按鈕的執(zhí)行事件。 2、定義變量并初始化。 Dim startRow As Integer: startRow = 1 是把 startRow 定義為整型并把它初始化為 1。 3、If 語句。 “If 條件 Then 代碼 End If”或“If 條件 Then 代碼 Else 代碼 End If”是判斷語句,當條件為真時,執(zhí)行 Then 后面的代碼,否則執(zhí)行 Else 后面的代碼,如果沒有 Else,則不執(zhí)行。 4、輸入檢查。 為避免輸入的內(nèi)容導致代碼執(zhí)行錯誤,通常要檢查輸入的內(nèi)容是否符合代碼的執(zhí)行規(guī)范。在這里,必須全輸入數(shù)值,否則代碼會產(chǎn)生錯誤,因此對每個文本框輸入的內(nèi)容都要檢查是否為數(shù)值,以下就是檢查“起始行”是否為數(shù)值的代碼: If tbStartRow.Text <> "" Then 由于把“起始行”的默認值設置為 1,因此不要求必須輸入,所以只有“起始行”輸入了文字才判斷所輸入的文字是否為數(shù)值,If tbStartRow.Text <> "" Then 用于檢查“起始行”是否輸入了文字,代碼的意思是:如果“起始行”的文本框不等于空。 IsNumeric() 用于檢查文字是否為數(shù)字,IsNumeric(tbStartRow.Text) 用于判斷“起始行”文本框中輸入的文字是否為數(shù)字。Not 用于表示 VBA 中的“非”運算, Not IsNumeric(tbStartRow.Text) 意思是:如果“起始行”文本框中輸入的不是數(shù)字,則把 "起始行必須為數(shù)字!" 返回給用戶。 5、類型轉換 CInt() 用于把字符型轉為整型,例如代碼中的 startRow = CInt(tbStartRow.Text),也可以 Val(),如 startRow = Val(bStartRow.Text)。 CLng() 用于把字符型轉長整型,例如代碼中的 rowNum = CLng(tbRows.Text)。 6、字符或字符串連接 VBA 用“與”符號 & 連接字符、字符串或變量,例如代碼中的 lblError.Caption = "指定范圍內(nèi)的數(shù)字總數(shù)應該大于等于 " & rowNum * colNum & "。" & strMsg。 7、定義動態(tài)數(shù)組或參數(shù) VBA 定義動態(tài)數(shù)組前需要先定義一個普通數(shù)組,然后再用 ReDim Preserve 把普通數(shù)組重新定義為動態(tài)數(shù)組,例如代碼中的: Dim arr() As Double 0 To totalCells - 1 是動態(tài)數(shù)組的元素取值范圍。如果把數(shù)組作為參數(shù),定義時需要加址傳遞關鍵字 ByRef,例如代碼中的 ByRef arr() As Double。 8、判斷數(shù)組是否為空和取數(shù)組的長度 A、在 VBA 中,用數(shù)組的上界與它的下界比較判斷它是否為空,如果上界小于下界,則數(shù)組為空,否則不為空;例如代碼中的 If UBound(arr) > LBound(arr) Then,數(shù)組 arr 的上界大于它的下界,所以 arr 不為空。UBound() 函數(shù)用于取數(shù)組的上界,LBound() 用于取數(shù)組的下界。 B、取數(shù)組長度(即取數(shù)組有多少個元素)用 UBound(arr),UBound(arr) 是取數(shù)組 arr 最后一個元素的下標,如果要取數(shù)組的實際元素個數(shù)還要加 1,即 UBound(arr) + 1。 9、釋放數(shù)組占用的內(nèi)存 數(shù)組使用結束后,要用 Erase arr 釋放數(shù)組占用的內(nèi)存,特別是數(shù)組元素比較多或內(nèi)容比較多時,arr 是數(shù)組名稱。 10、控件作為參數(shù)的定義 控件作為參數(shù)需要把它用 Object 定義為對象,例如代碼中把“生成進度”標簽控件 Label 作為參數(shù)定義為:lblProgress As Object。 11、制作進度條 A、顯示程序執(zhí)行進度可以用標簽控件(即 Label),例如代碼中用 lblProgress 實時顯示已生成隨機數(shù)個數(shù)與保存進度,代碼如下: If CLng(i / 100) >= 1 And i Mod 100 = 0 Then B、代碼中 CLng(i / 100) 用 i 與 100 取整,當 i 小于 100 時,取整結果為 0,只有當 i 大于等于 100 時,取整結果才會大于等于 1,作用是每生成 100 個隨機數(shù)才顯示一次進度;i Mod 100 是用 i 與 100 取模,即取余數(shù),作用是只有 i 為如 100 、200 這樣的整數(shù)時才顯示進度。 C、進度條代碼中必須有 DoEvents(執(zhí)行事件),否則進度不會變化。另外,循環(huán)結束后還要再賦一次,例如代碼中的 Next 否則進度也不會變化。 12、結束子過程(函數(shù))與終止程序執(zhí)行 A、結束子過程(函數(shù))執(zhí)行。以輸入檢查為例,當檢查到輸入的內(nèi)容不符合規(guī)范時,用 Exit Sub 結束當前子過程的執(zhí)行,例如代碼中的: If Not IsNumeric(tbStartCol.Text) Then B、終止程序執(zhí)行。當用 Unload Me 或 Unload +“窗體名稱”關閉窗體時,如果程序未執(zhí)行完(如循環(huán)未執(zhí)行完),程序并不會終止執(zhí)行,而是繼續(xù)在后臺往下執(zhí)行,而前臺返回給我們的是無響應,要終止程序的執(zhí)行,需要終止未執(zhí)行完的程序。如例中用變量 flag 作為是否取消程序執(zhí)行的標志,如果用戶單擊了“取消”按鈕,立即把 flag 設置為 True,循環(huán)中檢測到 flag 為 True,立即用 Exit For 結果循環(huán);代碼如下: Public flag As Boolean If flag Then Exit For 13、清空所有單元格 用 VBA 清空 Excel 所有單元格可以用 Cells.Clear,它會清空單元格的內(nèi)容和格式。 (五)下載 Excel 文件:.xlsx 版(Excel 2007 以上版本),.xls 版(Excel 2003 版)。下載后,用 Excel 打開,按 Alt + F11 切換到 VBA 編輯窗口,單擊窗口左邊的“窗體”把它展開,再單擊 ufRandBetween 顯示窗體,按 F5 運行即可。 提示:執(zhí)行 VBA 代碼需要勾選“啟用所有宏”,方法為:文件 → 選項 → 信任中心 → 信任中心設置 → 宏設置 → 啟用所用宏 → 確定。另外,保存時,“保存類型”要選擇“Excel 啟用宏的工作簿”。 Office辦公軟件是辦公的第一選擇,這個地球人都知道。 |