Nhờ hướng dẫn (gợi ý) giải quyết vấn đề bằng VBA

Liên hệ QC

tungnguyen_kt

Thành viên gắn bó
Thành viên BQT
Super Moderator
Tham gia
25/6/08
Bài viết
2,900
Được thích
12,082
Giới tính
Nam
Em xin phép mở topic này với hy vọng được trợ giúp từng bước để thực hành VBA.

Có thể có những câu hỏi "ngớ ngẩn" nhưng đằng sau những câu hỏi ấy là niềm mong mỏi các Thầy, các anh chị sớm giúp đỡ.

Câu hỏi "mở hàng" cho topic này như sau:

* Em muốn làm một form nhập liệu trong đó Combobox và cả textbox

Trong đó combobox lấy data từ list còn textbox là nhập liệu bình thường sau đó dữ liệu này sẽ chạy về 1 sheet

Thêm một cái nữa là ví dụ như: Combo_1 chọn mã khách hàng là NTT thì kế dưới là một texbox chẳng hạn sẽ lookup theo danh sách và tự động hiện luôn trên textbox này để kiểm tra.

Thông cảm diễn giải câu hỏi dài dòng (mà chưa chắc rõ) cũng vì cái tội quá kém VBA.

Rất mong anh chị sớm quan tâm hướng dẫn em làm.
 
Em xin phép mở topic này với hy vọng được trợ giúp từng bước để thực hành VBA.

Có thể có những câu hỏi "ngớ ngẩn" nhưng đằng sau những câu hỏi ấy là niềm mong mỏi các Thầy, các anh chị sớm giúp đỡ.

Câu hỏi "mở hàng" cho topic này như sau:

* Em muốn làm một form nhập liệu trong đó Combobox và cả textbox

Trong đó combobox lấy data từ list còn textbox là nhập liệu bình thường sau đó dữ liệu này sẽ chạy về 1 sheet

Thêm một cái nữa là ví dụ như: Combo_1 chọn mã khách hàng là NTT thì kế dưới là một texbox chẳng hạn sẽ lookup theo danh sách và tự động hiện luôn trên textbox này để kiểm tra.

Thông cảm diễn giải câu hỏi dài dòng (mà chưa chắc rõ) cũng vì cái tội quá kém VBA.

Rất mong anh chị sớm quan tâm hướng dẫn em làm.
Vấn đề là đã biết làm CN hay TextBox chưa hay là hướng dẫn từ đầu về VBA.
Record macro
A1=1
A2=2
A3=A1+A2
msgbox A3
Tùng nên làm sẵn 1 file demo gồm List gì, CB lấy cái gì thì mối biết mà chỉ.
bmvnah
 
Vấn đề là đã biết làm CN hay TextBox chưa hay là hướng dẫn từ đầu về VBA.
Record macro
A1=1
A2=2
A3=A1+A2
msgbox A3
Tùng nên làm sẵn 1 file demo gồm List gì, CB lấy cái gì thì mối biết mà chỉ.
bmvnah

Có ngay đây Thầy ơi

.........................................
 

File đính kèm

cho e hỏi 1 câu được không a?
có cách nào khi copy past mà chỉ có thể past vào các ô trống. còn các ô có dữ liệu thì không thể past đè lên được không ạ
cám ơn mọi người.
 
cho e hỏi 1 câu được không a?
có cách nào khi copy past mà chỉ có thể past vào các ô trống. còn các ô có dữ liệu thì không thể past đè lên được không ạ
cám ơn mọi người.
Sao tự nhiên chen ngang vào thế này? Cần hỏi gì thì mở chủ đề mới chứ!
 
xin lỗi chú. nhưng cháu là thành viên mới, ko biết mở chủ đề như thế nào cả. có gì không phải xin mọi người luongj thứ cho.
 
xin lỗi chú. nhưng cháu là thành viên mới, ko biết mở chủ đề như thế nào cả. có gì không phải xin mọi người luongj thứ cho.

Mình hướng dẫn sơ lược về cách tạo chủ đề mới
1/ Chọn mục "Diễn Đàn" & cũng nhớ Đăng nhập Nick của bạn
2/ Chọn tiếp Mục có liên quan đến vấn đề bạn muốn hỏi, tôi thấy Bài #4 mà bạn muốn hỏi sẽ liên quan đến mục"Lập trình với Excel" vậy tạm thời chọn mục này
3/ gần góc trên bên trái bạn sẽ thấy : "+Gởi đề tài mới" ---> chọn mục này & tiếp tục.
3/
 
Có ngay đây Thầy ơi

.........................................
Dùng form trên sheet quen nên quên cách làm.
Nhân bài của Tùng mới nhớ lại bài tạo form cách đây lâu lắm rồi.
Có thể làm được nhưng chả biết hướng dẫn.
Tiện đây nhờ các bạn hường dẫn cách tạo CB trên form từ Array giúp.
1/ Phần ngày chắc dùng DTPicker
3/ Phần định dạng số nhập có phân cách thì có code của SoiBien rồi
Chỉ còn phần 2 CB là chhưa biết làm thế nào cho hay. Dùng ListBox quen giờ quên cách dùng CB.
Phần định dạng thì dùng code.
PHP:
Private Sub txtScreen_Change()
Dim Value As String
Dim strFmt As String
Dim i As Integer
Dim decSep As String
Dim thsdSep As String

Value = txtscreen.Text
strFmt = ""

If Value Like "*" & "." & "*" & "." & "*" Then Value = Left(Value, Len(Value) - 1)
'check valid character
If Not (IsNumeric(Value) _
    Or Value = "-" _
    Or Value = "." _
    Or Value = "-0" _
    Or Value = "-." _
    Or Value = "-0.") _
    Or Right(Value, 1) = "," Then
        If Len(Value) > 0 Then Value = Left(Value, Len(Value) - 1)
Else
    ' Check Negative value with many 0 leader
    If Not (Left(Value, 1) = "-" And Val(Value) = 0) Then
        'start string Format
        strFmt = "#,##0"
        'check if it is Decimal or not
        If Value Like "*" & "." & "*" Then
            strFmt = strFmt & "."
            For i = 1 To Len(Value) - InStr(1, Value, ".")
                'Increase Zero Number after Decimal of strFmt
                strFmt = strFmt & 0
            Next
        End If
        strFmt = strFmt ' & ";-" & strFmt
        Value = Format(Value, strFmt)
    End If ' End check negative value with many 0 leader
End If ' End check valid Character

txtscreen.Text = Value

End Sub
Cám ơn các bạn nhiều.

Tóm gọn yêu cầu như sau
Tạo 1 CB trên form khi chọn MaKH thì TxtBox sẽ hiện tên KH.
 
Mình có thể dùng ADO để kết nối CSDL, chọn DL cần đưa vào CB.
 
Mình hướng dẫn thì kém lắm, bạn tự tham khảo nha
 

File đính kèm

Tạo 1 CB trên form khi chọn MaKH thì TxtBox sẽ hiện tên KH.

Như em đã nói ở trên mình dùng ADO để đưa dữ liệu vào Combo.
1./ Kết nối với CSDL là file hiện hành.

Mã:
Public cnn As New ADODB.Connection

Sub Moketnoi()
  With cnn
    .ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & _
                        ThisWorkbook.FullName & "; " & _
                        "Extended Properties=Excel 8.0;"
    .CursorLocation = adUseClient
    .Open
  End With
    
End Sub
2./ Chọn bảng ThongTin và đưa dữ liệu vào Combo:

Mã:
Private Sub UserForm_Initialize()
Dim arrValue As Variant
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State = 1 Then cnn.Close
    Moketnoi
    lsSQL = "select * from [ThongTin$]"
       rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
       arrValue = rst.GetRows()
        With ComboBox1
            .Clear
            .List = arrValue
            .List = Application.Transpose(arrValue)
        End With
 rst.Close
 Set rst = Nothing
 cnn.Close
 Set cnn = Nothing
     
End Sub

3./ Khi chọn thay đổi dữ liệu trong Combo thì TexBox3 sẽ hiện tên theo tương ứng.

Mã:
Private Sub ComboBox1_Change()
TextBox3 = ComboBox1.Column(1)


End Sub

*/ Nhân tiện có bài viết này chúng ta sẽ tiếp tục bàn về ADO căn bản, mong các anh chị quan tâm thảo luận thêm.
- Làm sao để lấy dữ liệu duy nhất đưa vào Combo (Có 2 cách)
- Sắp xếp dữ liệu trong Combo theo thứ tự cột đầu tiên.
 

File đính kèm

Như em đã nói ở trên mình dùng ADO để đưa dữ liệu vào Combo.
1./ Kết nối với CSDL là file hiện hành.

Mã:
Public cnn As New ADODB.Connection

Sub Moketnoi()
  With cnn
    .ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & _
                        ThisWorkbook.FullName & "; " & _
                        "Extended Properties=Excel 8.0;"
    .CursorLocation = adUseClient
    .Open
  End With
    
End Sub
2./ Chọn bảng ThongTin và đưa dữ liệu vào Combo:

Mã:
Private Sub UserForm_Initialize()
Dim arrValue As Variant
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State = 1 Then cnn.Close
    Moketnoi
    lsSQL = "select * from [ThongTin$]"
       rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
       arrValue = rst.GetRows()
        With ComboBox1
            .Clear
            .List = arrValue
            .List = Application.Transpose(arrValue)
        End With
 rst.Close
 Set rst = Nothing
 cnn.Close
 Set cnn = Nothing
     
End Sub

3./ Khi chọn thay đổi dữ liệu trong Combo thì TexBox3 sẽ hiện tên theo tương ứng.

Mã:
Private Sub ComboBox1_Change()
TextBox3 = ComboBox1.Column(1)


End Sub

*/ Nhân tiện có bài viết này chúng ta sẽ tiếp tục bàn về ADO căn bản, mong các anh chị quan tâm thảo luận thêm.
- Làm sao để lấy dữ liệu duy nhất đưa vào Combo (Có 2 cách)
- Sắp xếp dữ liệu trong Combo theo thứ tự cột đầu tiên.
Vậy có nghĩa là có thể dùng ADO lấy dữ liệu cho vào 1 mảng? (tôi thắc mắc hôm trước, nay mới có trả lời)
Ngon!
----------------------
Mà nè, cái đoạn này:
.List = Application.Transpose(arrValue)
Không nên dùng như vậy! Tốt nhất là dùng 2 vòng lập để transpose sẽ hay và nhanh hơn (đó là chưa nói đến trường hợp hàm TRANSPOSE có giới hạn sẽ bị "vỡ" với dữ liệu lớn)
----------------------
Nhân tiện, Hai Lúa hướng dẫn cách lọc Unique đi (phải thêm code gì?)
 
Nhân tiện, Hai Lúa hướng dẫn cách lọc Unique đi (phải thêm code gì?)

Lọc duy nhất như em nói ở trên thì nó có 2 cách Thầy à nhưng kết quả giống nhau (Em chưa Test về tốc độ)
Chỉ cần thay thêm chút xíu đoạn truy vấn ở trên là được.

- Cách 1: mình dùng GroupBy để lấy dữ liệu duy nhất.

Mã:
lsSQL = "select [NCC], [TEN_NCC] from [ThongTin$] group by [NCC], [TEN_NCC]"

- Cách 2: Mình dùng distinct để lấy dữ liệu duy nhất.

Mã:
lsSQL = "select distinct * from [ThongTin$]"
 
Lọc duy nhất như em nói ở trên thì nó có 2 cách Thầy à nhưng kết quả giống nhau (Em chưa Test về tốc độ)
Chỉ cần thay thêm chút xíu đoạn truy vấn ở trên là được.

- Cách 1: mình dùng GroupBy để lấy dữ liệu duy nhất.

Mã:
lsSQL = "select [NCC], [TEN_NCC] from [ThongTin$] group by [NCC], [TEN_NCC]"

- Cách 2: Mình dùng distinct để lấy dữ liệu duy nhất.

Mã:
lsSQL = "select distinct * from [ThongTin$]"
Theo kết quả thí nghiệm, tôi thấy nó lấy Unique TOÀN BỘ DỮ LIỆU chứ không riêng cột nào cả! Đúng không?
Liệu có thể lấy duy nhất cho 1 cột, các cột khác "theo" được không nhỉ?
(mấy cái ngôn ngữ này khó nhớ quá... Chắc phải thuộc lòng thôi)
 
Theo kết quả thí nghiệm, tôi thấy nó lấy Unique TOÀN BỘ DỮ LIỆU chứ không riêng cột nào cả! Đúng không?
Liệu có thể lấy duy nhất cho 1 cột, các cột khác "theo" được không nhỉ?
(mấy cái ngôn ngữ này khó nhớ quá... Chắc phải thuộc lòng thôi)

Câu hỏi này em hỏi anh HLMT hôm thứ 7 thì anh ấy nói là lấy toàn bộ sheet (bảng). Không lấy theo list.
 
Theo kết quả thí nghiệm, tôi thấy nó lấy Unique TOÀN BỘ DỮ LIỆU chứ không riêng cột nào cả! Đúng không?
Liệu có thể lấy duy nhất cho 1 cột, các cột khác "theo" được không nhỉ?
(mấy cái ngôn ngữ này khó nhớ quá... Chắc phải thuộc lòng thôi)

Hoàn toàn có thể lấy được Thầy à, ở trên là em lấy toàn bộ bảng, nếu Thầy muốn lấy cột nào thì chỉ Select cột đó là OK
Ví dụ:

Dùng GroupBy (Cột NCC):

Mã:
lsSQL = "select [NCC] from [ThongTin$] group by [NCC]"

Dùng distinct (Cột TEN_NCC):

Mã:
lsSQL = "select distinct [TEN_NCC] from [ThongTin$]"

* Thầy muốn cột nào thì chọn tiêu đề của cột đó, muốn chon hết thì thay = dấu sao "*"
 
E chưa biết dùng DTPicker nên lấy tạm của a SeaLand gán vào file thử. A HD thêm giúp e làm sao khi chọn ngày xong thì con trỏ nhảy đến CB01. Cám ơn Anh.
 

File đính kèm

Câu hỏi này em hỏi anh HLMT hôm thứ 7 thì anh ấy nói là lấy toàn bộ sheet (bảng). Không lấy theo list.

Chỉ hỏi thế thôi chứ cho dù không làm được cũng không sao!
Mục đích lấy dữ liệu bằng ADO cho vào mảng đã đạt được! Mọi thứ đã nằm trong mảng rồi, ta muốn làm gì tiếp mà chẳng được!
Ẹc... Ẹc...
 
Web KT

Bài viết mới nhất

Back
Top Bottom