Cùng tìm hiểu về InputBox

vbano1

SMod
Thành viên BQT
Khi macro đang thực thi giữa chừng, chúng ta muốn người dùng nhập dữ liệu vào, dữ liệu ấy có thể là số hay chuỗi ký tự, và chúng ta sẽ sử dụng inputbox.
Tôi ví dụ, người dùng sẽ nhập tên của mình vào inputbox và sau đó macro sẽ lấy giá trị này điền vào ô A1.
Mã:
Sub Sample1()
    Dim buf As String
    buf = InputBox("Hay nhap ten cua ban")
    Range("A1") = buf
End Sub
Đây không phải là kỹ thuật khó, nhưng có nhiều người không hiểu hết, vì vậy hôm nay, thông qua topic này, tôi muốn giới thiệu tất cả những vấn đề về inputbox.
Có hai loại inputbox.
  • Hàm InputBox
  • Phương thức InputBox của Application Object.
Đầu tiên là hàm InputBox.
Cái thứ hai đó là phương thức InputBox của Application Object.

Tới đây, các bạn sẽ thắc mắc, vậy hai cái này có gì khác nhau?
Phương thức Inputbox không phải là hàm, nó có thể sử dụng đối số [Type]. Đối số này có ý nghĩa gì thì tôi sẽ thuyết minh sau.
Hàm InputBox:
Cấu trúc:
Mã:
InputBox(Prompt,[Title],[Default],[XPos],[YPos],[HelpFile],[Context])
Bạn cần đăng nhập để thấy đính kèm


Phương thức InputBox:
Cấu trúc:
Mã:
Application.InputBox(Prompt,[Title],[Default],[XPos],[YPos],[HelpFile],[HelpContextId],[Type])
Bạn cần đăng nhập để thấy đính kèm


Đối số của InputBox:
InputBox được sử dụng rất nhiều, giống như ở trên ta đã sử dụng InputBox("Hay nhap ten:"). Tuy nhiên ta cũng thấy rằng, nó có rất nhiều đối số, sau đây chúng ta sẽ lần lượt xem từng đối số có ý nghĩa gì nhé.
Prompt
Đây là đối số nhất định phải chỉ định. Đối với InputBox, thì đây là đối số duy nhất phải khai báo, không thể giản lược. Các đối số khác thì bạn có thể giản lược.
Đối số Prompt trong InputBox sẽ chỉ định ký tự được hiển thị. Nó có thể là ký tự, số, ngày tháng, hay logic (True/False) nhưng thực tế trước khi thực thi, VBA sẽ chuyển nó thành kiểu dữ liệu là String. Hãy chú ý điều này.
Đối số Prompt thường sẽ hiển thị chuỗi ký tự trên một hàng. Nếu như bạn muốn xuống dòng, hãy sử dụng vbCrLf, đây là hằng số có ý nghĩa xuống dòng, nó có ý nghĩa tương tự Chr(13) và Chr(10). Để ngắn gọn, bạn hãy sử dụng hằng số vbCrLf.
Mã:
Sub Sample2()
    Dim buf As String, msg As String
    msg = "Hay nhap dia chi o day" & vbCrLf & _
          "Neu la Ha Noi thi hay nhap ten quan"
    buf = InputBox(msg)
    Range("A1") = buf
End Sub
Bạn cần đăng nhập để thấy đính kèm


Title
Tham số này sẽ chỉ định dòng tiêu đề hiển thị trên hộp thoại khi hiện ra. Bạn có thể giản lược tham số này.
Nếu giản lược, thông thường dòng tiêu đề mặc định sẽ là "Microsoft Excel".

Bây giờ tôi sẽ thử chỉ định dòng tiêu đề là "tuhocvba.net" nhé:
Mã:
Sub Sample2b()
    Dim buf As String, msg As String
    msg = "Hay nhap dia chi o day" & vbCrLf & _
          "Neu la Ha Noi thi hay nhap ten quan"
    buf = InputBox(msg, Title:="tuhocvba.net")
    Range("A1") = buf
End Sub
Bạn cần đăng nhập để thấy đính kèm

Default
Tham số này sẽ chỉ định giá trị mặc định cho InputBox. Tức là người dùng dù chưa nhập gì thì giá trị mặc định sẽ được hiển thị ra.
Mã:
Sub Sample2c()
    Dim buf As String, msg As String
    msg = "Hay nhap dia chi o day" & vbCrLf & _
          "Neu la Ha Noi thi hay nhap ten quan"
    buf = InputBox(msg, Default:="vbano1")
    Range("A1") = buf
End Sub
Bạn cần đăng nhập để thấy đính kèm


Chú ý rằng, giá trị mặc định này ta có thể chỉ định xuống dòng bằng vbCrLf. Tuy nhiên khi hiển thị trên InputBox thì ta lại không thấy điều này. Nhưng khi ấn Enter ta sẽ thấy kết quả được thể hiện. Ví dụ:
Mã:
Sub Sample2d()
    Dim buf As String, msg As String
    msg = "Hay nhap dia chi o day" & vbCrLf & _
          "Neu la Ha Noi thi hay nhap ten quan"
    buf = InputBox(msg, Default:="vbano1" & vbCrLf & "Euler")
    Range("A1") = buf
End Sub
Bạn cần đăng nhập để thấy đính kèm


XPosとYPos
Tham số này sẽ chỉ định tọa độ của InputBox.
Mã:
Sub Sample4()
    Dim buf As String
    buf = InputBox(Prompt:="Hay nhap dia chi:", XPos:=1000, YPos:=2000)
    ActiveCell = buf
End Sub
Bạn cần đăng nhập để thấy đính kèm

Chú ý rằng, tọa độ này lấy cửa sổ Windows làm chuẩn, chẳng liên quan gì tới worksheet của Excel. Tôi di chuyển cửa sổ Excel đi xem kết quả ra sao nhé.
Bạn cần đăng nhập để thấy đính kèm

HelpFileとContext(HelpContextId)
Tham số HelpFile sẽ chỉ định File Help được mở ra khi người dùng ấn vào nút Help trên InputBox.
Tham số Context hay HelpContextID sẽ chỉ định trang bên trong file Help được hiển thị ra.

Với hàm InputBox, nếu bạn chỉ định tham số HelpFile, thì nút bấm Help sẽ xuất hiện trên hộp thoại InputBox. Và nếu bạn click vào nó, thì trang mà bạn chỉ định trong file help sẽ được hiển thị ra. Nếu như máy tính không tìm thấy file Help thì hàm InputBox sẽ ra thông báo là nó "không tìm thấy file help".
Mã:
Sub Sample101201()
    Dim buf As String
    buf = InputBox(Prompt:="Hay nhap dia chi:", HelpFile:="test.hlp", Context:=2)
    ActiveCell = buf
End Sub
Bạn cần đăng nhập để thấy đính kèm

Ở trên các bạn thấy nút bấm Help đã xuất hiện. Trong trường hợp không xuất hiện, hãy thử ấn F1, khi đó Help sẽ hiển thị ra.
Đối với nút Help này, tôi không thấy dùng mấy, các bạn có thể giản lược không khai báo tham số này. Nếu bạn có ý định chỉn chu trong thiết kế, tôi khuyên các bạn hãy sử dụng UserForm để chủ động theo ý mình.
Type
Đối với phương thức InputBox thì đây là vũ khí lớn nhất. Tham số [Type] không dùng được cho hàm InputBox, hãy chú ý điều này. Nó chỉ được dùng cho phương thức InputBox. Để chỉ định kiểu dữ liệu trả về cho InputBox, ta sẽ dùng tham số này. Hãy tham khảo bảng dưới đây.
Giá trịKiểu
0​
Hàm số
1​
Giá trị là số
2​
Chuỗi ký tự
4​
Logic (True/False)
8​
Range
16​
Lỗi
Ví dụ: #N/A
64​
Mảng dãy số

Type:=0
Ta nhập vào hàm số. Ví dụ: 「=SUM(A1:B2)」hoặcc là「=A1+B2」. Chú ý nhất định phải bắt đầu bằng dấu "=".
Type:=1
Giá trị nhập vào là số. Thường thì chúng ta hay sử dụng Type = 2, tức là nhập vào chuỗi ký tự. Khi chúng ta chỉ định Type = 1, tức là chúng ta chỉ chấp nhận đầu vào là số. Nếu không phải là số, sẽ có thông báo lỗi.
Mã:
Sub Sample101202()
    Dim buf As Integer
    buf = Application.InputBox(Prompt:="Hay nhap so", Type:=1)
    MsgBox buf
End Sub
Bạn cần đăng nhập để thấy đính kèm


Bạn có thể nhập vào là số, hoặc nhập phép toán vào nhưng nó sẽ chỉ hiển thị ra kết quả của phép toán đó.
Bạn cần đăng nhập để thấy đính kèm

(Còn nữa)
Nguồn:
 

tuhocvba

Administrator
Thành viên BQT
Type:=2
Ta nhập vào là chuỗi ký tự.
Ví dụ 1:
Mã:
Sub Sample101301()
    Dim buf As String
    buf = Application.InputBox(Prompt:="Hay nhap so nguoi tham du buoi tiec:", Type:=2)
    MsgBox buf
End Sub
Bạn cần đăng nhập để thấy đính kèm

Ở ví dụ cuối cùng, mặc dù Excel tự động tính toán, nhưng kết quả trả về vẫn là string "27". Hãy chú ý nhé.

Type:=4
Kiểu giá trị nhập vào là logic boolean True/False.
Mã:
Sub Sample101302()
    Dim buf As Boolean
    buf = Application.InputBox(Prompt:="Hay nhap gia tri logic:", Type:=4)
    MsgBox buf
End Sub
Bạn cần đăng nhập để thấy đính kèm

Ta cố tình nhập một chuỗi ký tự vào và lập tức ra cảnh báo lỗi như trên.
Bạn có thể nhập vào đó là "True" hoặc "False". Hoặc đơn giản hơn, nếu muốn False thì bạn nhập số 0, máy tính sẽ hiểu đó là False. Nếu muốn True thì hãy nhập một số nguyên dương (>0), ví dụ nhập vào là 5, máy tính sẽ hiểu đó là True.

Type:=8
Kiểu giá trị nhập vào là Range.
Mã:
Sub Sample_tuhocvba101301()
    Dim buf As Range
    Set buf = Application.InputBox(Prompt:="Hay chon vung Range:", Type:=8)
    MsgBox buf.Address(False, False) & " co mau la " & buf.Font.ColorIndex & " ."
End Sub
Bạn cần đăng nhập để thấy đính kèm


Chú ý Range là một đối tượng (Object: gồm thuộc tính và phương thức), cho nên với phép gán phải có Set. Đừng quên điều này.

Type:=16
Kiểu giá trị nhập vào giá trị lỗi. Tôi không biết phải lấy ví dụ nào cho các bạn, thực tế tôi cũng chưa dùng bao giờ. Thôi thì các bạn cứ hiểu với kiểu Type:=16 thì giá trị nhập vào là giá trị lỗi.

Type:=64
Kiểu giá trị nhập vào là mảng. Thực ra cũng ít người dùng cái này. Ta có ví dụ sau:
Mã:
Sub thvba101301()
    Dim buf As Variant
    buf = Application.InputBox(Prompt:="Hay nhap du lieu vao day:", Type:=64)
    Selection = buf
End Sub
Bạn cần đăng nhập để thấy đính kèm
 

Euler

Administrator
Thành viên BQT
Trường hợp nút Cancel được ấn.

Việc phán đoán các tình huống có thể có trong thực tế là rất cần thiết. Ví dụ, người dùng chẳng chịu nhập dữ liệu gì cả, họ ấn Cancel và trong trường hợp này chúng ta phải đình chỉ các xử lý để kết thúc chương trình.
Vậy, khi người dùng ấn vào nút Cancel thì giá trị trả về là gì?

Trường hợp hàm InputBox:

Giá trị trả về sẽ là ký tự rỗng “”.
Ví dụ:
Mã:
Sub Sample8a()

    Dim buf As String

    buf = InputBox(Prompt:="Hay nhap ten cua ban:")

    If buf = "" Then Exit Sub

    ActiveCell = buf

End Sub
Nếu như chúng ta không chấp nhận người dùng ấn vào nút Cancel, chúng ta mong muốn người dùng phải nhập dữ liệu. Khi đó ta có code ví dụ như sau:
Mã:
Sub Sample8b()

    Dim buf As String

    Do

        buf = InputBox(Prompt:="Hay nhap dia chi mail:")

        If buf = "" Then MsgBox "Day la noi dung bat buoc phai nhap.", vbExclamation

    Loop While buf = ""

    ActiveCell = buf

End Sub
Trường hợp phương thức InputBox:

Ta có code ví dụ sau:
Mã:
Sub Sample9()

    Dim buf As String

    buf = Application.InputBox(Prompt:="Hay nhap dia chi mail:")

    If buf = "False" Then Exit Sub

    ActiveCell = buf

End Sub
Khi người dùng ấn vào nút Cancel thì giá trị trả về là logic (boolean) False.
Trong phương thức InputBox, ta không chỉ định kiểu dữ liệu (Type:=…) tuy nhiên vì buf khai báo là chuỗi ký tự, nên trong phép so sánh ta phải để là buf = “False”.
Nếu chúng ta khai báo chặt chẽ kiểu dữ liệu cho InputBox, thì lỗi sẽ xảy ra. Ta ví dụ:
Mã:
Sub Sample10()

    Dim buf As Long

    buf = Application.InputBox(Prompt:="Hay nhap vao so nguyen duong ma ban thich:", Type:=1)

    If buf = "False" Then Exit Sub

    ActiveCell = buf

End Sub
Ở đây ta đã chỉ định Type:=1, tức là nó chỉ chấp nhận ký tự đầu vào là SỐ. Vì thế, khi người dùng ấn Cancel thì giá trị trả về là False, nó không phải là SỐ, cho nên mâu thuẫn với Type:=1, vì vậy mà lỗi sẽ xảy ra.
Đầu vào có thể là số, hay string,… cái đó tùy thuộc vào kiểu Type:= mà bạn chỉ định, nhưng khi ấn Cancel thì giá trị trả về sẽ là Logic False. Vậy tóm lại, biến buf nên khai báo là Variant.
Ví dụ:
Mã:
Sub Hello()

  Dim Name As Variant



  Name = Application.InputBox(prompt:="Ho Ten:", Title:="Nhap thong tin", Default:="Nguyen Van A", Type:=2)  'Type:=2 la kieu ky tu Text

  If VarType(Name) = vbBoolean Then Exit Sub      ' An nut Cancel nen thoat chuong trinh

  If Name = "" Then Name = "Nguyen Van A"

  MsgBox prompt:="Xin chao " & Name & " , ban khoe khong?", Buttons:=vbInformation, Title:="tuhocvba.net"

End Sub
 

tuhocvba

Administrator
Thành viên BQT
Hàm VarType:
Cấu trúc:
Mã:
VarType(a)
sẽ cho biết biến số a là kiểu dữ liệu nào.
NoTham số đầu vàoGiá trị trả về
1Integer2
2Double5
3String8
4Boolean11
5Date7
6Object9
7Variant0
8String()8200
9Integer()8194
Mã:
Sub Test()
  Dim a As Integer
  Dim b As Double
  Dim c As String
  Dim d As Boolean
  Dim e As Date
  Dim f As Object
  Dim g As Variant
  Dim h() As String
  Dim i() As Integer
  
  MsgBox "Integer:" & VarType(a) & vbCrLf & _
         "Double:" & VarType(b) & vbCrLf & _
         "String:" & VarType(c) & vbCrLf & _
         "Boolean:" & VarType(d) & vbCrLf & _
         "Date:" & VarType(e) & vbCrLf & _
         "Object:" & VarType(f) & vbCrLf & _
         "Variant:" & VarType(g) & vbCrLf & _
         "arr_String:" & VarType(h) & vbCrLf & _
         "arr_Integer:" & VarType(i) & vbCrLf _
 
End Sub
Bạn cần đăng nhập để thấy đính kèm


Như vậy chúng ta có thể sử dụng nó để kiểm tra người dùng ấn nút Cancel ở phương thức InputBox hay không. Bởi vì khi ấn Cancel thì giá trị trả về là Logic False. Vì vậy nếu VarType(a) = 11 thì có thể kết luận người dùng đã ấn vào Cancel.
Trong đó:
a = Application.InputBox(prompt:="Ho Ten:", Title:="Nhap thong tin", Default:="Nguyen Van A", Type:=2)
Tham khảo từ nguồn:
 

Sco

Yêu THVBA
cho mình hỏi một chút, giả sử mình muốn nhập giá trị ngày tháng bằng inputbox thì có thể dùng bằng hàm hoặc phương thức input box được hay không. Nếu có thể bạn ghi giúp mình ví dụ cho dễ áp dụng. Cảm ơn bạn
 
Top