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