Excel VBA – BH Notes https://bhnotes.net Notes of Excel Sat, 19 Mar 2022 12:01:56 +0000 zh-TW hourly 1 https://wordpress.org/?v=6.0.1 199050017 VBA 執行階段錯誤 2147319767 | 解決方法 https://bhnotes.net/vba-2147319767-error-solution/ https://bhnotes.net/vba-2147319767-error-solution/#respond Sun, 20 Mar 2022 02:00:00 +0000 https://bhnotes.net/?p=1506 vba_error_picture

2147319767 錯誤簡述

使用 VBA 操作工作簿 (Workbook),有時會突然出現”執行階段錯誤 2147319767,Automation 錯誤。先前參照無效,或是參照到未編譯的類型”,如下圖。

vba_error_2147319767

解決方法

經過實測,只需勾選”引用項目”,即可解決錯誤,步驟如下:

點擊【工具】

vba_error_tool

點擊【設定引用項目】

vba_error_1_step

勾選【AccessibilitycplAdmin 1.0 type admin】

vba_error_2

選擇【確定】

vba_error_3

如果本篇文章有幫助到你,請在下方拍手圖示按 5 下。只要花幾秒鐘登入 Google 或 FB 帳號,不需任何花費就能提供我實質的回饋,支持我繼續創作,謝謝

]]>
https://bhnotes.net/vba-2147319767-error-solution/feed/ 0 1506
VBA 進度條製作說明 https://bhnotes.net/vba-progress-bar/ https://bhnotes.net/vba-progress-bar/#respond Sun, 20 Feb 2022 02:00:00 +0000 https://bhnotes.net/?p=1440 vba_progress_bar

根據哈佛商學院企業管理副教授 Ryan Buell 發現,進度條能夠產生”勞動幻覺”,使用者可以感受到”工作正在確實的進行”,減少等待焦慮,優化使用者體驗。Excel VBA 最重要就是處理重複工作,因此程式碼會有很多迴圈,可能又會搭配大量的判斷式,很容易造成程式運作時間拉長,進而出現類似當機的畫面。

因此,如果程式需要大量運行時間,建議製作進度條,讓使用者知道程式正在運行,降低等待的焦慮。本文說明如何自製簡易的進度條,大體上為 2 步驟,第 1 為製作進度條的圖示,第 2 為撰寫進度條程式碼。

製作進度條圖示

進度條基底 | 建立表單 UserForm1

建立表單 UserForm1,製作進度條的基底

vba_progress_bar_build_userform1
vba_progress_bar_build_userform1

顯示進度 | 插入標籤 Label1

插入標籤 Label1,顯示進度百分比

vba_progress_bar_label1
vba_progress_bar_label1

進度條圖示框架 | 插入框架 Frame1

插入框架 Frame1,製作進度圖示的框架

vba_progress_bar_frame1
vba_progress_bar_frame1

進度條顯示圖示 | 插入標籤 Label2

插入標籤 Label2,利用 Label2的寬度變化,做為進度的顯示圖示

vba_progress_bar_label2
vba_progress_bar_label2

外觀調整

前述幾個步驟,已經完成 VBA 進度條的基本設定。接下來我們進行微調設定,讓外觀更接近進度條

調整 UserForm1 至適當大小

調整 UserFrom1 至適當大小

vba_progress_bar_userform1_size
vba_progress_bar_userform1_size

修改 UserFrom1 名稱

vba_progress_bar_userform1_caption
vba_progress_bar_userform1_caption

刪除 Frame1 及 Label2 名稱

vba_progress_bar_frame1_caption
vba_progress_bar_label2_caption
vba_progress_bar_frame1_label2_caption

調整 Fram1 外觀

調整 Frame1 的 SpecialEffect,選擇第 2 項 “fmSpecialSunken”,呈現出進度條的外觀

vba_progress_bar_frame1_sunken
vba_progress_bar_frame1_sunken

調整 Label2 顏色

調整 Label2 顏色,作為進度條背景顏色,本範例選擇藍色

vba_progress_bar_label2_color
vba_progress_label2_color

撰寫進度條程式碼

進度條主要目的是顯示迴圈的執行進度,因此需要將進度條程式碼撰寫在迴圈裡。以下為迴圈 10,000 次範例,進度條顯示執行進度。迴圈結束後,呼叫 MsgBox 函數顯示程式執行完成,最後關閉進度條

Sub progress_bar()
    Dim i, j As Long
    
    j = 10000
    UserForm1.Show 0
    For i = 1 To j
        With UserForm1
            .Label1.Caption = CByte((i / j) * 100) & "%"
            .Label2.Width = (i / j) * .Frame1.Width
        End With
        DoEvents
    Next i
    MsgBox "Done"
    Unload UserForm1
    
End Sub
行數說明
5啟動 UserForm1,顯示進度條。注意一定要輸入引數 0,進度條才能正常運作
7使用 With End With 語法,簡化程式碼
81. 計算完成百分比,分子為目前處理數,分母為總處理數
2. 呼叫 CByte 函數,轉換為 Byte 資料型態
3. 利用 Label1.Caption 顯示完成進度
9利用完成百分比乘上 Frame1 的總長度,計算出 Label2 寬度。Label2 寬度會隨著進度不斷增加,呈現出進度條增加的圖示
11一定要加上 DoEvents,要暫時釋出 Excel 對系統的控制權,進度條才能正常顯示
13呼叫 MsgBox 函數,顯示程式完成
14結束進度條,關閉 UserForm1
vba_progress_bar_operation

如果本篇文章有幫助到你,請在下方拍手圖示按 5 下。只要花幾秒鐘登入 Google 或 FB 帳號,不需任何花費就能提供我實質的回饋,支持我繼續創作,謝謝

]]>
https://bhnotes.net/vba-progress-bar/feed/ 0 1440
VBA Dir 函數使用說明 | 讀取檔案資料夾內的所有檔案 https://bhnotes.net/vba-dir-usage/ https://bhnotes.net/vba-dir-usage/#respond Sun, 13 Feb 2022 02:00:00 +0000 https://bhnotes.net/?p=1391 vba-dir

VBA 的 Dir 函數為 directory(目錄) 的縮寫,是 VBA 的內建函數。該函數主要功能為【回傳指定”檔案”或是”檔案資料夾”的名稱】,回傳值為字串資料型態。搭配 VBA 語法,Dir 函數可以發揮強大功能,比如:判斷檔案是否存在取得檔案目錄內的所有檔案及資料夾名稱讀取檔案目錄內的所有檔案。本文以經常出現的使用情境作為範例,說明如何使用 Dir 函數。

Dir 函數語法說明

Dir( [PathName], [Attributes])

備註:所有引數都是選用

  • PathName:指定目錄路徑。如果 Dir 函數找不到或是無法讀取目錄路徑名稱,會回傳空字串。
  • Attributes:指定檔案類型。Dir 函數只會查找並回傳指定檔案類型的檔案名稱。設定值請參考 Microsoft 文件

範例說明

下圖的檔案資料夾及檔案為說明範例,本文以經常遇到的使用情境,說明如何使用 Dir 函數

dir_folder

範例 1 | 查找檔案是否存在

以下範例,我們輸入檔案的路徑以及名稱,使用 Dir 函數查找指定的檔案。依據 Dir 函數的回傳值,使用 If 判斷式及 MsgBox 函數,顯示該檔案是否存在

Sub Dir_File_Exist()
    Dim PathName, FileName, FileCheck As String
    
    PathName = "C:\Desktop\dir_pratice\"
    FileName = "file1.xlsx"
    FileCheck = Dir(PathName & FileName)
    
    If FileCheck = FileName Then
        MsgBox FileCheck & " 檔案存在"
    Else
        MsgBox FileName & " 檔案不存在"
    End If
    
End Sub
行數說明
2宣告變數 PathName、FileName、FileCheck 為字串資料型態
4指定路徑,輸入至變數 PathName
5指定檔案名稱【file1.xlsx】,輸入至變數 FileName
6合併 PathName 及 FileName 變數,輸入至 Dir 函數。將 Dir 函數的回傳值輸入至 FileCheck 變數。如果檔案存在,Dir 函數會回傳檔案名稱;如果檔案不存在,Dir 函數會回傳空字串
8使用 If 判斷式,判斷FileCheck 變數是否為我們要查找的檔案名稱
dir_file_exists

範例 2 | 取得檔案資料夾內的所有檔案名稱

以下範例,Dir 函數搭配使用 Do While 迴圈函數,查找檔案資料夾內的所有檔案名稱。搭配迴圈函數時,Dir 函數只需要在第一次輸入 PathName 引數,之後不需要再輸入,Dir 函數會依據之前輸入的 PathName 引數,尋找並回傳下一個檔案名稱

Sub Dir_Get_All_File_Names()
    Dim PathName, FileName, AllFileName As String
    
    PathName = "C:\Desktop\dir_pratice\"
    FileName = Dir(PathName)
    
    Do While FileName <> ""
        AllFileName = AllFileName & FileName & vbCrLf
        FileName = Dir()
    Loop
    
    MsgBox AllFileName
    
End Sub
行數說明
2宣告變數 PathName、FileName、AllFileName 為字串資料型態
4指定路徑,輸入至變數 PathName
5路徑輸入至 Dir 函數,將 Dir 函數查找到的檔案名稱回傳值輸入至 FileName 變數
7Do While 會持續迴圈直到 FileName 變數為空字串。(當 Dir 函數查找完所有檔案,最後會回傳空字串)
8所有檔案名稱輸入至 AllFileName 變數
9呼叫 Dir 函數,將下一個查找到的檔案名稱輸入至 FileName 變數
dir function all files

範例 3 | 依序開啟檔案資料夾內的所有檔案

前次範例說明如何取得檔案資料夾內的所有檔案,我們可以搭配 Workbooks.open 函數,依序開啟所有檔案

Sub Dir_Open_All_Files()
    Dim PathName, FileName As String

    PathName = "C:\Desktop\dir_pratice\"
    FileName = Dir(PathName)

    Do While FileName <> ""
        Workbooks.Open PathName & FileName
        FileName = Dir()
    Loop

End Sub
行數說明
2宣告變數 PathName、FileName 為字串資料型態
4指定路徑,輸入至變數 PathName
5路徑輸入至 Dir 函數,將 Dir 函數查找到的檔案名稱回傳值輸入至 FileName 變數
7Do While 會持續迴圈直到 FileName 變數為空字串。(當 Dir 函數查找完所有檔案,最後會回傳空字串)
8呼叫 Workbooks.open 函數,合併 PathName 及 FileName 變數,開啟檔案
9呼叫 Dir 函數,將下一個查找到的檔案名稱輸入至 FileName 變數

如果本篇文章有幫助到你,請在下方拍手圖示按 5 下。只要花幾秒鐘登入 Google 或 FB 帳號,不需任何花費就能提供我實質的回饋,支持我繼續創作,謝謝

]]>
https://bhnotes.net/vba-dir-usage/feed/ 0 1391
VBA 判斷數字 | IsNumeric 函數使用說明 https://bhnotes.net/vba-isnumeric/ https://bhnotes.net/vba-isnumeric/#respond Sun, 16 Jan 2022 02:00:00 +0000 https://bhnotes.net/?p=1350 vba-IsNumeric

在 VBA 環境中,我們可以使用 IsNumeric 函數,預先判斷變數是否可以轉為數字,避免變數文字轉數字時發生錯誤。本文以範例說明如何操作 IsNumeric 函數,並介紹 IsNumeric 函數跟 IsNumber 函數的差異。

IsNumeric 語法說明

IsNumeric 函數會檢查輸入的變數是否能轉為數字,並返回布林值(TRUE 或 FALSE)。如果可以轉為數字,回傳 True; 否則,回傳 False

IsNumeric( variable )

備註:變數(variable)類型可以是”字串”或是”數字”


IsNumeric 使用範例

以下範例,我們使用 IsNumeric 函數判斷 variable 變數是否可以轉為數字,並將回傳值輸入至 bl 布林變數,最後呼叫 MsgBox 顯示 bl 變數回傳值

Sub IsNumeric_exapmle()
    Dim variable As String
    Dim bl As Boolean
    
    variable = "123"
    bl = IsNumeric(variable)
    
    MsgBox "variable值:" & variable & vbCrLf & "IsNumeric 函數回傳:" & bl
End Sub
行數說明
2宣告字串變數
3宣告布林變數 bl。後續會將 IsNumeric 回傳的布林值,輸入至變數 bl
5variable 變數輸入”123”
6呼叫 IsNumeric,將回傳值輸入至 bl 變數
8呼叫 MsgBox,顯示 bl 變數回傳值
isnumeric_example

特殊情況

使用 IsNumeric 函數時,要特別注意以下三種變數資料

空白值

使用 IsNumeric 函數時,我們需要注意“空白”並不等於零(0),空白被視為非數字,IsNumeric(“”) 回傳 False。因此,如果要將空白視為數字,需要使用條件判斷式來處理

Sub IsNumeric_space()
    Dim variable As String
    Dim bl As Boolean
    
    variable = ""
    bl = IsNumeric(variable)
    
    MsgBox "variable值:" & variable & vbCrLf & "IsNumeric 函數回傳:" & bl
End Sub
isnumeric_space

日期

IsNumeric 函數的另一個特殊情況是”日期”。在 VBA 中,IsNumeric 函數將日期視為非數字,IsNumeric(“2022/1/16”) 回傳 False

我們以 DateSerial 函數輸出日期格式,IsNumeric 函數仍然回傳 False,IsNumeric(DateSerial(2022, 1, 16)) 回傳 False

Sub IsNumeric_date()
    Dim variable As String
    Dim dVariable As Date
    Dim text1, text2 As String
    
    variable = "2022/1/16"
    dVariable = DateSerial(2022, 1, 16)
    
    text1 = "variable值:" & variable & vbCrLf & "IsNumeric 函數回傳:" & IsNumeric(variable)
    text2 = "dVariable值:" & dVariable & vbCrLf & "IsNumeric 函數回傳:" & IsNumeric(dVariable)
    
    MsgBox text1 & vbCrLf & vbCrLf & text2
End Sub
isnumeric_date

時間

IsNumeric 函數對”時間”判斷較複雜,共有三種情況:

  1. 字串類型的時間,回傳 False
  2. 時間類型的時間,回傳 False
  3. 儲存格內的時間,回傳 True

以下為上述情況範例:

Sub IsNumeric_time()
    Dim variable As String
    Dim tVariable As Date
    Dim cellVariable As String
    Dim text1, text2, text3 As String
    
    variable = "10:00:00 AM"
    tVariable = TimeSerial(10, 0, 0)
    cellVariable = ActiveWorkbook.Sheets(1).Cells(1, 1)
    
    text1 = "variable值:" & variable & vbCrLf & "IsNumeric 函數回傳:" & IsNumeric(variable)
    text2 = "tVariable值:" & tVariable & vbCrLf & "IsNumeric 函數回傳:" & IsNumeric(tVariable)
    text3 = "cellVariable值:" & cellVariable & vbCrLf & "IsNumeric 函數回傳:" & IsNumeric(cellVariable)
    
    MsgBox text1 & vbCrLf & vbCrLf & text2 & vbCrLf & vbCrLf & text3
End Sub
isnumeric_time

在 VBA 中呼叫 Excel 工作表函數 IsNumber()

IsNumeric 函數的替代方法,是呼叫 Excel 工作表函數 IsNumber()

Sub IsNumber_example()
    Dim variable As String
    Dim bl As Boolean
    
    variable = "123"
    bl = Application.WorksheetFunction.IsNumber(variable)
    
    MsgBox "variable值:" & variable & vbCrLf & "IsNumber 函數回傳:" & bl
End Sub
isnumber_example

IsNumber 和 IsNumeric 差異

IsNumber 為 Excel 函數,目的在檢查儲存格的值是否為數字;IsNumeric 為 VBA 函數,目的在檢查值是否可以轉換為數字。

舉例來說,如果我們分別用 IsNumber、IsNumeric 檢查空白儲存格,IsNumber 會回傳 FALSE;IsNumeric 會回傳 TRUE。

我們需要注意這兩個函數不同的特性,並決定在哪些情況下使用 IsNumber 或 IsNumeric。以下為兩個函數的比較表

資料資料型態IsNumeric 回傳值IsNumber 回傳值
123數字TrueTrue
“123”字串True False
2022/1/16日期FalseTrue
“2022/1/16”字串型態的日期FalseFalse
DateSerial(2022, 1, 16)日期型態的日期FalseFalse
10:00:00 AM儲存格內的時間TrueTrue
“10:00:00 AM”字串型態的時間 FalseFalse
TimeSerial(10, 0, 0)時間類型的時間FalseFalse
“”(空白值)字串FalseTrue

如果本篇文章有幫助到你,請在下方拍手圖示按 5 下。只要花幾秒鐘登入 Google 或 FB 帳號,不需任何花費就能提供我實質的回饋,支持我繼續創作,謝謝

]]>
https://bhnotes.net/vba-isnumeric/feed/ 0 1350
VBA 開啟檔案 | 檔案視窗選擇/開啟檔案 https://bhnotes.net/vba-getopenfilename/ https://bhnotes.net/vba-getopenfilename/#respond Sun, 09 Jan 2022 02:00:00 +0000 https://bhnotes.net/?p=1171 VBA_select_file

有些 VBA 程式,需要讓使用者選擇電腦中的文件或是檔案,由於不容易記憶檔案路徑,通常都會呼叫”檔案視窗”(file dialog),讓使用者利用滑鼠點選檔案。本文說明 VBA 開啟檔案方法,呼叫 Application.GetOpenFilename 方法,開啟檔案視窗,讓使用者以圖形化的方式選擇檔案。

語法說明

Application.GetOpenFilename( FileFilter, FilterIndex, Title, ButtonText, MultiSelect )

備註: 所有引數皆為選填引數

  • FileFilter:指定檔案視窗要顯示的文件類型。如果只要顯示 Excel 檔案,可以輸入“Excel Files (.xls), xls”,檔案視窗只會顯示 Excel 檔案
  • FilterIndex:當 FileFilter 輸入 2 種類型以上的文件,可以指定預設的文件類型。預設值為 1
  • Title:檔案視窗的標題
  • ButtonText:此引數僅適用麥金塔
  • MultiSelect:如果要允許選擇多個文件,輸入 TRUE;反之為 FALSE。引數預設值為 FALSE

範例說明

範例 1 | 不輸入任何引數,直接開啟檔案視窗

Application.GetOpenFilename 方法的所有引數都是選填。因此,我們可以不輸入任何引數,直接開啟檔案視窗。這是最簡單的使用方式

Sub open_file_example_1()
    Dim FileName As String
    Dim WB2 As Workbook
          
    FileName = Application.GetOpenFilename
    If FileName <> "False" Then
        Set WB2 = Workbooks.Open(FileName)
    End If
End Sub
行數說明
2因為 GetOpenFilename 方法會回傳檔案路徑,因此宣告 FileName 變數,儲存檔案路徑
3宣告工作簿變數,開啟的 Excel 檔案輸入至變數
5使用 Application.GetOpenFilename 方法,輸入檔案路徑至變數 FileName
6使用者如果取消選擇檔案,會回傳”False”。使用 IF 判斷式,確認使用者已選取檔案,再開啟檔案
7利用 Workbook.Open 方法讀取檔案路徑,開啟新工作簿,輸入變數 WB2

執行本範例的程式碼,會顯示如下的檔案視窗:

GetOpenFilename_no_arguments

範例 2 | 指定選擇 Excel 檔案

以下範例,我們指定使用者選擇 Excel 檔案。我們在 FileFilter 引數中輸入“Excel Files (*.xls*), *xls*”

Sub open_file_example_2()
    Dim FileName As String
    Dim WB2 As Workbook
          
    FileName = Application.GetOpenFilename("Excel Files (*.xls*), *xls*")
    If FileName <> "False" Then
        Set WB2 = Workbooks.Open(FileName)
    End If
End Sub
行數說明
2因為 GetOpenFilename 方法會回傳檔案路徑,因此宣告 FileName 變數,儲存檔案路徑
3宣告工作簿變數,開啟的 Excel 檔案輸入至變數
5FileFileter 引數輸入 “Excel Files (*.xls*), *xls*”
6使用者如果取消選擇檔案,會回傳”False”。使用 IF 判斷式,確認使用者已選取檔案,再開啟檔案
7利用 Workbook.Open 方法讀取檔案路徑,開啟新工作簿,輸入變數 WB2

執行本範例的程式碼,會看到檔案視窗只有顯示 Excel 檔案

GetOpenFilename_FileFilter_Excel

範例 3 | 調整檔案視窗的標題

以下範例,我們調整檔案視窗的標題,標題改為:請選擇 Excel 檔案

Sub open_file_example_3()
    Dim FileName As String
    Dim WB2 As Workbook
          
    FileName = Application.GetOpenFilename("Excel Files (*.xls*), *xls*", , "請選擇 Excel 檔案")
    If FileName <> "False" Then
        Set WB2 = Workbooks.Open(FileName)
    End If
End Sub
行數說明
2因為 GetOpenFilename 方法會回傳檔案路徑,因此宣告 FileName 變數,儲存檔案路徑
3宣告工作簿變數,開啟的 Excel 檔案輸入至變數
5FileFileter 引數輸入 “Excel Files (*.xls*), *xls*” ;Title 引數輸入“請選擇 Excel 檔案”
6使用者如果取消選擇檔案,會回傳”False”。使用 IF 判斷式,確認使用者已選取檔案,再開啟檔案
7利用 Workbook.Open 方法讀取檔案路徑,開啟新工作簿,輸入變數 WB2

執行本範例的程式碼,檔案視窗的標題已經被修改

GetOpenFilename_Title

如果本篇文章有幫助到你,請在下方拍手圖示按 5 下。只要花幾秒鐘登入 Google 或 FB 帳號,不需任何花費就能提供我實質的回饋,支持我繼續創作,謝謝

]]>
https://bhnotes.net/vba-getopenfilename/feed/ 0 1171
VBA MsgBox 使用說明及範例 https://bhnotes.net/vba-msgbox-usage/ https://bhnotes.net/vba-msgbox-usage/#respond Sun, 21 Nov 2021 02:00:00 +0000 https://bhnotes.net/?p=430 MsgBox 用法及範例

使用 VBA 時,我們可以呼叫 MsgBox 函數顯示訊息視窗,傳遞訊息給使用者。同時, MsgBox 函數會根據使用者點擊的按鈕,回傳相對應的整數值。我們可以依據回傳值,執行相對應的程式。本篇文章說明 MsgBox 如何使用以及範例分享。Microsoft MsgBox 說明

MsgBox 訊息視窗的組成說明

MsgBox 訊息視窗組成如下:

msgbox_anatomy
  1. 標題:顯示訊息視窗的標題名稱。如果沒有輸入標題,預設顯示 “Microsoft Excel”
  2. 訊息提示區:這是訊息顯示的地方,可以顯示多行訊息,換行方法請參考 3 個實用的 VBA MsgBox 換行方法
  3. 按鈕:”確定”是預設按鈕,另外我們也可以顯示 [是/否] 、 [是/否/取消] 等
  4. 關閉圖示:關閉訊息視窗

MsgBox 語法說明

MsgBox 語法如下:

MsgBox( prompt, [ buttons ], [ title ], [ helpfile, context ] )

備註: 只有 prompt 為必填引數中括號皆為選填引數

  • prompt – 這是必填的引數,用途是輸入訊息,顯示在”訊息提示區”。上圖範例中,“這是 MsgBox 的訊息視窗”是我們輸入的訊息,顯示在”訊息提示區”。prompt 最多可以輸入 1024 個字元
  • [ buttons ] – 這是選填的引數,用途是指定訊息視窗要顯示的按鈕。預設為 vbOKOnly,訊息視窗只會顯示 [確定] 按鈕。後面會再詳細說明各按鈕的使用方法及範例
  • [ title ] – 這是選填的引數,用途是指定要顯示的標題名稱。預設顯示 “Microsoft Excel”
  • [ helpfile ] – 這是選填的引數,用途是當使用者點擊幫助按鈕時,顯示指定的”說明檔案”。這只有在 [ buttons ] 輸入 “vbInformation” 時,才需要填入該引數。當我們輸入 [ helpfile ] 引數,也必須填入 [ context ] 引數
  • [ context ] – 這是選填的引數,用途是指定”說明檔案”的”說明內容”

備註: [ helpfile ], [ context ] 都非常少見,我們可以先忽略


MsgBox 修改標題及輸入訊息 | 使用說明及範例

使用 MsgBox 函數時,我們可以自定義標題訊息

修改標題

範例如下:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text,,"修改標題"
    
End Sub
MsgBox_title

輸入資訊

範例如下:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text
    
End Sub
MsgBox_prompt

MsgBox 常數 | 使用說明及範例

接下來,介紹按鈕常數圖示常數

按鈕常數

下表為 MsgBox 按鈕常數及說明

按鈕常數說明
vbOKOnly只顯示 [確定] 按鈕
vbOKCancel顯示 [確定] 與 [取消] 按鈕
vbAbortRetryIgnore顯示 [中止]、[重試] 和 [略過] 按鈕
vbYesNoCancel顯示 [是]、[否] 和 [取消] 按鈕
vbYesNo顯示 [是] 和 [否] 按鈕
vbRetryCancel顯示 [重試] 和 [取消] 按鈕
vbMsgBoxHelpButton新增說明訊息方塊的按鈕
vbDefaultButton1設定第 1 個按鈕為預設值。更改數字就可以更改預設值按鈕,比如 vbDefaultButton2 是設定第 2 個按鈕為預設值

由於每個按鈕都會回傳相對應的整數值,我們可以根據回傳值,執行指定的程式,後續會再說明這部分。我們先介紹如何讓 MsgBox 函數顯示不同按鈕及外觀。

vbOKOnly

如果我們只有輸入 prompt ,系統會預設使用 vbOKOnly,程式碼及圖示如下範例:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text
    
End Sub
vbOKOnly

vbOKCancel

vbOKCancel 常數會顯示 [確定] 與 [取消] 按鈕,程式碼及圖示如下範例:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text, vbOKCancel
    
End Sub
vbOKCancel

vbAbortRetryIgnore

vbAbortRetryIgnore 常數會顯示 [中止]、[重試] 和 [略過] 按鈕,程式碼及圖示如下範例:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text, vbAbortRetryIgnore
    
End Sub
vbAbortRetryIgnore

vbYesNo

vbYesNo 常數會顯示 [是] 和 [否] 按鈕,程式碼及圖示如下範例:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text, vbYesNo
    
End Sub
vbYesNo

vbRetryCancel

vbRetryCancel 常數會顯示 [重試] 和 [取消] 按鈕,程式碼及圖示如下範例:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text, vbRetryCancel
    
End Sub
vbRetryCancel

vbMsgBoxHelpButton

vbMsgBoxHelpButton 常數會新增 [說明] 訊息方塊,我們可以搭配其他按鈕常數一起使用,程式碼及圖示如下範例:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text, vbMsgBoxHelpButton + vbOKCancel
    
End Sub
vbMsgBoxHelpButton

vbDefaultButton2

多數情況下,最左邊的按鈕為預設值。簡單的說,當訊息視窗出現時,我們直接按 Enter ,系統會自動執行預設按鈕。以下範例中,我們輸入 vbDefaultButton2 ,將預設按鈕設定為第 2 個:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text, vbMsgBoxHelpButton + vbOKCancel + vbDefaultButton2
    
End Sub
vbDefaultButton2

圖示常數

下表為 MsgBox 圖示常數及說明

圖示常數說明
vbCritical顯示紅色叉號警告訊息圖示
vbQuestion顯示藍色問號訊息圖示
vbExclamation顯示黃色驚嘆號訊息圖示
vbInformation顯示藍色資訊訊息圖示

vbCritical

vbCritical 常數會顯示紅色叉號警告訊息圖示,程式碼及圖示如下範例:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text, vbCritical
    
End Sub
vbCritical

vbQuestion

vbQuestion 常數會顯示藍色問號訊息圖示,程式碼及圖示如下範例:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text, vbQuestion
    
End Sub
vbQusetion

vbExclamation

vbExclamation 常數會顯示黃色驚嘆號訊息圖示,程式碼及圖示如下範例:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text, vbExclamation
    
End Sub
vbExclamation

vbInformation

vbInformation 常數會顯示藍色資訊訊息圖示,程式碼及圖示如下範例:

Sub msgbox_usage()
    Dim text As String
    
    text = "這是 MsgBox 的訊息視窗"
       
    MsgBox text, vbInformation
    
End Sub
vbInformation

MsgBox 按鈕數值回傳 | 使用說明及範例

MsgBox 函數的每個按鈕,都對應一個整數值。當使用者點擊按鈕,我們可以利用 If Statement 或是 Select Case Statement,判斷 MsgBox 回傳值,執行後續對應的程式。

按鈕回傳值
確定1
取消2
中止3
重試4
忽略5
6
7

下面的範例,我們目的是依據使用者的點擊選項,回傳相對應的訊息。當使用者點擊 [是] ,訊息視窗回傳 “你點擊 [是] “;如果使用者點擊 [否] ,訊息視窗回傳 “你點擊 [否] “。

Sub msgbox_result()
    Dim text As String
    Dim result As Byte
    
    text = "請點擊 [是] 或 [否]"
       
    result = MsgBox (text, vbYesNo + vbQuestion)
    
    If result = 6 Then
        text = "你點擊 [是]"
    ElseIf result = 7 Then
        text = "你點擊 [否]"
    End If
    
    MsgBox text
    
End Sub
  1. 我們建立 result 變數,並賦予 MsgBox 函數的回傳值
  2. 當使用者點擊 [是] ,MsgBox 回傳 6 給 result 變數;當使用者點擊 [否] ,MsgBox 回傳 7 給 result 變數
  3. 使用 If Statement 判斷 result 的值。如果 result 是 6 , text 變數為 “你點擊 [是]”;如果 result 是 7,text 變數為 “你點擊 [否]”
  4. 呼叫 MsgBox 函數顯示 text 變數
msgbox_return

如果本篇文章有幫助到你,請在下方拍手圖示按 5 下。只要花幾秒鐘登入 Google 或 FB 帳號,不需任何花費就能提供我實質的回饋,支持我繼續創作,謝謝

]]>
https://bhnotes.net/vba-msgbox-usage/feed/ 0 430
3 個實用的 VBA MsgBox 換行方法 https://bhnotes.net/msgbox-new-line/ https://bhnotes.net/msgbox-new-line/#respond Sun, 14 Nov 2021 02:00:00 +0000 https://bhnotes.net/?p=395 VBA MsgBox 換行方法

使用 VBA 時,我們可以呼叫 MsgBox 函數顯示訊息視窗,傳遞訊息給使用者。當訊息視窗有多個句子,為了提升閱讀性以及美觀,我們可以利用“換行”,將訊息視窗做段落排版。本篇文章介紹 3 個經常使用的 MsgBox 換行方法。

MsgBox 基本操作

我們建立 3 個字串變數 ” textBreakLine”、”textOne”、”textTwo”,接著呼叫 MsgBox 函數,利用 “&” 連結 3 個變數,程式碼範例如下:

Sub no_break_line()
    
    Dim textBreakLine As String
    Dim textOne As String
    Dim textTwo As String
    
    textBreakLine = "沒有換行。"
    textOne = "這是第一行句子。"
    textTwo = "這是第二行句子。"
 
    MsgBox textBreakLine & textOne & textTwo

End Sub

上述範例是沒有換行的訊息視窗,如下圖:

no_break_line

MsgBox 換行方法

我們利用上述相同範例,使用常數 “vbCrLf“、”vbNewLine” 及函數 “Char(10)” 換行。

vbCrLf

“vbCrLf” 是 VBA 的內建常數,程式碼使用範例:

Sub Using_vbCrLf()
 
    Dim textBreakLine As String
    Dim textOne As String
    Dim textTwo As String
 
    textBreakLine = "使用 vbCrLf"
    textOne = "這是第一行句子。"
    textTwo = "這是第二行句子。"
 
    MsgBox textBreakLine & vbCrLf & textOne & vbCrLf & textTwo
 
End Sub

上述範例中,我們在 3 個變數中加上 “vbCrLf” ,換行排版後的訊息視窗如下圖:

MsgBox 換行方法 vbCrLf

vbNewLine

“vbNewLine” 是 VBA 的內建常數,程式碼使用範例:

Sub Using_vbNewLine()
    
    Dim textBreakLine As String
    Dim textOne As String
    Dim textTwo As String
 
    textBreakLine = "使用 vbNewLine"
    textOne = "這是第一行句子。"
    textTwo = "這是第二行句子。"
 
    MsgBox textBreakLine & vbNewLine & textOne & vbNewLine & textTwo
 
End Sub

上述範例中,我們在 3 個變數中加上 “vbNewLine” ,換行排版後的訊息視窗如下圖:

MsgBox 換行方法 vbNewLine

Chr(10)

“Chr(10)” 是 VBA 的內建函式(Microsoft 說明),程式碼使用範例:

Sub Using_Chr()
 
    Dim textBreakLine As String
    Dim textOne As String
    Dim textTwo As String
 
    textBreakLine = "使用 Chr(10)"
    textOne = "這是第一行句子。"
    textTwo = "這是第二行句子。"
 
    MsgBox textBreakLine & Chr(10) & textOne & Chr(10) & textTwo
 
End Sub

上述範例中,我們在 3 個變數中加上 “Chr(10)” ,換行排版後的訊息視窗如下圖:

MsgBox 換行方法 Chr(10)

如果本篇文章有幫助到你,請在下方拍手圖示按 5 下。只要花幾秒鐘登入 Google 或 FB 帳號,不需任何花費就能提供我實質的回饋,支持我繼續創作,謝謝

]]>
https://bhnotes.net/msgbox-new-line/feed/ 0 395
設定 VBA “忽略大小寫”(case insensitive) | 1 行程式碼輕鬆完成 https://bhnotes.net/how-to-make-vba-case-insensitive/ https://bhnotes.net/how-to-make-vba-case-insensitive/#respond Sun, 31 Oct 2021 05:22:33 +0000 https://bhnotes.net/?p=219 忽略大小寫

Excel VBA 是”區分大小寫”(case-sensitive)的程式語言,當 2 組英文字串為”相同字母、不同大小寫”, VBA 會判斷為不相同,如 “dog” 及 “Dog”。本篇文章說明,如何調整 VBA 為”忽略大小寫”(case-insensitive)。

VBA 區分大小寫 (case-sensitive)

首先,我們來看 VBA 預設(區分大小寫)的情況:

Sub caseSensitiveTest()

    Dim strTextUcase As String
    Dim strTextLcase As String
    
    strTextUcase = "DOGS ARE OUR BEST FRIENDS"
    strTextLcase = "dogs are our best friends"
    
    If strTextUcase = strTextLcase Then
        MsgBox "Two texts are the same"
    Else
        MsgBox "Two texts are different"
    End If
    
End Sub

上述範例中,我們建立 2 個字串變數,分別輸入相同英文,但不同大小寫的句子。接著,我們判斷 2 個變數是否相同:如果相同,對話框將回傳 “Two texts are the same”;如果不相同,對話框將回傳 “Two texts are different”。

上圖對話框回傳 “Two texts are different”,這是因為不同大小寫,所以 VBA 判斷 2 組字串變數為不相同。


VBA 忽略大小寫 (case-insensitive)

我們可以在模組(module)頂端輸入 Option Compare Text ,調整 VBA 為”忽略大小寫”(case-insensitive)。

我們利用相同範例,在模組頂端輸入 Option Compare Text

Option Compare Text

Sub caseSensitiveTest()

    Dim strTextUcase As String
    Dim strTextLcase As String
    
    strTextUcase = "DOGS ARE OUR BEST FRIENDS"
    strTextLcase = "dogs are our best friends"
    
    If strTextUcase = strTextLcase Then
        MsgBox "Two texts are the same"
    Else
        MsgBox "Two texts are different"
    End If
    
End Sub

我們可以從下圖中看到,對話框這次回傳 “Two texts are the same”, VBA 已經被調整為”忽略大小寫”。


字串的比較

在 VBA “區分大小寫”的情況下,我們可以使用 VBA 內建的 3 個函數:UCase、LCase 及 SreConv,先轉換字串為相同的大小寫,再進行字串的比較。上述 3 個函數詳細使用方法請參考【Excel VBA】如何轉換英文字母大小寫?3個函數快速完成


如果本篇文章有幫助到你,請在下方拍手圖示按 5 下。只要花幾秒鐘登入 Google 或 FB 帳號,不需任何花費就能提供我實質的回饋,支持我繼續創作,謝謝

]]>
https://bhnotes.net/how-to-make-vba-case-insensitive/feed/ 0 219
VBA 英文大小寫轉換 | 3 個函數輕鬆完成 https://bhnotes.net/how-to-convert-case-with-vba/ https://bhnotes.net/how-to-convert-case-with-vba/#respond Tue, 26 Oct 2021 13:44:20 +0000 https://bhnotes.net/?p=174 VBA 英文大小寫轉換

Excel VBA 內建 3 個好用的函數:UCaseLCaseSreConv,讓我們在利用 VBA 操作英文字串時,能迅速的轉換英文字母為”大寫”、”小寫”或”字首大寫”。

VBA 是”區分大小寫”(case-sensitive)的程式語言,這表示”相同字母、不同大小寫”的 2 組字串,VBA 會判斷為不相同,比如 “dog” 及 “Dog”。我們可以使用上述 3 個函數轉換為相同大小寫,再比對字串。如果想要將 VBA 調整為”忽略大小寫”(case-insensitive),可以在模組(module)頂端輸入 “Option Compare Text”,詳細內容請參考 【Excel VBA】如何”忽略大小寫”(case insensitive)?1 行指令快速調整


UCase | 英文字母轉換為大寫

VBA 的 UCase 函數會將英文字母轉換為大寫,並回傳轉換後的值。 UCase 函數只有 1 個引數(argument),引數可以輸入”字串”、”變數”或是”儲存格的值”。如果我們需要比對字串, UCase 是個經常且容易使用的函數。

UCase 語法如下:

UCase(string)

UCase 範例如下:

Dim strTextRaw As String
Dim strTextUCase As String
    
strTextRaw = "hello world"
strTextUCase = UCase(strTextRaw)
    
MsgBox strTextUCase

上述範例中,我們將變數 strTextRaw 的英文字母轉換為大寫,再將轉換後字串輸入至變數 strTextUCase 。最後,呼叫對話框 (MsgBox) 顯示轉換後的字串:

UCase | 英文字母轉換為大寫

LCase | 英文字母轉換為小寫

如果要將英文字母轉換為小寫,我們可以呼叫 LCase 函數,語法及操作跟 UCase 函數一樣。

LCase 語法如下:

LCase(string)

LCase 範例如下:

Dim strTextRaw As String
Dim strTextLCase As String
    
strTextRaw = "HELLO WORLD"
strTextLCase = LCase(strTextRaw)
    
MsgBox strTextLCase

上述範例中,我們將變數 strTextRaw 的英文字母轉換為小寫,再將轉換後字串輸入至變數 strTextLCase 。最後,呼叫對話框顯示轉換後的字串:

LCase | 英文字母轉換為小寫

StrConv | 英文字首轉換為大寫

我們可以呼叫 StrConv 函數,將字串轉換為字首大寫。StrConv 函數有 2 個引數:第 1 個引數需輸入”轉換的字串”;第 2 個引數需輸入”轉換的類型”。

StrConv 語法如下:

StrConv(string, conversion)

string 為”要轉換的字串”;conversion 為”要轉換的類型”,轉換常數可參考 Microsoft文件

我們目的是將字串英文字母轉換為”字首大寫”,因此要在第 2 個引數內輸入代碼:vbProperCase,範例如下:

Dim strTextRaw As String
Dim strTextPCase As String
    
strTextRaw = "hELLO wORLD"

strTextPCase = StrConv(strTextRaw, vbProperCase)
    
MsgBox strTextPCase

上述範例中,我們將變數 strTextRaw 的英文字首轉換為大寫,再將轉換後字串輸入至變數 strTextPCase。最後,呼叫對話框顯示轉換後的字串:

StrConv | 英文字首轉換為大寫

StrConv | 英文字母轉換為大寫/小寫

我們只需要調整 StrConv 函數的第 2 個引數,就可以將字串轉換為大寫或小寫,效果等同 UCase 及 LCase 函數。

大寫常數:vbUpperCase

小寫常數:vbLowerCase

Dim strTextRaw As String
Dim strTextUCase As String
Dim strTextLCase As String
    
strTextRaw = "Hello World"
strTextUCase = StrConv(strTextRaw, vbUpperCase)
strTextLCase = StrConv(strTextRaw, vbLowerCase)
    
MsgBox strTextUCase & vbCrLf & strTextLCase

上述範例中,我們呼叫 StrConv 函數,輸入大寫/小寫的常數在第 2 個引數。依據輸入的常數,變數 strTextRaw 分別轉換為大寫/小寫。轉換後字串,再分別輸入至變數 strTextUCase 及 strTextLCase 。最後,呼叫對話框顯示轉換後的字串:

StrConv | 英文字母轉換為大寫/小寫

如果本篇文章有幫助到你,請在下方拍手圖示按 5 下。只要花幾秒鐘登入 Google 或 FB 帳號,不需任何花費就能提供我實質的回饋,支持我繼續創作,謝謝

]]>
https://bhnotes.net/how-to-convert-case-with-vba/feed/ 0 174