Truy vấn dữ liệu trên file excel bằng vb6 (1 người xem)

Liên hệ QC

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

nn.tien

Thành viên mới
Tham gia
12/6/09
Bài viết
19
Được thích
2
Kính chào anh chị, em muốn xin các anh chị 1 đoạn code nhỏ như sau:
em cần tạo 1 form trong vb có tác dụng truy vấn dữ liệu từ 1 file excel (hoặc file text hay file mdb gì cũng được) cụ thể:
File excel có 2 cột: cột 1: mã sinh viên, cột 2: điểm thi tương ứng

>>>e muốn tạo 1 form trên vb (ko phải VBA gắn với file excel đó) gồm có 2 textbox:
Textbox 1: cho nhập mã sinh viên từ bàn phím
Textbox 2: Hiển thị điểm thi tương ứng với mã sinh viên được nhập vào textbox1 (sau khi bấm tab), nếu không tìm thấy mã sinh viên trong data thì để trống (nhưng cho phép nhập nội dung mới vào textbox này, ko cần update vào database)
Chú thích: Khi nhập mã sinh viên vào textbox 1 rồi bấm tab thì chương trình tự đối chiếu và xuất điểm thi tương ứng ra textbox 2 (Tương tự việc sử dụng vlookup trong excel)

Rất mong được sự giải đáp của các anh chị!
Chân thành cảm ơn!

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau
 
Lần chỉnh sửa cuối:
Kính chào anh chị, em muốn xin các anh chị 1 đoạn code nhỏ như sau:
em cần tạo 1 form trong vb có tác dụng truy vấn dữ liệu từ 1 file excel (hoặc file text hay file mdb gì cũng được) cụ thể:
File excel có 2 cột: cột 1: mã sinh viên, cột 2: điểm thi tương ứng

>>>e muốn tạo 1 form trên vb (ko phải VBA gắn với file excel đó) gồm có 2 textbox:
Textbox 1: cho nhập mã sinh viên từ bàn phím
Textbox 2: Hiển thị điểm thi tương ứng với mã sinh viên được nhập vào textbox1 (sau khi bấm tab), nếu không tìm thấy mã sinh viên trong data thì để trống (nhưng cho phép nhập nội dung mới vào textbox này, ko cần update vào database)
Chú thích: Khi nhập mã sinh viên vào textbox 1 rồi bấm tab thì chương trình tự đối chiếu và xuất điểm thi tương ứng ra textbox 2 (Tương tự việc sử dụng vlookup trong excel)

Rất mong được sự giải đáp của các anh chị!
Chân thành cảm ơn!
Tôi không rành VB cho lắm nhưng cũng xin có giải pháp với bài toán của bạn như sau:
- Giả sử bạn có file Excel với dữ liệu tại sheet1 như hình:

untitled1.JPG

- Giả sử Project của bạn được lưu cùng thư mục với file Excel này, ta sẽ viết code như sau:
PHP:
Private Function vbLookUp(sValue, sFile As String, sSheet As String, sAddr As String, Col As Long)
  Dim pLink As String, iR As Long, Exl As Object, fVal, rVal
  Set Exl = CreateObject("Excel.Application")
  If Len(Dir(sFile)) Then
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    With Exl.Workbooks.Add
      With .Sheets(1).Range(sAddr)
        ReDim Arr(1 To .Rows.Count, 1 To .Columns.Count)
        For iR = 1 To UBound(Arr, 1)
          fVal = Exl.ExecuteExcel4Macro(pLink & .Cells(iR, 1).Address(, , 2))
          rVal = Exl.ExecuteExcel4Macro(pLink & .Cells(iR, 2).Address(, , 2))
          If UCase(fVal) = UCase(sValue) Then
            vbLookUp = rVal: GoTo ExtFunc
          End If
        Next iR
      End With
ExtFunc:
      .Close
    End With
  End If
End Function
PHP:
Private Sub Text1_LostFocus()
  Dim sValue, sFile As String, sSheet As String, sAddr As String, rVal
  On Error Resume Next
  sValue = Text1.Text
  sFile = App.Path & "\Data.xls"
  sSheet = "Sheet1"
  sAddr = "A1:B20"
  rVal = vbLookUp(sValue, sFile, sSheet, sAddr, 2)
  Text2.Text = rVal
End Sub
-------------------------------
Cách này cũng tạm được nhưng không hay ở chổ: Mỗi lần Text1 dời Focus là mỗi lần code phải chạy để tìm dữ liệu (mất thời gian) ---> Ta có thể cải tiến theo hướng: Khi Form load sẽ lấy dữ liệu từ file Excel cho vào Dictionray Object, và từ lúc này trở đi sẽ truy xuất thông qua Dictionary (thay vì phải lấy dữ liệu từ file Excel)
PHP:
Private Dic As Object
PHP:
Private Sub Form_Load()
  Dim sFile As String, sSheet As String, fRng As String, rRng As String
  On Error Resume Next
  sFile = App.Path & "\Data.xls"
  sSheet = "Sheet1"
  fRng = "A1:A20"
  rRng = "B1:B20"
  LoadData sFile, sSheet, fRng, rRng
End Sub
PHP:
Private Sub Text1_LostFocus()
  Dim fKey
  On Error Resume Next
  fKey = UCase(Text1.Text)
  Text2.Text = Dic.Item(fKey)
End Sub
PHP:
Private Sub LoadData(sFile As String, sSheet As String, fRng As String, rRng As String)
  Dim pLink As String, iR As Long, Exl As Object, fKey, fItem
  If Len(Dir(sFile)) Then
    Set Exl = CreateObject("Excel.Application")
    Set Dic = CreateObject("Scripting.Dictionary")
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    With Exl.Workbooks.Add
      With .Sheets(1)
        For iR = 1 To .Range(fRng).Rows.Count
          fKey = Exl.ExecuteExcel4Macro(pLink & .Range(fRng)(iR, 1).Address(, , 2))
          fItem = Exl.ExecuteExcel4Macro(pLink & .Range(rRng)(iR, 1).Address(, , 2))
          If fKey <> "" And fKey <> 0 Then
            If Not Dic.Exists(UCase(fKey)) Then Dic.Add UCase(fKey), fItem
          End If
        Next iR
      End With
      .Close
    End With
  End If
End Sub
Cách thứ 2 chắc chắc cho tốc độ nhanh hơn
-----------------------
Hy vọng có thể giúp ích cho bạn (nói trước rằng tôi không rành VB nên chắc code không hay cho lắm)
 
Upvote 0
Theo em thì dùng luôn hàm Vlookup trong Excel luôn.

Mã:
Private Sub Text1_Change()
On Error Resume Next

Dim xlApp As Excel.Application, xlBook As Excel.Workbook, _
        xlSht As Excel.Worksheet, sFullPath As String
    
    sFullPath = App.Path
    Set xlApp = New Excel.Application
    Set xlBook = xlApp.Workbooks.Open(FileName:=sFullPath & "\Data.xls")
    Set xlSht = xlBook.Sheets("Sheet1")
 
         Text2 = xlApp.WorksheetFunction.VLookup(Text1, xlSht.Range("A2:B20"), 2, 0)
         
    Set xlSht = Nothing
    xlBook.Close
    Set xlBook = Nothing
    xlApp.Quit
    Set xlApp = Nothing

End Sub
 

File đính kèm

Upvote 0
Theo em thì dùng luôn hàm Vlookup trong Excel luôn.

Mã:
Private Sub Text1_Change()
On Error Resume Next

Dim xlApp As Excel.Application, xlBook As Excel.Workbook, _
        xlSht As Excel.Worksheet, sFullPath As String
    
    sFullPath = App.Path
    Set xlApp = New Excel.Application
    Set xlBook = xlApp.Workbooks.Open(FileName:=sFullPath & "\Data.xls")
    Set xlSht = xlBook.Sheets("Sheet1")
 
         Text2 = xlApp.WorksheetFunction.VLookup(Text1, xlSht.Range("A2:B20"), 2, 0)
         
    Set xlSht = Nothing
    xlBook.Close
    Set xlBook = Nothing
    xlApp.Quit
    Set xlApp = Nothing

End Sub
Vấn đề nằm ở chổ: Tôi không muốn mở file Data.xls ---> Gặp trường hợp file này nặng (vì lý do gì đó) thì sẽ rất mất thời gian
Còn nếu như bạn mở 1 file trắng với mục đích dùng VLOOKUP thì vẫn mất thời gian... vì mỗi lần Text1 change là mỗi lần phải mở file
Cuối cùng tôi đã chọn phương pháp: Khi Form load, ta lấy dữ liệu trước... bằng cách:
- Khởi động 1 file Excel trắng
- Dùng macro 4 để lấy dữ liệu từ file Data.xls (không mở file này)
- Mọi thứ lấy được ta cho vào Dictionary Object
- Khi đã có dữ liệu trong Dictionary rồi thì mọi việc truy xuất chỉ là.. chuyện nhỏ
Bạn hiểu rồi chứ
----------------
Nói thêm: Tốt nhất không nên dùng chiêu Set xlApp = New Excel.Application vì phải mất công check control trong References ---> Nên dùng CreateObject("..."), code sẽ luôn luôn chạy được khi người ta copy code từ diễn đàn về máy của họ
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề nằm ở chổ: Tôi không muốn mở file Data.xls ---> Gặp trường hợp file này nặng (vì lý do gì đó) thì sẽ rất mất thời gian
Còn nếu như bạn mở 1 file trắng với mục đích dùng VLOOKUP thì vẫn mất thời gian... vì mỗi lần Text1 change là mỗi lần phải mở file
Cuối cùng tôi đã chọn phương pháp: Khi Form load, ta lấy dữ liệu trước... bằng cách:
- Khởi động 1 file Excel trắng
- Dùng macro 4 để lấy dữ liệu từ file Data.xls (không mở file này)
- Mọi thứ lấy được ta cho vào Dictionary Object
- Khi đã có dữ liệu trong Dictionary rồi thì mọi việc truy xuất chỉ là.. chuyện nhỏ
Bạn hiểu rồi chứ
----------------
Em chân thành cảm ơn anh domfootwear và anhndu96081631 đã nhiệt tình giúp đỡ.
Em đã test thử cả 3 đoạn code đều hoạt động tốt và chính xác, và đúng như anh ndu96081631 đã phân tích và viết ở code thứ 2 thì tốc độ truy vấn nhanh hơn rõ rệt khi database lớn
>> Đoạn code của anh domfootwear lấy thông tin khi nhập mã sv xong không cần tab nên bị hơi vấp khi nhập MSV nếu mã SV dài, ngoài ra nếu ko tìm thấy trong database thì ở Text2 vẫn lưu lại dữ liệu ngay trước đó thay vì để trắng!
Một lần nữa em xin chân thành cảm ơn 2 anh nhiều nhiều!
Chúc 2 anh mọi điều tốt lành!

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau
 
Lần chỉnh sửa cuối:
Upvote 0
Em chân thành cảm ơn anh domfootwear và anhndu96081631 đã nhiệt tình giúp đỡ.
Em đã test thử cả 3 đoạn code đều hoạt động tốt và chính xác....
Cũng nhân đây xin nói thêm cho bạn tham khảo:
- Các code ở trên chỉ dùng các phương pháp thông thường để lấy dữ liệu từ file đang đóng. Ưu điểm là code đơn giản nhưng tốc độ chưa cao
- Cho đến thời điểm hiện nay, theo như tôi biết thì có lẽ chỉ có phương pháp ADO mới cho tốc độ nhanh nhất. Tuy nhiên code khá phức tạp
Vậy tùy theo từng điều kiện cụ thế mà chọn giải pháp thích hợp!
 
Upvote 0
Cũng nhân đây xin nói thêm cho bạn tham khảo:
- Các code ở trên chỉ dùng các phương pháp thông thường để lấy dữ liệu từ file đang đóng. Ưu điểm là code đơn giản nhưng tốc độ chưa cao
- Cho đến thời điểm hiện nay, theo như tôi biết thì có lẽ chỉ có phương pháp ADO mới cho tốc độ nhanh nhất. Tuy nhiên code khá phức tạp
Vậy tùy theo từng điều kiện cụ thế mà chọn giải pháp thích hợp!
Vâng, em cũng xem qua các tài liệu thì đều có nói dùng ADO sẽ cho tốc độ nhanh hơn.
Em muốn hỏi thêm 1 chút:
Khi dùng dic như PP thứ 2 cho tốc độ truy vấn nhanh, nhưng khi load form (với database khoảng 5000 dòng) khá lâu, mất khoảng > 1phút;
và để truy vấn được dữ liệu thì sau khi đã đóng gói thành file exe rồi vẫn cần phải copy kèm theo file excel để truy vấn.
Anh có cách nào để khi đóng gói thành file chạy exe mà không cần kèm theo file excel không ạ?

quần áo trẻ em | quan ao tre em | quần áo sơ sinh | quần áo bé trai | quần áo bé gái | bodysuit carter | quan ao so sinh | quan ao tre em nhap khau
 
Lần chỉnh sửa cuối:
Upvote 0
Anh có cách nào để khi đóng gói thành file chạy exe mà không cần kèm theo file excel không ạ?
Tôi nghĩ ra 1 cách: có lẽ sẽ cho toàn bộ dữ liệu vào SpreadSheet object rồi truy xuất thông qua nó ---> Có điều tôi không dám chắc trên VB6 có hổ trợ control này không, bạn nghiên cứu thử xem!
Có thể tra google với từ khóa: How to use the spreadsheet control in VB6
 
Upvote 0

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

Back
Top Bottom