Tạo form tìm kiếm dữ liệu từ 1 file excel khác.

Liên hệ QC

momo101194

Thành viên mới
Tham gia
1/6/20
Bài viết
38
Được thích
5
Xin chào thầy và các bạn.
Mục đích:tìm kiếm dữ liệu từ file excel data đang đóng hiển thị lên form tìm kiếm của file excel tim kiếm.
-Mình có 2 file excel lad data và tìm kiếm.ở file tìm kiếm mình có tạo một form tìm kiếm,sau khi gõ tên cong ty cần tìm vào textbox và tìm kiếm thì listbox sẽ hiển thị ra thông tin của công ty đó.
-file mình đính kèm phía dưới.
-Làm phiền mọi người chỉ giúp ah,xin cảm ơn!
 

File đính kèm

  • data_quanly.xlsx
    12.9 KB · Đọc: 21
  • tiem kiem.xlsm
    16.7 KB · Đọc: 9
Xin chào thầy và các bạn.
Mục đích:tìm kiếm dữ liệu từ file excel data đang đóng hiển thị lên form tìm kiếm của file excel tim kiếm.
-Mình có 2 file excel lad data và tìm kiếm.ở file tìm kiếm mình có tạo một form tìm kiếm,sau khi gõ tên cong ty cần tìm vào textbox và tìm kiếm thì listbox sẽ hiển thị ra thông tin của công ty đó.
-file mình đính kèm phía dưới.
-Làm phiền mọi người chỉ giúp ah,xin cảm ơn!
Tôi thấy có 2 vấn đề:
- File tìm kiếm bạn lưu dạng .xlsx nên mất luôn code và Userform rồi.
- Tại sao bạn không để data ở 1 sheet khác trong file tìm kiếm luôn?
 
Upvote 0
Tôi thấy có 2 vấn đề:
- File tìm kiếm bạn lưu dạng .xlsx nên mất luôn code và Userform rồi.
- Tại sao bạn không để data ở 1 sheet khác trong file tìm kiếm luôn?

cảm ơn @vanthinh3101 đã góp ý mình đã sửa lại file rồi ah.
『-Tại sao bạn không để data ở 1 sheet khác trong file tìm kiếm luôn?』
Đây là hai file giả dụ mình đưa ra để mọi người hình dung dể hơn.
-Do luợng thông tin trong mỗi file đều lớn nên mình không thể gọp chung lại đuợc.
-Thứ2 do cấp trên yêu cầu mình như thế mong bạn thông cảm ah.
 
Upvote 0
cảm ơn @vanthinh3101 đã góp ý mình đã sửa lại file rồi ah.
『-Tại sao bạn không để data ở 1 sheet khác trong file tìm kiếm luôn?』
Đây là hai file giả dụ mình đưa ra để mọi người hình dung dể hơn.
-Do luợng thông tin trong mỗi file đều lớn nên mình không thể gọp chung lại đuợc.
-Thứ2 do cấp trên yêu cầu mình như thế mong bạn thông cảm ah.
Bạn tham khảo file đính kèm.
Điều kiện là file Tim kiem và file data nằm trong cùng 1 folder.
 

File đính kèm

  • Tim kiem.xlsm
    26.4 KB · Đọc: 30
Upvote 0
Bạn tham khảo file đính kèm.
Điều kiện là file Tim kiem và file data nằm trong cùng 1 folder.
Mã:
Public Function SearchDataFromClosedWorkbook(CloseWb As String, txt1 As String, txt2 As String)
    'CloseWb: file chua data
    'SQL: cu phap truy van du lieu
    'txt1: gia tri Textbox MA SO
    'txt2: gia tri Textbox Ten cong ty
    
    Dim cnn As Object, Rst As Object, SQL As String, SearchRes(), WbPath As String
    
    Set cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("ADODB.Recordset")
    'WbPath = ThisWorkbook.Path & "\" & CloseWb
    
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & CloseWb & _
            ";Extended Properties=""Excel 12.0;HDR=Yes;"""
    
    txt1 = """%" & txt1 & "%"""
    txt2 = """%" & txt2 & "%"""
    
    SQL = "SELECT * FROM [合計シート$] WHERE 企業名 LIKE " & txt1 & " AND 部署名 Like " & txt2
    
    Set Rst = cnn.Execute(SQL)
    
    If Not Rst.EOF And Not Rst.bof Then
        SearchRes = Rst.getrows
        SearchDataFromClosedWorkbook = f_transpose2DArray(SearchRes)
    Else
        SearchDataFromClosedWorkbook = Array("Khong co ket qua thoa man dieu kien")
    End If
    Rst.Close
    cnn.Close
    
End Function
@vanthinh3101
Làm phiền bạn, mình có sữa lại theo tên file của mình như trên nhưng khi chạy ra thì bị lỗi ở đoạn này.
SQL = "SELECT * FROM [合計シート$] WHERE 企業名 LIKE " & txt1 & " AND 部署名 Like " & txt2

Set Rst = cnn.Execute(SQL) ->No value given for one or more required parameters
 
Upvote 0
Mã:
Public Function SearchDataFromClosedWorkbook(CloseWb As String, txt1 As String, txt2 As String)
    'CloseWb: file chua data
    'SQL: cu phap truy van du lieu
    'txt1: gia tri Textbox MA SO
    'txt2: gia tri Textbox Ten cong ty
   
    Dim cnn As Object, Rst As Object, SQL As String, SearchRes(), WbPath As String
   
    Set cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("ADODB.Recordset")
    'WbPath = ThisWorkbook.Path & "\" & CloseWb
   
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & CloseWb & _
            ";Extended Properties=""Excel 12.0;HDR=Yes;"""
   
    txt1 = """%" & txt1 & "%"""
    txt2 = """%" & txt2 & "%"""
   
    SQL = "SELECT * FROM [合計シート$] WHERE 企業名 LIKE " & txt1 & " AND 部署名 Like " & txt2
   
    Set Rst = cnn.Execute(SQL)
   
    If Not Rst.EOF And Not Rst.bof Then
        SearchRes = Rst.getrows
        SearchDataFromClosedWorkbook = f_transpose2DArray(SearchRes)
    Else
        SearchDataFromClosedWorkbook = Array("Khong co ket qua thoa man dieu kien")
    End If
    Rst.Close
    cnn.Close
   
End Function
@vanthinh3101
Làm phiền bạn, mình có sữa lại theo tên file của mình như trên nhưng khi chạy ra thì bị lỗi ở đoạn này.
SQL = "SELECT * FROM [合計シート$] WHERE 企業名 LIKE " & txt1 & " AND 部署名 Like " & txt2

Set Rst = cnn.Execute(SQL) ->No value given for one or more required parameters
Tôi không rành ngôn ngữ mà bạn thay vào.
Thôi thì bạn sửa thế này cho tôi.
PHP:
Public Function SearchDataFromClosedWorkbook(CloseWb As String, txt1 As String, txt2 As String)
    'CloseWb: file chua data
    'SQL: cu phap truy van du lieu
    'txt1: gia tri Textbox MA SO
    'txt2: gia tri Textbox Ten cong ty
    
    Dim cnn As Object, Rst As Object, SQL As String, SearchRes(), WbPath As String
    
    Set cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("ADODB.Recordset")
    'WbPath = ThisWorkbook.Path & "\" & CloseWb
    
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & CloseWb & _
            ";Extended Properties=""Excel 12.0;HDR=No;"""
    
    txt1 = """%" & txt1 & "%"""
    txt2 = """%" & txt2 & "%"""
    
    SQL = "SELECT * FROM [合計シート$] WHERE F1 LIKE " & txt1 & " AND F2 Like " & txt2
    
    Set Rst = cnn.Execute(SQL)
    
    If Not Rst.EOF And Not Rst.bof Then
        SearchRes = Rst.getrows
        SearchDataFromClosedWorkbook = f_transpose2DArray(SearchRes)
    Else
        SearchDataFromClosedWorkbook = Array("Khong co ket qua thoa man dieu kien")
    End If
    Rst.Close
    cnn.Close
    
End Function
 
Upvote 0
Tôi không rành ngôn ngữ mà bạn thay vào.
Thôi thì bạn sửa thế này cho tôi.
PHP:
Public Function SearchDataFromClosedWorkbook(CloseWb As String, txt1 As String, txt2 As String)
    'CloseWb: file chua data
    'SQL: cu phap truy van du lieu
    'txt1: gia tri Textbox MA SO
    'txt2: gia tri Textbox Ten cong ty
  
    Dim cnn As Object, Rst As Object, SQL As String, SearchRes(), WbPath As String
  
    Set cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("ADODB.Recordset")
    'WbPath = ThisWorkbook.Path & "\" & CloseWb
  
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & CloseWb & _
            ";Extended Properties=""Excel 12.0;HDR=No;"""
  
    txt1 = """%" & txt1 & "%"""
    txt2 = """%" & txt2 & "%"""
  
    SQL = "SELECT * FROM [合計シート$] WHERE F1 LIKE " & txt1 & " AND F2 Like " & txt2
  
    Set Rst = cnn.Execute(SQL)
  
    If Not Rst.EOF And Not Rst.bof Then
        SearchRes = Rst.getrows
        SearchDataFromClosedWorkbook = f_transpose2DArray(SearchRes)
    Else
        SearchDataFromClosedWorkbook = Array("Khong co ket qua thoa man dieu kien")
    End If
    Rst.Close
    cnn.Close
  
End Function
Tôi không rành ngôn ngữ mà bạn thay vào.
Thôi thì bạn sửa thế này cho tôi.
PHP:
Public Function SearchDataFromClosedWorkbook(CloseWb As String, txt1 As String, txt2 As String)
    'CloseWb: file chua data
    'SQL: cu phap truy van du lieu
    'txt1: gia tri Textbox MA SO
    'txt2: gia tri Textbox Ten cong ty
  
    Dim cnn As Object, Rst As Object, SQL As String, SearchRes(), WbPath As String
  
    Set cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("ADODB.Recordset")
    'WbPath = ThisWorkbook.Path & "\" & CloseWb
  
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & CloseWb & _
            ";Extended Properties=""Excel 12.0;HDR=No;"""
  
    txt1 = """%" & txt1 & "%"""
    txt2 = """%" & txt2 & "%"""
  
    SQL = "SELECT * FROM [合計シート$] WHERE F1 LIKE " & txt1 & " AND F2 Like " & txt2
  
    Set Rst = cnn.Execute(SQL)
  
    If Not Rst.EOF And Not Rst.bof Then
        SearchRes = Rst.getrows
        SearchDataFromClosedWorkbook = f_transpose2DArray(SearchRes)
    Else
        SearchDataFromClosedWorkbook = Array("Khong co ket qua thoa man dieu kien")
    End If
    Rst.Close
    cnn.Close
  
End Function
Tôi không rành ngôn ngữ mà bạn thay vào.
Thôi thì bạn sửa thế này cho tôi.
PHP:
Public Function SearchDataFromClosedWorkbook(CloseWb As String, txt1 As String, txt2 As String)
    'CloseWb: file chua data
    'SQL: cu phap truy van du lieu
    'txt1: gia tri Textbox MA SO
    'txt2: gia tri Textbox Ten cong ty
  
    Dim cnn As Object, Rst As Object, SQL As String, SearchRes(), WbPath As String
  
    Set cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("ADODB.Recordset")
    'WbPath = ThisWorkbook.Path & "\" & CloseWb
  
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\" & CloseWb & _
            ";Extended Properties=""Excel 12.0;HDR=No;"""
  
    txt1 = """%" & txt1 & "%"""
    txt2 = """%" & txt2 & "%"""
  
    SQL = "SELECT * FROM [合計シート$] WHERE F1 LIKE " & txt1 & " AND F2 Like " & txt2
  
    Set Rst = cnn.Execute(SQL)
  
    If Not Rst.EOF And Not Rst.bof Then
        SearchRes = Rst.getrows
        SearchDataFromClosedWorkbook = f_transpose2DArray(SearchRes)
    Else
        SearchDataFromClosedWorkbook = Array("Khong co ket qua thoa man dieu kien")
    End If
    Rst.Close
    cnn.Close
  
End Function
dạ cảm ơn @vanthinh3101 nhiều ah
-Do file của mình bằng tiếng nhật nên hơi khó hiểu bạn thông cảm.
-Khi kết nối sql thì trong file excel có cần phải thêm hay check gì khong ah, chẳng hạn như Microsoft ActiveX Data...
-Do font chữ của mình không phù hợp không ah
-Dưới đây là file thật của mình, mình đã sửa lại rồi nhưng vẫn không đúng bạn có thể xem giúp mình đuợc không ah.
Bài đã được tự động gộp:

Cảm ơn @vanthinh3101 nhiều ah !
Mình đã sửa lại đuợc rồi,cảm ơn sự nhiệt tình của bạn ah.

Mã:
Public Function f_transpose2DArray(inputArray As Variant) As Variant

Dim x As Long, yUbound As Long
Dim y As Long, xUbound As Long
Dim tempArray As Variant

    xUbound = UBound(inputArray, 2) + 1
    yUbound = UBound(inputArray, 1) + 1
    
    ReDim tempArray(1 To xUbound, 1 To yUbound)
    
    For x = 1 To xUbound
        For y = 1 To yUbound
            tempArray(x, y) = inputArray(y - 1, x - 1)
        Next y
    Next x
    
    f_transpose2DArray = tempArray
    
End Function
có thể giải thích giúp mình ý nghĩa của đoạn code này được ko ah
 

File đính kèm

  • excel.png
    excel.png
    175.5 KB · Đọc: 14
  • Tim kiem.xlsm
    25.8 KB · Đọc: 11
Lần chỉnh sửa cuối:
Upvote 0
dạ cảm ơn @vanthinh3101 nhiều ah
-Do file của mình bằng tiếng nhật nên hơi khó hiểu bạn thông cảm.
-Khi kết nối sql thì trong file excel có cần phải thêm hay check gì khong ah, chẳng hạn như Microsoft ActiveX Data...
-Do font chữ của mình không phù hợp không ah
-Dưới đây là file thật của mình, mình đã sửa lại rồi nhưng vẫn không đúng bạn có thể xem giúp mình đuợc không ah.
Bài đã được tự động gộp:

Cảm ơn @vanthinh3101 nhiều ah !
Mình đã sửa lại đuợc rồi,cảm ơn sự nhiệt tình của bạn ah.

Mã:
Public Function f_transpose2DArray(inputArray As Variant) As Variant

Dim x As Long, yUbound As Long
Dim y As Long, xUbound As Long
Dim tempArray As Variant

    xUbound = UBound(inputArray, 2) + 1
    yUbound = UBound(inputArray, 1) + 1
   
    ReDim tempArray(1 To xUbound, 1 To yUbound)
   
    For x = 1 To xUbound
        For y = 1 To yUbound
            tempArray(x, y) = inputArray(y - 1, x - 1)
        Next y
    Next x
   
    f_transpose2DArray = tempArray
   
End Function
có thể giải thích giúp mình ý nghĩa của đoạn code này được ko ah
Tên Function thể hiện luôn ý nghĩa của code rồi đó bạn :p:p:p
Bạn đã dùng Paste Special/Transpose bao giờ chưa?
 
Upvote 0
Tên Function thể hiện luôn ý nghĩa của code rồi đó bạn :p:p:p
Bạn đã dùng Paste Special/Transpose bao giờ chưa?
-Mình chưa dùng bao giờ nên không biết .
-Kiểu như là Chuyển đổi mảng và in ra kết quả ah.
-Mình không muốn hiển thị dòng tiêu đề vào listbox thì có đuợc ko ah
 
Lần chỉnh sửa cuối:
Upvote 0
Tác dụng của UDF đó là xoay mảng ban đầu 90 độ (dọc --> ngang; ngang --> dọc)
Tác dụng của UDF đó là xoay mảng ban đầu 90 độ (dọc --> ngang; ngang --> dọc)
vậy cho mình hỏi ngu 1 câu đuợc không ah.
-tại sao phải xoay mảng ban đầu de làm gì vaf mục đích của việc xoay mảng đó để làm gì ah!
-Neu Mình không muốn hiển thị dòng tiêu đề vào listbox thì có đuợc ko ah
 
Upvote 0
gợi ý thôi nhé

1/ tại sao không khai báo cái Res thành như sau
Mã:
Public Res As Variant

2/ dùng ADO hàm đó lấy 1 lần duy nhất cho vào cái mảng Res đó xong cứ thế xài sự kiện mà gõ là nó ra mà nhanh tiết kiệm chút khởi mất công kết nối lại từ đầu sau mỗi lần lọc
.....
Tự mò tiếp nó mới có tinh thần học tập và khám phá he .... Mạnh tới đó là xong :p
 
Lần chỉnh sửa cuối:
Upvote 0
gợi ý thôi nhé

1/ tại sao không khai báo cái Res thành như sau
Mã:
Public Res As Variant

2/ dùng ADO hàm đó lấy 1 lần duy nhất cho vào cái mảng Res đó xong cứ thế xài sự kiện mà gõ là nó ra mà nhanh tiết kiệm chút khởi mất công kết nối lại từ đầu sau mỗi lần lọc
.....
Tự mò tiếp nó mới có tinh thần học tập và khám phá he .... Mạnh tới đó là xong :p
Em hiểu thế này có đúng ý của anh không ạ?
- Khi khởi tạo Userform, sẽ dùng hàm ADO ở trên để đưa toàn bộ dữ liệu data vào Listbox bằng cú pháp "Select * from [data$]"
- Khi textbox1 và textbox2 thay đổi thì sẽ thực hiện lọc.
 
Upvote 0
gợi ý thôi nhé

1/ tại sao không khai báo cái Res thành như sau
Mã:
Public Res As Variant

2/ dùng ADO hàm đó lấy 1 lần duy nhất cho vào cái mảng Res đó xong cứ thế xài sự kiện mà gõ là nó ra mà nhanh tiết kiệm chút khởi mất công kết nối lại từ đầu sau mỗi lần lọc
.....
Tự mò tiếp nó mới có tinh thần học tập và khám phá he .... Mạnh tới đó là xong :p
Em nhờ bác chỉ dạy thêm đoạn này, em đang bị bí rồi.
Em làm đúng như trên:
- Khi khởi tạo Userform, sẽ dùng hàm ADO ở trên để đưa toàn bộ dữ liệu data vào mảng Res --> truyền dữ liệu từ mảng Res vào Listbox
- Tuy nhiên, khi em chạy code tìm kiếm theo Textbox1 và Textbox2 thì Res không còn giá trị nữa
Bác cho em hỏi có cách nào ngoài cách đưa Res ra worksheet không ạ?
 
Upvote 0
Web KT
Back
Top Bottom