Em tạo một Form, trong form có tạo một MultiPage (gồm 2 trang). Cho em hỏi làm thế nào để mỗi khi Click vào mỗi MultiPage thì dòng Textbox trên Form sẽ thay đổi theo nội dung của mình. Và cho em hỏi thêm, tên của MultiPage viết tiếng việt được không.
Em tạo một Form, trong form có tạo một MultiPage (gồm 2 trang). Cho em hỏi làm thế nào để mỗi khi Click vào mỗi MultiPage thì dòng Textbox trên Form sẽ thay đổi theo nội dung của mình. Và cho em hỏi thêm, tên của MultiPage viết tiếng việt được không.
Em tạo một Form, trong form có tạo một MultiPage (gồm 2 trang). Cho em hỏi làm thế nào để mỗi khi Click vào mỗi MultiPage thì dòng Textbox trên Form sẽ thay đổi theo nội dung của mình. Và cho em hỏi thêm, tên của MultiPage viết tiếng việt được không.
Private Sub UserForm_Initialize()
With Me.MultiPage1
.Pages("THCN").Caption = "T" & ChrW(7893) & "ng H" & ChrW(7907) & "p"
.Pages("CTCN").Caption = "Chi Ti" & ChrW(7871) & "t"
End With
End Sub
PHP:
Private Sub MultiPage1_Change()
TextBox11 = MultiPage1.SelectedItem.Caption
End Sub
Cho mình hỏi thêm, khi mình vừa mở Form lên thì ở ô textbox không hiện gì hết. Chỉ khi nào click qua lại giữa các trang thì textbox mới xuất hiện. Cho mình hỏi, phải hoàn thiện như thế nào, khi load form là mặc định trang cần đến và chữ ở textbox cũng hiện ra luôn.
Nhân nói về MultiPage, đố các bạn biết làm cách nào để khi tôi đang Active 1 page nào đó rồi thoát Form thì lần sau gọi Form lên nó sẽ Active đúng Page ấy
Và thêm nữa: Cái vụ "nhớ" này phải có tác dụng ngay cả khi đóng file rồi mở trở lại (không dùng Define name và cell trên sheet để "nhớ")
Ẹc... Ẹc...
(Hic.. câu hỏi này lý ra phải cho vào mục Đố vui về VBA mới đúng chứ nhỉ?)
Kính gửi anh NDU và mọi người
Em có một thắc mắc sau muốn nhờ anh giải đáp.
Nếu em đặt tên sheet theo tên của tab: Ví dụ Sheet ABC, BCD, EFG tương ứng trong tab (ở đây em dùng TabStrip) cũng có các tab tên ABC, BCD, EFG. Trong mỗi sheet ABC, BCD, EFG vùng cần đưa listbox đều từ ô A4: đến ô cuối cùng có dữ liệu;
(TabStrip có tên là TabStrip1, Listbox có tên là Lisbox1 )
Em dùng code của anh NDU để lấy tên tab:
PHP:
Dim NameTab As String
NameTab = TabStrip1.SelectedItem.Caption
Và dùng code của anh Sealand để lấy Index của TabStrip đang active:
PHP:
Dim i as integer
i = TabStrip1..SelectedItem.Index
Vậy trong sự kiệnUserForm_Initialize em khai báo như thế nào để ứng với từng Tab có index i và có tên là NameTab, lisbox1 sẽ tự động lấy dữ liệu trong sheet có tên là NameTab với vùng dữ liệu được khai báo tại biến vung.
Em khai báo như thế này nhưng bị lỗi, không biết phải xử thế nào cho đúng:
PHP:
Private Sub UserForm_Initialize
Dim NameTab As String
Dim i As Integer
NameTab = TabStrip1.SelectedItem.Caption
i = Me.TabStrip1.SelectedItem.Index
Dim Vung as Range
Set vung = Range("C4:E" & Range("C65536").End(xlDown).Row) '- Sheet nào cũng có vùng giống nhau
IF Me.TabStrip1.Value = i Then
Lisbox1.RowSource = "NameTab!" & vung.Address
End if
End Sub
Báo lỗi dòng : "Lisbox1.RowSource = "NameTab!" & vung.Address "
Nhờ anh NDU và mọi người góp ý
Trân trọng cảm ơn.
Mong nhận được hồi đáp
Cảm ơn anh ptm0412.
Em sửa address lại thì đúng là không báo lỗi, nhưng khi run form thì listbox không hiện ra theo ý mình (Đã chọn tab khác nhunglistbox vẫn không thay đổi).
Gửi lên nhờ anh xem thử. Không biết em có viết nhầm chỗ nào không.
Thân.
Sự kiện Form_Initialize chỉ chạy 1 lần khi mở form.
Muốn làm gì đó khi thay đổi tab thì phải gắn vào sự kiện TabStrip1_Change:
PHP:
Private Sub TabStrip1_Change()
Dim NameTab As String
Dim Vung As Range
NameTab = TabStrip1.SelectedItem.Caption
Set Vung = Sheets(NameTab).Range("A4:C" & Range("A65536").End(xlDown).Row)
ListBox1.RowSource = NameTab & "!" & Vung.Address
End Sub
Còn Sự kiện Form_Initialize dùng khi mở form, để muốn mặc định tab nào đó được chọn, thì dùng code chọn:
PHP:
Private Sub UserForm_Initialize()
Dim NameTab As String
Dim Vung As Range
Me.TabStrip1.Value = 0
NameTab = TabStrip1.SelectedItem.Caption
Set Vung = Sheets(NameTab).Range("A4:C" & Range("A65536").End(xlDown).Row)
ListBox1.RowSource = NameTab & "!" & Vung.Address
End Sub
Sự kiện Form_Initialize chỉ chạy 1 lần khi mở form.
Muốn làm gì đó khi thay đổi tab thì phải gắn vào sự kiện TabStrip1_Change:
PHP:
Private Sub TabStrip1_Change()
Dim NameTab As String
Dim Vung As Range
NameTab = TabStrip1.SelectedItem.Caption
Set Vung = Sheets(NameTab).Range("A4:C" & Range("A65536").End(xlDown).Row)
ListBox1.RowSource = NameTab & "!" & Vung.Address
End Sub
Còn Sự kiện Form_Initialize dùng khi mở form, để muốn mặc định tab nào đó được chọn, thì dùng code chọn:
PHP:
Private Sub UserForm_Initialize()
Dim NameTab As String
Dim Vung As Range
Me.TabStrip1.Value = 0
NameTab = TabStrip1.SelectedItem.Caption
Set Vung = Sheets(NameTab).Range("A4:C" & Range("A65536").End(xlDown).Row)
ListBox1.RowSource = NameTab & "!" & Vung.Address
End Sub
Cảm ơn anh ptm0412
Đúng là càng tìm hiểu càng thấy mình ngu đi.
Lại cho em hỏi thêm về vấn đề này. Có cách nào để làm cho Caption của TabStrip tự động thay đổi theo tên sheet không?
Ý em là mặt dù thay đổi tên sheet thì caption của Tabscrip sẽ tự động thay đổi theo cái tên của Sheet đó. Như vậy dù cho người dung thay đổi tên sheet thế nào, thi Userform vẫn hoạt động. (Em lấy cái ví dụ Sheet2= DG1776)
PHP:
With Me.TabStrip1
.SelectedItem.Caption = Sheets(2).Name
End with
Em chưa hiểu phải ghi cú pháp như thế nào để đúng nữa anh.
Anh xem giúp nhé.
Cảm ơn anh.
Cảm ơn anh ptm0412
Đúng là càng tìm hiểu càng thấy mình ngu đi.
Lại cho em hỏi thêm về vấn đề này. Có cách nào để làm cho Caption của TabStrip tự động thay đổi theo tên sheet không?
Ý em là mặt dù thay đổi tên sheet thì caption của Tabscrip sẽ tự động thay đổi theo cái tên của Sheet đó. Như vậy dù cho người dung thay đổi tên sheet thế nào, thi Userform vẫn hoạt động. (Em lấy cái ví dụ Sheet2= DG1776)
PHP:
With Me.TabStrip1
.SelectedItem.Caption = Sheets(2).Name
End with
Em chưa hiểu phải ghi cú pháp như thế nào để đúng nữa anh.
Anh xem giúp nhé.
Cảm ơn anh.
1. Nếu có 2 tab, có thể dùng sheet Code Name gán trực tiếp như bài #16
2. Nếu có 3 tab trở lên ,dùng For như ndu (For i theo tổng số tab). Tuy nhiên cần phải theo quy định là những sheet không cần thiết phải để phía sau. Nếu không i sẽ chạy bậy. Insert thêm sheet cũng phải xác định loại sheet để đặt đúng vị trí.
Có thể dùng For each theo sheets và 1 biến i để đếm tab. Sheet nào có tên (code name) giống với sheet TH chẳng hạn, thì bỏ qua, còn khác thì gán name cho tabs(i).Caption, biến đếm tăng 1. Khi biến đếm lớn hơn Tabs.Count thì thoát. Đây là thủ thuật loại trừ ngược nên cũng có thể sinh ra sai sót nếu như số sheet cần thiết nhiều hơn số tab, hoặc ngược lại. Insert sheet ( loại TH) lại phải khai báo thêm
3. Nếu có nhiều sheet, thì bỏ tabstrip, dùng cách khác. Chứ ngó cái form hàng chục tab thấy ớn lắm.
1. Nếu có 2 tab, có thể dùng sheet Code Name gán trực tiếp như bài #16
2. Nếu có 3 tab trở lên ,dùng For như ndu (For i theo tổng số tab). Tuy nhiên cần phải theo quy định là những sheet không cần thiết phải để phía sau. Nếu không i sẽ chạy bậy. Insert thêm sheet cũng phải xác định loại sheet để đặt đúng vị trí.
Có thể dùng For each theo sheets và 1 biến i để đếm tab. Sheet nào có tên (code name) giống với sheet TH chẳng hạn, thì bỏ qua, còn khác thì gán name cho tabs(i).Caption, biến đếm tăng 1. Khi biến đếm lớn hơn Tabs.Count thì thoát. Đây là thủ thuật loại trừ ngược nên cũng có thể sinh ra sai sót nếu như số sheet cần thiết nhiều hơn số tab, hoặc ngược lại. Insert sheet ( loại TH) lại phải khai báo thêm
3. Nếu có nhiều sheet, thì bỏ tabstrip, dùng cách khác. Chứ ngó cái form hàng chục tab thấy ớn lắm.
Cảm ơn đóng góp của anh NDU và Ptm0412
Mình học hỏi được rất nhiều ở các anh.
Xin hỏi NDU. để lấy được tổng số tab có trong TabStrip1 có phải sử dụng dòng này không:
Nhân nói về MultiPage, đố các bạn biết làm cách nào để khi tôi đang Active 1 page nào đó rồi thoát Form thì lần sau gọi Form lên nó sẽ Active đúng Page ấy
Và thêm nữa: Cái vụ "nhớ" này phải có tác dụng ngay cả khi đóng file rồi mở trở lại (không dùng Define name và cell trên sheet để "nhớ")
Ẹc... Ẹc...
(Hic.. câu hỏi này lý ra phải cho vào mục Đố vui về VBA mới đúng chứ nhỉ?)
Dear ptm0412
Theo hướng dẫn của anh em đã làm được cái useform theo ý muốn.
Em tạo một textbox mới để nhập đoạn mã hiệu vào thì nó sẽ tự tìm mã hiệu trong lisbox (dang từ điển)
Đây là code của TextBox1_Change :
PHP:
Private Sub TextBox1_Change()
Dim Cls_tim As String
Dim Shtim_Name As String
Dim Rng_Tim As Range, Rng_Kq As Range
Shtim_Name = TabStrip1.SelectedItem.Caption
Set Rng_Tim = Sheets(Shtim_Name).Range("A4:C" & Range("A65536").End(xlDown).Row)
Cls_tim = TextBox1.Value
TextBox1 = UCase(TextBox1)
If Cls_tim = "" Then Exit Sub
Set Rng_Kq = Rng_Tim.Find(Cls_tim, , xlFormula, xlPart)
If Rng_Kq Is Nothing Then Exit Sub
ListBox1.RowSource = Shtim_Name & "!" & Rng_Kq.Address
End Sub
Khi chạy thì báo lỗi dòng: "Set Rng_Kq = Rng_Tim.Find(Cls_tim, , xlFormula, xlPart)"
Nhờ anh và AC trên GPE xem giúp.
Trân trọng.
Mong nhận được hồi đáp của AC
Dear ptm0412
Theo hướng dẫn của anh em đã làm được cái useform theo ý muốn.
Em tạo một textbox mới để nhập đoạn mã hiệu vào thì nó sẽ tự tìm mã hiệu trong lisbox (dang từ điển)
Đây là code của TextBox1_Change :
PHP:
Private Sub TextBox1_Change()
Dim Cls_tim As String
Dim Shtim_Name As String
Dim Rng_Tim As Range, Rng_Kq As Range
Shtim_Name = TabStrip1.SelectedItem.Caption
Set Rng_Tim = Sheets(Shtim_Name).Range("A4:C" & Range("A65536").End(xlDown).Row)
Cls_tim = TextBox1.Value
TextBox1 = UCase(TextBox1)
If Cls_tim = "" Then Exit Sub
Set Rng_Kq = Rng_Tim.Find(Cls_tim, , xlFormula, xlPart)
If Rng_Kq Is Nothing Then Exit Sub
ListBox1.RowSource = Shtim_Name & "!" & Rng_Kq.Address
End Sub
Khi chạy thì báo lỗi dòng: "Set Rng_Kq = Rng_Tim.Find(Cls_tim, , xlFormula, xlPart)"
Nhờ anh và AC trên GPE xem giúp.
Trân trọng.
Mong nhận được hồi đáp của AC
À, đúng là không phải vậy, do mình hiểu nhầm câu hỏi chớ lý nào hỏi dễ vậy.
Mình cứ nghĩ ndu hỏi là làm sao mặc định một Page khi form hiện lên. Còn cái vụ "nhớ" kia thì mình đã biết rồi. Sorry!
Cả ơn anh NDU góp ý:
Để bổ sung thêm nhiều giá trị hiển thị vào listbox em viết :
PHP:
Private Sub TextBox1_Change()
Dim Cls_tim As String
Dim Shtim_Name As String
Dim Rng_Tim As Range, Rng_Kq As Range
Shtim_Name = TabStrip1.SelectedItem.Caption
Set Rng_Tim = Sheets(Shtim_Name).Range("A4:C" & Range("A65536").End(xlDown).Row)
Cls_tim = TextBox1.Value
TextBox1 = UCase(TextBox1)
If Cls_tim = "" Then Exit Sub
Set Rng_Kq = Rng_Tim.Find(Cls_tim, , xlFormulas, xlPart)
If Rng_Kq Is Nothing Then Exit Sub
Dim Fist_Row as long, last_row as long
First_Row = Rng_Kq.Row
Last_row = Range("A65536").End(xlDown).Row
ListBox1.RowSource = "'[GPE.xls]" & Shtim_Name & " '!A" & First_row & ":C" & Last_row
End Sub
Em chạy bị báo lỗi. Em chưa hiểu nhiều về VB nên không biết phải sửa thế nào?
Xin hỏi anh Vba_GPe và mọi người.
Trong ví dụ của anh, biến Name_Tab sẽ lấy Caption của các tab trong TabStrip1:
PHP:
Dim Name_Tab As String
Name_Tab = TabStrip1.SelectedItem.Caption (Các Caption sẽ có dang: DG1776,DG1777)
'+ Em đặt thêm 1 biến nưa
Dim Name_Sh as String
Name_Sh = "DM"&Right(Name_Tab,4) (Ý: Ứng với mỗi Name_Tab là (DG1776,DG1777) thi Name_Sh sẽ là (DM1776,DM1777)
Em viết code như trên, nhưng khi F8 để chay thử thì tại dòng "Name_Sh = "DM"&Right(Name_Tab,4) " nó báo Name_Tab = "" và biến Name_Sh chỉ có giá trị là "DM" thôi.
Em chưa tìm ra vấn đề, kinh nhờ anh chị và mọi người giải đáp.
Cảm ơn anh chị.