Các câu hỏi về Form trong Excel VBA

Liên hệ QC

Tường_Vi

Thành viên tiêu biểu
Tham gia
19/4/10
Bài viết
482
Được thích
121
Nghề nghiệp
Luôn tìm kiếm một vị trí tốt hơn
Private Sub UserForm_Initialize()
.......................
.......................
.......................
End Sub


Em xin hỏi, sự kiện khí nào mình dùng sự kiện này Initialize

Cám ơn
 
Chưa hiểu bạn muốn làm cái gì, nhưng theo tôi với File này thì chỉ làm 1 sheet theo dõi, muốn ngày hoặc tháng nào thì lọc nó ra.
Nếu lọc tháng xong thì thêm code tách ngày của tháng đó.

Nói chung chỉ cần 2 sheet là đủ: 1 sheet theo dõi và 1 sheet lọc.
Như đã nêu ở trên file mình làm việc hằng ngày là file do cty lập sẳn nó khoá hết toàn bộ chức năng và chỉ cho ta thao tác trên nhưng ô không khoá thôi và mình cũng không đc quền thêm sheet vào. Hằng giờ phải lọc dư liệu trên mail và đưa dử liệu vào file đó sử lý số liệu rồi lại mail cho phòng ban khác . Mình viết vba cho mọi người trong phòng cùng sai. Để cho những người không biết nhiều về excel cũng dùng đc nhằm giảm tối đa những sai sót khi nhập liệu .
 
Upvote 0
Như đã nêu ở trên file mình làm việc hằng ngày là file do cty lập sẳn nó khoá hết toàn bộ chức năng và chỉ cho ta thao tác trên nhưng ô không khoá thôi và mình cũng không đc quền thêm sheet vào. Hằng giờ phải lọc dư liệu trên mail và đưa dử liệu vào file đó sử lý số liệu rồi lại mail cho phòng ban khác . Mình viết vba cho mọi người trong phòng cùng sai. Để cho những người không biết nhiều về excel cũng dùng đc nhằm giảm tối đa những sai sót khi nhập liệu .
Tôi chỉ đưa ra giải pháp, còn Công ty không muốn thay đổi thì tôi chịu (không thể góp ý), khi Công ty không muốn thay đổi..
 
Upvote 0
Tôi chỉ đưa ra giải pháp, còn Công ty không muốn thay đổi thì tôi chịu (không thể góp ý), khi Công ty không muốn thay đổi..
Họ có y cũa họ và mình cũng có ý cũa mình moa, có góp ý rồi nhưng kg thấy họ phản hồi gì cũng đành chịu. Hôi mình mới vào làm việc thấy các cụ trong phòng nhập số liệu vào file theo phương thức bằng tay nhình mà chán đời thôi rồi mất cả 30 phút nhập số liệu mà còn sai tùm lum, mình đã làm lại cho phòng vài thứ bây giờ đã cải thiện nhiều rồi nhưng vẫn còn nhiều sai sót .
 
Upvote 0
Họ có y cũa họ và mình cũng có ý cũa mình moa, có góp ý rồi nhưng kg thấy họ phản hồi gì cũng đành chịu. Hôi mình mới vào làm việc thấy các cụ trong phòng nhập số liệu vào file theo phương thức bằng tay nhình mà chán đời thôi rồi mất cả 30 phút nhập số liệu mà còn sai tùm lum, mình đã làm lại cho phòng vài thứ bây giờ đã cải thiện nhiều rồi nhưng vẫn còn nhiều sai sót .
Tôi chỉ góp ý vậy thôi, còn công việc thì phải từ từ.
Nếu bạn mới vào làm thì không nên nên góp ý linh tinh sẽ mang họa vào thân, mặc dù mình góp ý hay đó nhưng họ chẳng bao giờ nghe cả vì cách làm của họ đã có nền nếp, quy cũ (muốn thay đổi một sớm một chiều thì rất khó) thôi đành sống chung với lũ vậy, khi nào ngập hết không có chỗ trú thì họ mới bám lấy mình.
 
Upvote 0
Cảm ơn nhưng lời góp ý chân thành, mình chỉ làm cho phòng cũa mình thôi, họ thấy hay và nhờ mình làm sao cho công việc càng ngày càng đơn giản hóa đi và năng suất tăng lên, mổi ngày mình dành ra 2h để nghiên cứu cái VBA này cũng vì mục đích đó càng học thấy càng nghiền cái VBA này luôn thời gian ranhe là lao đầu vào đọc code. Ước gì việc copy paste lên form giống như copy paste trên các bảng tính thì không phải đau đầu như bây giờ.
PHP:
Sub CommandButton1_Click()
Dim DataObj As MSForms.DataObject
'----Ham nay lay data tu Clipboard
Dim MyString As Variant
Dim MyS As String
Dim x As Integer, i As Integer
Dim text As String, Editext As String
Dim icount As Long
Dim n As Integer
Dim ar As Variant
Dim Ghep As String

Set DataObj = New MSForms.DataObject
On Error GoTo Whoa
DataObj.GetFromClipboard
MyString = DataObj.GetText(1)
MsgBox MyString
[I21] = MyString
'-- khong co du lieu vao day
Whoa:
   If Err <> 0 Then MsgBox "Khong co du lieu trong Clipboard"
 
   text = Trim([I21]) '(( neu la mot [321 3213 3213 3213 3213] thi hame chay tot

 ' dem chuoi
 ' lan sau dung Funtion WorkSheetFuntion SubTitute // ham excel
    x = DemKT(text) + 1 ' dem so khoang trang
 
    Debug.Print x
    On Error Resume Next
   
    For i = 1 To 1
        ar = Split(text, " ", x)
        TextBox1 = ar(0)
        TextBox2 = ar(1)
        TextBox3 = ar(2)
        TextBox4 = ar(3)
        TextBox5 = ar(4)
        TextBox6 = ar(5)
        Next
        On Error GoTo 0
     
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

Private Sub CommandButton3_Click()

End Sub
Function DemKT(Chuoi As String) As Long
Trim (Chuoi)
  DemKT = Len(Chuoi) - Len(Replace(Chuoi, " ", ""))
End Function
Function JoinText(Vung As Range, Optional PC As String = ", ") As String
  On Error GoTo Tiep1
  With Application.WorksheetFunction
    JoinText = Join(.Transpose(Vung), Chr(13))
    GoTo Tiep2
Tiep1:
    JoinText = Join(.Transpose(.Transpose(Vung)), Chr(13))
  End With
Tiep2:
  JoinText = Replace(JoinText, " ", Chr(10))
  JoinText = Replace(JoinText, Chr(13), " ")
  JoinText = WorksheetFunction.Trim(JoinText)
  JoinText = Replace(JoinText, " ", PC)
  JoinText = Replace(JoinText, Chr(10), " ")
End Function

Private Sub UserForm_Click()

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn nhưng lời góp ý chân thành, mình chỉ làm cho phòng cũa mình thôi, họ thấy hay và nhờ mình làm sao cho công việc càng ngày càng đơn giản hóa đi và năng suất tăng lên, mổi ngày mình dành ra 2h để nghiên cứu cái VBA này cũng vì mục đích đó càng học thấy càng nghiền cái VBA này luôn thời gian ranhe là lao đầu vào đọc code. Ước gì việc copy paste lên form giống như copy paste trên các bảng tính thì không phải đau đầu như bây giờ.
PHP:
Sub CommandButton1_Click()
Dim DataObj As MSForms.DataObject
'----Ham nay lay data tu Clipboard
Dim MyString As Variant
Dim MyS As String
Dim x As Integer, i As Integer
Dim text As String, Editext As String
Dim icount As Long
Dim n As Integer
Dim ar As Variant
Dim Ghep As String

Set DataObj = New MSForms.DataObject
On Error GoTo Whoa
DataObj.GetFromClipboard
MyString = DataObj.GetText(1)
MsgBox MyString
[I21] = MyString
'-- khong co du lieu vao day
Whoa:
   If Err <> 0 Then MsgBox "Khong co du lieu trong Clipboard"
 
   text = Trim([I21]) '(( neu la mot [321 3213 3213 3213 3213] thi hame chay tot

 ' dem chuoi
 ' lan sau dung Funtion WorkSheetFuntion SubTitute // ham excel
    x = DemKT(text) + 1 ' dem so khoang trang
 
    Debug.Print x
    On Error Resume Next
  
    For i = 1 To 1
        ar = Split(text, " ", x)
        TextBox1 = ar(0)
        TextBox2 = ar(1)
        TextBox3 = ar(2)
        TextBox4 = ar(3)
        TextBox5 = ar(4)
        TextBox6 = ar(5)
        Next
        On Error GoTo 0
    
End Sub

Private Sub CommandButton2_Click()
Unload Me
End Sub

Private Sub CommandButton3_Click()

End Sub
Function DemKT(Chuoi As String) As Long
Trim (Chuoi)
  DemKT = Len(Chuoi) - Len(Replace(Chuoi, " ", ""))
End Function
Function JoinText(Vung As Range, Optional PC As String = ", ") As String
  On Error GoTo Tiep1
  With Application.WorksheetFunction
    JoinText = Join(.Transpose(Vung), Chr(13))
    GoTo Tiep2
Tiep1:
    JoinText = Join(.Transpose(.Transpose(Vung)), Chr(13))
  End With
Tiep2:
  JoinText = Replace(JoinText, " ", Chr(10))
  JoinText = Replace(JoinText, Chr(13), " ")
  JoinText = WorksheetFunction.Trim(JoinText)
  JoinText = Replace(JoinText, " ", PC)
  JoinText = Replace(JoinText, Chr(10), " ")
End Function

Private Sub UserForm_Click()

End Sub
Bạn sửa như thế này
Mã:
Whoa:
   If Err <> 0 Then MsgBox "Khong co du lieu trong Clipboard"
   text = MyString '(( neu la mot [321 3213 3213 3213 3213] thi hame chay tot
 ' dem chuoi
 ' lan sau dung Funtion WorkSheetFuntion SubTitute // ham excel
    For i = 1 To 1
        ar = Split(text, ChrW(9))
       
        TextBox1 = ar(0)
        TextBox2 = ar(1)
        TextBox3 = ar(2)
        TextBox4 = ar(3)
        TextBox5 = ar(4)
        TextBox6 = ar(5)
    Next
Đó là đoạn Code của bạn nên chắc bạn biết chỗ rồi.
 
Upvote 0
Bạn sửa như thế này
Mã:
Whoa:
   If Err <> 0 Then MsgBox "Khong co du lieu trong Clipboard"
   text = MyString '(( neu la mot [321 3213 3213 3213 3213] thi hame chay tot
 ' dem chuoi
 ' lan sau dung Funtion WorkSheetFuntion SubTitute // ham excel
    For i = 1 To 1
        ar = Split(text, ChrW(9))
      
        TextBox1 = ar(0)
        TextBox2 = ar(1)
        TextBox3 = ar(2)
        TextBox4 = ar(3)
        TextBox5 = ar(4)
        TextBox6 = ar(5)
    Next
Đó là đoạn Code của bạn nên chắc bạn biết chỗ rồi.
thanks ban nhiều nó chay đc rồi đúng như y mình bây giờ thêm code giải phóng clipboard nữa là ok
 
Upvote 0
Vậy 100 ô có fải kèm theo với chúng là 100 TextBox à? Dù cho ô tương ứng với TextBox nào đó không được chọn lần này; mà chọn lần kế tiếp.
 
Upvote 0
Vậy 100 ô có fải kèm theo với chúng là 100 TextBox à? Dù cho ô tương ứng với TextBox nào đó không được chọn lần này; mà chọn lần kế tiếp.

100 tính 100, Hiện gờ chỉ có 6 thì tính theo 6. Code chữa cháy mà bác. Nguyên tắc: đốt gì cháy nấy.
 
Upvote 0
Cảm ơn gpe giúp đở mình nhiều. Cái Form mới chỉ hoàn thành xong cái micro bây giờ đến giai đoạn Macro . Chạy lên lổi um sà lùm, xin cty nghỉ phép một tháng mục đích chính là để làm cái form này không mong gì hơn chỉ cho nó chạy suôn sẻ lúc đầu thôi sau đó mới cô gắng học Vba cho bài bản chư tay ngang như thế này đau đây nhức óc moà bạc hết cả đầu.
 
Upvote 0
Nhơ các a chỉnh giúp em cái Form tiết em làm nó cứ báo lổi xuốt:
Em mới lập thê Sư kiện Private Sub UserForm_Initialize() là khi mở Form lên thì nó cập nhật Dử liệu bên Sheet tại thời điểm đó sau đó ta co thê thay đôi dử liệu và Save lại.
PHP:
Private Sub UserForm_Initialize() ' Gia tri khi mo Form

Private Sub UserForm1_Initialize() ' Gia tri khi mo Form

Dim Sh As Worksheet, Cls As Range
Set Sh = ThisWorkbook.Worksheets(CStr(Day([I1].Value))) 'use ham CStr Day sang Sting
Dim TB As TextBox
Dim i As Integer, j As Integer, k As Integer
'---lay gia tri ngay tu I1
'  dung SET de khai bao bien doi tuong//giai phong set xx= nothing
'-----------------------------MSP1
 For i = 1 To 6
 TB(i).text = Sh.Range("B45").Offset(0, i)
 Exit For
 Next i

 For j = 7 To 12
 TB(j).text = Sh.Range("B49").Offset(0, j)
 Exit For
 Next j

 For k = 13 To 17
 TB(k).text = Sh.Range("B49").Offset(k, 0)
 Exit For
 Next k
  TB(18).text = Sh.Range("B49").Offset(k, 7)
  TB(19).text = Sh.Range("B49").Offset(k, 10)

 '
 ' Dung ham Offfet

'''' Erro
 
   

End Sub
 

File đính kèm

  • GPE_2-5.xlsm
    733.9 KB · Đọc: 18
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn gpe giúp đở mình nhiều. Cái Form mới chỉ hoàn thành xong cái micro bây giờ đến giai đoạn Macro . Chạy lên lổi um sà lùm, xin cty nghỉ phép một tháng mục đích chính là để làm cái form này không mong gì hơn chỉ cho nó chạy suôn sẻ lúc đầu thôi sau đó mới cô gắng học Vba cho bài bản chư tay ngang như thế này đau đây nhức óc moà bạc hết cả đầu.
Bạn đi không đúng hướng nên thời gian nhiều mà hiệu quả ít.

Ví thử bài số #131 của bạn, bạn có những từ khóa để mà đọc: Vòng lặp For....Next, Exit For, Offset .... nó là cái gì? Tác dụng? Câu lệnh đi như thế nào? Bạn đã tìm hiểu đâu, cũng chỉ mất 2 tiếng để tìm, đọc, hiểu. Tài liệu thì đầy ra.

Phía trên tôi nói bạn đi không đúng hướng, cũng ví dụ như bài #131 của bạn: tại sao bạn không bắt đầu từ 1 control, từ 1 ô. Sau đó tới 2 ô, 3 ô, ..5 ô, sau đó hãy chuyển qua vòng lặp, vì bạn làm từng dòng lặp đi lặp lại mới biết cái gì lặp cái gì không.

Việc Logic trong suy nghĩ lập trình theo tôi là quan trọng nên khuyên bạn hãy đi dần dần từng bước.

* Đằng nào cũng viết dài thì dài thêm 1 chút với bạn về cái "dần dần".
Bài #126 tôi trả lời cho bạn #125

Trong #125 của bạn, bạn đã định hướng đúng
Mã:
ar = Split(text, " ", x)
nhưng bạn có tìm hiểu Split nó như thế nào? Cái x của bạn để làm gì? Cái " " của bạn để làm gì?
Nếu bạn tìm hiểu thì bạn sẽ có câu trả lời như #126 của tôi, vì tôi biết Split nó như thế nào, cái " " của bạn nó không phải là dấu cách mà là cái gì đó, cái gì thì phải tìm mới biết, phải để chính Code đọc cho nó là Chrw(9) mà thay vào cái " ".

Dài vậy thôi để bạn tự ngẫm và chúc bạn thành công!
 
Upvote 0
Cảm ơn a dhn46 đã khuyên mình! Có lẻ nên nghỉ ngơi không lải tẩu hoả nhập ma mất. Càng làm càng sai. Lực tốc bất đạt. Dùng vòng lặp for each có lẻ hay hơn.
 
Upvote 0
Mã:
Private Sub Nutsua_Click()
Dim i As Long, currRow As Long, LastRow As Long, Arr(1 To 7)
LastRow = Worksheets("Khachhang").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
i = ListBox1.ListIndex
Arr(1) = Stt
Arr(2) = Me.cobtenKH.Value
'arr(3) = Me.gioitinh.Value
Arr(4) = Me.cobPhone.Value
Arr(5) = Me.txtADD.Text
Arr(6) = Me.cobNhom.Value
Arr(7) = Me.txtNote.Text
Sheet7.Range("A3").Offset(Stt).Resize(1, 7).Value = Arr
RefreshListbox
End Sub
Đây là 1 đoạn code mình copy trên diễn dàn dùng để chỉnh sửa và lưu dữ liệu. Nhờ GPE giải thích và cách vận dụng để chỉnh sửa và lưu dữ liệu lại với.
 
Upvote 0
Có cách gì để chỉnh kích thước chữ trong page của Form này không các bác? Xin cảm ơn ạ
 

File đính kèm

  • 12345.jpg
    12345.jpg
    119.3 KB · Đọc: 13
Upvote 0
Hi all. Listbox của mình làm có 1 cột gồm các số thập phân ví dụ như là 0.6231285, Các bạn Cho mình hỏi có cách nào chỉ hiện lên 2 chữ số sau dấu "." không ạ (0.6231285->0.62). Thanks
 
Upvote 0
mọi người ai giúp em với, em muốn thay đổi cái combo box (Thay đổi kích thước và vị trí) có được không ạh. Em cám ơn
 
Upvote 0
Web KT
Back
Top Bottom