Hỏi về tìm kiếm dữ liệu bất kỳ từ nhiều Sheet và hiển thị kết quả trên form (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

rickypham

Thành viên hoạt động
Tham gia
6/11/09
Bài viết
150
Được thích
3
Em có file như đính kèm gồm 2 sheet bảng giá,
Nay em muốn thiết kế một form như trong file và khi gõ tìm một chứ bất kỳ ví dụ "kính" rồi bấm tìm kiếm thì nó sẽ liệt kê ra tất cả các dòng của Sheet Thi truong và Sheet lien so những kết quả có chữ kính đó và hiển thị ra bên dưới.
Mong các anh chị giúp em vì em chưa rành về VBA lắm.
 

File đính kèm

Em có file như đính kèm gồm 2 sheet bảng giá,
Nay em muốn thiết kế một form như trong file và khi gõ tìm một chứ bất kỳ ví dụ "kính" rồi bấm tìm kiếm thì nó sẽ liệt kê ra tất cả các dòng của Sheet Thi truong và Sheet lien so những kết quả có chữ kính đó và hiển thị ra bên dưới.
Mong các anh chị giúp em vì em chưa rành về VBA lắm.
Chỉnh lại tên sheet của sheet [Thi truong] thành [Thitruong], [Lien so] thành sheet [Lienso] (Tức là không có dấu cách trắng)

Chép code sau vào sự kiện click của nút trong form

[GPECODE=sql]Private Sub CommandButton1_Click()
Dim adoConn As Object, adoRS As Object
Set adoConn = CreateObject("ADODB.Connection")
Set adoRS = CreateObject("ADODB.Recordset")
With adoConn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.FullName & _
";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"";"
.Open
End With
With adoRS
.ActiveConnection = adoConn
.Open "select * from " & _
"(SELECT 'Sheet ThiTruong',* FROM [Thitruong$A2:I100] " & _
"Union ALL " & _
"SELECT 'Sheet LienSo',* FROM [Lienso$A2:I100]) " & _
"WHERE F2 LIKE '%" & Me.TextBox1.Text & "%'"
If Not (.bof And .EOF) Then
ListBox1.ColumnCount = .Fields.Count
ListBox1.Column = .getrows()
End If
.Close
End With
Set adoRS = Nothing
adoConn.Close: Set adoConn = Nothing

End Sub

[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ cám ơn anh, nhưng mà khi em tìm alu thì nó lại không ra phải gõ chính xác là ALU mới đc, có cách nào để tìm chữ thường hay hoa đều đc không anh nhỉ?
Thứ 2 là tìm xong một cái rồi em muốn tìm nữa thì lại không đc mà phải tắt đi bật lại hơi bất tiện.
 
Upvote 0
Dạ cám ơn anh, nhưng mà khi em tìm alu thì nó lại không ra phải gõ chính xác là ALU mới đc, có cách nào để tìm chữ thường hay hoa đều đc không anh nhỉ?
Thứ 2 là tìm xong một cái rồi em muốn tìm nữa thì lại không đc mà phải tắt đi bật lại hơi bất tiện.
Bạn chép code sau vào form

Mã:
Dim adoConn As Object, adoRS As Object
Private Sub CommandButton1_Click()
Set adoRS = CreateObject("ADODB.Recordset")
With adoRS
    .ActiveConnection = adoConn
    .Open "select * from " & _
              "(SELECT 'Sheet ThiTruong',* FROM [Thitruong$A2:I100] " & _
              "Union ALL " & _
              "SELECT 'Sheet LienSo',* FROM [Lienso$A2:I100]) " & _
              "WHERE ucase(F2) LIKE '%" & UCase(Me.TextBox1.Text) & "%'"
        If Not (.bof And .EOF) Then
            ListBox1.ColumnCount = .Fields.Count
            ListBox1.Column = .getrows()
        End If
    .Close
End With

End Sub

Private Sub UserForm_Initialize()
Set adoConn = CreateObject("ADODB.Connection")
With adoConn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.FullName & _
                        ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"";"
    .Open
End With

End Sub

Private Sub UserForm_Terminate()
adoConn.Close
Set adoRS = Nothing: Set adoConn = Nothing

End Sub
 
Upvote 0
Dạ em cám ơn anh, cho em hỏi thêm một chút ạ.

1. Khi mình sử dụng các phiên bản excel khác nhau thì "Provider=Microsoft.Jet.OLEDB.4.0" có bị sao không ạ?
2. Muốn thay đổi bề rộng của cột khi xuất ra có đc không nhỉ? Vì có cột em muốn rộng nhưng có cột muốn hẹp. Và có thể thêm cái tiêu đề bên trên (STT, tên vật tư,...) có đc không nhỉ? Hay thêm thủ công? Định dạng một ô nào đó (VD giá tiền thì định dạng sao cho nó có dấu chấm ngăn cách giữa phần ngàn và làm tròn luôn đến đơn vị chứ không lấy số lẻ)

Em hỏi hơi nhiều nếu trả lời ít một cũng đc, Em cám ơn anh.
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ em cám ơn anh, cho em hỏi thêm một chút ạ.

1. Khi mình sử dụng các phiên bản excel khác nhau thì "Provider=Microsoft.Jet.OLEDB.4.0" có bị sao không ạ?
2. Muốn thay đổi bề rộng của cột khi xuất ra có đc không nhỉ? Vì có cột em muốn rộng nhưng có cột muốn hẹp. Và có thể thêm cái tiêu đề bên trên (STT, tên vật tư,...) có đc không nhỉ? Hay thêm thủ công? Định dạng một ô nào đó (VD giá tiền thì định dạng sao cho nó có dấu chấm ngăn cách giữa phần ngàn và làm tròn luôn đến đơn vị chứ không lấy số lẻ)

Em hỏi hơi nhiều nếu trả lời ít một cũng đc, Em cám ơn anh.

1. Câu này là sử dụng cho máy có cài phiên bản 2003, nhưng ở 2007 trở lên 2013 sử dụng đều được (Ví dụ file của bạn), Tuy nhiên ở máy 2003 kết nối ới file 2007 tở lên thì lại là vấn đề khác.
2. Bạn có thể thay đổi độ rộng của listbox tùy ý, tiêu đề cột có thể thêm = thủ công hoặc code. Phần định dạng làm tròn cho số thì bạn có thể dùng hàm round để làm tròn số lẻ.
 
Upvote 0
Dạ cám ơn vì sự hồi đáp rất nhanh của anh.
Một câu hỏi cuối là em có thể thêm cái link vào kết quả tìm kiếm giống như find all trong excel không nhỉ?
Tức là khi hiện ra list tìm kiếm mình click vào thì nó chạy đến cái ô kết quả ấy ạ.
Chân thành cảm ơn anh Hai Lúa
 
Upvote 0
Dạ cám ơn vì sự hồi đáp rất nhanh của anh.
Một câu hỏi cuối là em có thể thêm cái link vào kết quả tìm kiếm giống như find all trong excel không nhỉ?
Tức là khi hiện ra list tìm kiếm mình click vào thì nó chạy đến cái ô kết quả ấy ạ.
Chân thành cảm ơn anh Hai Lúa
Bạn chép code sau vào form
Mã:
Dim adoConn As Object, adoRS As Object
Private Sub CommandButton1_Click()
Set adoRS = CreateObject("ADODB.Recordset")
With adoRS
    .ActiveConnection = adoConn
    .Open "select * from " & _
              "(SELECT 'ThiTruong',f1,f2,f3,f4,f5,round(f6,0),round(f7,0),round(f8,0),f9 FROM [Thitruong$A2:I100] " & _
              "Union ALL " & _
              "SELECT 'LienSo',f1,f2,f3,f4,f5,round(f6,0),round(f7,0),round(f8,0),f9 FROM [Lienso$A2:I100]) " & _
              "WHERE ucase(F2) LIKE '%" & UCase(Me.TextBox1.Text) & "%'"
        If Not (.bof And .EOF) Then
            ListBox1.ColumnCount = .Fields.Count
            ListBox1.Column = .getrows()
        End If
    .Close
End With

End Sub

Private Sub ListBox1_Click()
Dim i As Integer
For i = 0 To ListBox1.ListCount - 1
    If ListBox1.Selected(i) Then
        Sheets(ListBox1.List(i, 0)).Select
        With Range("a2:a500")
            Set c = .Find(ListBox1.List(i, 1), LookIn:=xlValues, LookAt:=xlWhole)
            If Not c Is Nothing Then Range(c.Address).EntireRow.Select
        End With
    End If
Next i

End Sub

Private Sub UserForm_Initialize()
Set adoConn = CreateObject("ADODB.Connection")
With adoConn
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.FullName & _
                        ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1;"";"
    .Open
End With

End Sub

Private Sub UserForm_Terminate()
adoConn.Close
Set adoRS = Nothing: Set adoConn = Nothing

End Sub
 

File đính kèm

Upvote 0
Everything clear. Cám ơn anh Hai Lúa chúc anh một ngày thật vui vẻ. Mạn phép đc add nick Yahoo của anh nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Hôm qua ngồi nghịch sửa lại tên Sheet và bỏ bớt một Sheet đi thế mà loay hoay mãi chẳng biết tại sao và bị lỗi chỗ nào nữa. Anh Hai Lúa rảnh thì vào xem lại giúp em với nhé.
 

File đính kèm

Upvote 0
Hôm qua ngồi nghịch sửa lại tên Sheet và bỏ bớt một Sheet đi thế mà loay hoay mãi chẳng biết tại sao và bị lỗi chỗ nào nữa. Anh Hai Lúa rảnh thì vào xem lại giúp em với nhé.

Chỉnh lại câu truy vấn như sau:

.Open "SELECT 'Gia',f1,f2,f3,f4,f5,round(f6,0),round(f7,0),round(f8,0),f9 FROM [Gia$] " & _
"WHERE ucase(F2) LIKE '%" & UCase(Me.TextBox1.Text) & "%'"
 
Upvote 0
Em cám ơn anh nhiều lắm.

Em muốn bỏ bớt đi cột Gia ban đầu vì không cần thiết nữa.
Em có chỉnh sửa như sau
Mã:
[COLOR=#000000][I].Open "SELECT f1,f2,f3,f4,f5,round(f6,0),round(f7,0),round (f8,0),f9 FROM [Gia$] " & _[/I][/COLOR]
[COLOR=#000000][I]"WHERE ucase(F2) LIKE '%" & UCase(Me.TextBox1.Text) & "%'"
[/I][/COLOR]


đồng thời tại property của listbox1 em chỉnh BoundColumn là 8 và xoá bớt một Column width ban đầu đi.
Khi bật form tìm kiếm thì ok nhưng khi click vào kết quả tìm kiếm để nhảy đến dòng đó thì bị báo lỗi. Bác xem giúp em với đc không ạ.
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Chỉnh lại như sau:
Mã:
Private Sub ListBox1_Click()
Dim i As Integer
For i = 0 To ListBox1.ListCount - 1
    If ListBox1.Selected(i) Then
        With Range("a2:a500")
            Set c = .Find(ListBox1.List(i, 0), LookIn:=xlValues, LookAt:=xlWhole)
            If Not c Is Nothing Then Range(c.Address).EntireRow.Select
        End With
    End If
Next i

End Sub
 
Upvote 0

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

Back
Top Bottom