TextBox và VBA

  • Thread starter levanduyet
  • Ngày gửi
L

levanduyet

Welcome
16/10/04
535
13
18
HCM
my.opera.com
#1
Lược dịch từ http://www.cpearson.com/excel/TextBox.htm

Nếu bạn đang dùng VBA Userform, hầu như bạn có dùng TextBox control và trong nhiều trường hợp bạn muốn ngăn chặn hay chỉ cho phép người sử dụng nhập vào một số từ hay ký từ quy định mà thôi như bạn chỉ muốn ngừơi sử dụng nhập vào số mà thôi. Thật không may, không có một thuộc tính nào giúp ta làm việc này. Tuy nhiên chúng ta có cách đơn giản để thực hiện điều này bằng thủ tục sự kiện KeyPress của TextBox.

Ví dụ, giả sử ta có textbox tên TextBox1. Đọan mã sau sẽ chỉ cho phép chúng ta nhập vào số từ 0-9, dấu "." và "-"

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case Asc("0") To Asc("9"), Asc("-")
Case Asc(".")
If InStr(1, Me.TextBox1.Text, ".") > 0 Then
KeyAscii = 0
End If
Case Else
KeyAscii = 0
End Select
End Sub



Nếu muốn thêm các ký tự khác thì bạn đưa thêm vào "Select ...Case"

Lê Văn Duyệt
 
adam_tran

adam_tran

Steel Partner
17/5/05
1,373
32
48
41
Goooogle
#2
Tuyệt vời, học VBA e học hoài không hết.
Có cách nào để resize textbox manually khi form đang chạy?
:dog1:
:dog2:
:dog3:
 
T

the7habitsman

Sơ cấp
10/9/05
89
0
0
Hà nội
#3
Kìa, các bác VBA trả lời câu hỏi này đi chứ??? :)

Không chỉ làm với textbox, end user có khi còn muôn tự layout (kéo thả, di chuyển vị trí, phóng to thu nhỏ, đặt lại thuộc tính,...) cho từng object trên 1 form bằng ....chuột trong chế độ Runtime ấy. Các bác lập trình đáp ứng đi :)

Bài limit chars for textbox là bài vỡ lòng rồi (và có 1 cách làm advance hơn nhiều). Nhưng bài mà adam-tran đưa ra cũng vào loại hơi advance 1 tý đấy :)
 
L

levanduyet

Welcome
16/10/04
535
13
18
HCM
my.opera.com
#4
adam_tran nói:
Có cách nào để resize textbox manually khi form đang chạy?
:dog1:
:dog2:
:dog3:
Thực sự ra người ta chỉ thường resize khi người dùng resize cái form thôi. Còn mục đích để resize textbox cũng ít thôi.
Để làm điều này thì "giải thuật" là dựa vào sự kiện Mouse down, mouse move, mouse up mà thực hiện.
Thân,
Lê Văn Duyệt
 
W

workman

Cao cấp
22/7/05
372
0
0
46
Ho Chi Minh
#5
the7habitsman nói:
Kìa, các bác VBA trả lời câu hỏi này đi chứ??? :)

Không chỉ làm với textbox, end user có khi còn muôn tự layout (kéo thả, di chuyển vị trí, phóng to thu nhỏ, đặt lại thuộc tính,...) cho từng object trên 1 form bằng ....chuột trong chế độ Runtime ấy. Các bác lập trình đáp ứng đi :)

Bài limit chars for textbox là bài vỡ lòng rồi (và có 1 cách làm advance hơn nhiều). Nhưng bài mà adam-tran đưa ra cũng vào loại hơi advance 1 tý đấy :)
Khà khà, bác chính là chuyên gia VBA!!!!, còn kêu gọi ai nữa :).

Thôi thì kỷ niệm cái bài post thứ 100 của "nick" mới, bác làm luôn đi.
 
T

the7habitsman

Sơ cấp
10/9/05
89
0
0
Hà nội
#6
Mọi người chạy thử cái này DlgDesigner

Đây là 1 ví dụ (mã đã dịch rồi) viết = VB (vì thế để chạy được thì cần VBRuntime nhé). Hình như trong About có địa chỉ email, website của tác giả đấy. Mọi người có thể vào đó mà download srccode nhé.

Dùng MouseMove, MouseDown, v.v...ko đủ để làm được đâu ạ. Phải biết được Mouse Position (Dùng API thôi) và nhiều thứ khác.

Private Type POINTAPI
X As Long
Y As Long
End Type

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
....


Có lẽ ý của Adam_tran ko phải là ý naỳ rồi.
 
V

vfupv

Sơ cấp
14/1/06
25
0
0
Thái Nguyên
#7
Dear các cao thủ,
Tôi thiết kế một form nhập số tiền vào một textbox nhưng không biết cách định dạng kiểu số có dấu phân cách cho textbox đó. Rất mong nhận được sự giúp đỡ của các cao thủ. (Tôi chỉ nhập được vào: 123456 ==> tôi muốn có thể nhập được 123,456 tức là có dấu (,) ngăn cách sau 3 số).
Các bác mau giúp tôi nhanh nhé.
Trân trọng cảm ơn!
Phạm Văn Vinh
vfupv@yahoo.com
 
B

Bình_OverAC

Over Abnormal / Crazy
14/5/04
845
7
18
37
Nha Trang
#8
Dùng sự kiện Key_press để ngăn chặn các ký tự ngoài các ký tự chữ số và dấu chấm (.) (hoặc dấu phẩy (,)) để tiếp nhận việc ghi nhận số.
- Nếu muốn format theo yêu cầu ngay từ khi nhập số thì cũng dùng sự kiện key_press để thêm các dấu phân cách.
- Nếu chỉ muốn format sau khi nhập số thì dùng sự kiện Exit. Sau khi Exit mới format lại số.

(vài lời sàm tấu mong các bác chỉ giáo thêm)
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,012
125
63
45
Hà nội
vnuni.net
#9
Không phải đâu, để TextBox làm được như MaskEdit control thì ... viết code hơi bị nhiều (mà nếu ko viết kỹ thì thì gõ vài cái là ... tòi cái lỗi ra ngay).

Còn Lost Focus rồi format, Focus thì Unformat thì chả nói làm gì. Nhỉ.

Sao ko dùng các control như MaskEdit Control đi (Tuy nhiên cái maskedit control này của VB lỗi lắm)
 
V

vfupv

Sơ cấp
14/1/06
25
0
0
Thái Nguyên
#10
Các bác có thể hướng dẫn chi tiết cách sử dụng sự kiện key_press để định dạng cho textbox ngay khi nhập số vào để được dấu phân cách không ?

(em không thạo khoản này lắm và rất muốn học hỏi)

Cảm ơn các bác nhé
 
B

Bình_OverAC

Over Abnormal / Crazy
14/5/04
845
7
18
37
Nha Trang
#11
Format sau mỗi lần nhập chữ số --> chạy chậm
Private dotpressed As Boolean
Private Sub TextBox1_Change()
If TextBox1.Text = "" Or TextBox1.Text = "." Then
TextBox1.Text = 0
Else
TextBox1.Text = WorksheetFunction.Text(CDbl(TextBox1.Text), "#,###.######")
If Right(TextBox1.Text, 1) = "." And Not dotpressed Then TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
End If
End Sub

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1.Text = "" Then
TextBox1.Text = 0
Else
TextBox1.Text = WorksheetFunction.Text(CDbl(TextBox1.Text), "#,###.######")
If Right(TextBox1.Text, 1) = "." Then TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
dotpressed = False
Select Case KeyAscii
Case Asc("0") To Asc("9"), Asc("-")
Case Asc(".")
If InStr(1, Me.TextBox1.Text, ".") > 0 Then
KeyAscii = 0
Else
dotpressed = True
End If
Case Else
KeyAscii = 0
End Select
End Sub
Format sau khi loss focus

Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
If TextBox1.Text = "" or TextBox1.Text = "." Then
TextBox1.Text = 0
Else
TextBox1.Text = WorksheetFunction.Text(CDbl(TextBox1.Text), "#,###.######")
If Right(TextBox1.Text, 1) = "." Then TextBox1.Text = Left(TextBox1.Text, Len(TextBox1.Text) - 1)
End If
End Sub

Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
dotpressed = False
Select Case KeyAscii
Case Asc("0") To Asc("9"), Asc("-")
Case Asc(".")
If InStr(1, Me.TextBox1.Text, ".") > 0 Then
KeyAscii = 0
End If
Case Else
KeyAscii = 0
End Select
End Sub
Tận dụng đoạn code của bác Duyệt.

Dùng textbox_keypress không ổn lắm nên chuyển sang dùng textbox_Change
 
V

vfupv

Sơ cấp
14/1/06
25
0
0
Thái Nguyên
#12
Lại một tình hống nữa cần sự giúp đỡ của các bác cao thủ đây:
Em thiết kế Form nhập dữ liệu, sau khi nhập xong nhấn vào nút Add để thực hiện việc nhập dữ liệu vào bảng tính excel --> xuất hiện một msgbox hoặc form thứ 2 thông báo là đã nhập thành công và hỏi có muốn nhập tiếp không (Yes/No).
Nếu chọn Yes thì vẫn giữ nguyên form trên màn hìnhnhìn thấy dữ liệu đã được add vào bảng tính, nếu chọn No thì kết thúc công việc.
Các bác giúp em xử lý tìn huống in đậm trên đây nhé.
 
V

vfupv

Sơ cấp
14/1/06
25
0
0
Thái Nguyên
#14
Em đã làm như cách này của bác Bình rồi nhưng vấn đề đặt ra là nếu muốn nhập liên tiếp > 02 chứng từ thì sẽ không nhìn thấy các chứng từ đã được nhập vào bảng tính. Chỉ khi nào đóng form lại mới xuất hiện các các chứng từ đã được thêm vào ???
Vậy sẽ phải xử lý như thế nào đây các bác ?
 
B

Bình_OverAC

Over Abnormal / Crazy
14/5/04
845
7
18
37
Nha Trang
#15
không nhìn thấy các chứng từ đã được nhập vào bảng tính
Bác ơi. Với em thì em chỉ có thể cách tra tới từng box mà clear nó đi thôi àh.
đóng form lại mới xuất hiện
Xuất hiện thế nào hả bác. Nếu là hiện trong phần dử liệu thì bác cứ show dữ liệu cho người ta coi. Nếu muốn chỉ show những thứ vừa nhập thì bác lọc lại vậy.
 
V

vfupv

Sơ cấp
14/1/06
25
0
0
Thái Nguyên
#16
Bình_OverAC nói:
Bác ơi. Với em thì em chỉ có thể cách tra tới từng box mà clear nó đi thôi àh.

Xuất hiện thế nào hả bác. Nếu là hiện trong phần dử liệu thì bác cứ show dữ liệu cho người ta coi. Nếu muốn chỉ show những thứ vừa nhập thì bác lọc lại vậy.
Em nhập dữ liệu như saU:
.....
Sheets("SheetDL").Select
FormNHAPLIEU.show
.....

Em muốn sau khi chọn nut Add trên form NHAPLIEU thì sẽ nhìn thấy dòng chứng từ mới nhập xuất hiện trên bảng tính (form vẫn đang show trên màn hình).

Có cách nào sau khi thực hiện lệnh End hoặc Unload Me thì dữ liệu trong textbox tự động xoá đi không các bác ?
 
C

cartoon18

Sơ cấp
28/10/11
3
0
1
qingdao
#17
Ðề: TextBox và VBA

Liên quan tới textbox Cho em hỏi em muốn tạo một textbox nhập ngày tháng. khi chưa nhập hiển thị sẽ là ../../.... và người nhập chỉ được nhập số, nếu không nhập đầy đủ ngày tháng năm thì sẽ thông báo bằng msgbox Em đã tìm nhiều trên mạng mà không thấy có câu trả lời :wall: , mong các Bro giúp đỡ. /thanhk
 
Sửa lần cuối:

Thành viên trực tuyến

  • daongocnam0603
  • auyeuch




Xem nhiều