Thế sao bạn không dùng Form của Excel mà làm (tức dùng VBA) ---> Làm trên VB6, nội cái chuyện tiếng Việt Unicode cũng là chuyện quá mệt mỏi (nếu không nói là THUA)... còn dùng font TCVN3 thì lại... dở hơiMình mới chập chững VB nên rất mong các bạn giúp, mình gửi File đính kèm theo. Rất cảm ơn
Bạn phải cho xem đoạn code có báo lỗi thì các bạn mới có thể "chỉ giáo" được.Em cũng đang cần cái này lắm. Em đã áp dụng ngon lành, nhưng vẫn có một vấn đề như thế này: Em làm một button chọn đến file Excel và đoạn code chạy ok, nhưng khi chương trình đang chạy em tìm đến 01 file Excel khác thì chương trình báo lỗi "Operation is not allowed when the object is open". Em cũng đã làm thêm một button nữa để khi chọn 01 file khác sẽ đóng kết nối lại nhưng vẫn không được. Mong các bác chỉ giáo. Cảm ơn nhiều.
Bác Duyệt ơi, tiếng Anh của em rất kém, bác xem giải quyết cho em được không?
Option Explicit
[COLOR="blue"]'Thủ tục nhập dữ liệu từ Excel[/COLOR]
Sub [B][COLOR="red"]ImportDNFromExcel[/COLOR][/B]()
[COLOR="blue"]'Khai báo và tạo đối tượng Excel[/COLOR]
Dim oXL As Object
Dim oXLWb As Object
Dim oXLWs As Object
Dim lRow As Long, lLastRow As Long, i As Long, vContent
Dim sFilePath As String
On Error GoTo ErrorHandler
[COLOR="blue"]'Đường dẫn của tập tin muốn lấy dữ liệu[/COLOR]
sFilePath = "C:\Test.xls"
Set oXL = CreateObject("Excel.Application")
[COLOR="blue"] 'Nếu tập tin tồn tại thì mở[/COLOR]
Set oXLWb = oXL.Workbooks.Open(sFilePath)
[COLOR="blue"] 'Lấy dữ liệu từ sheet đầu tiên[/COLOR]
Set oXLWs = oXLWb.Worksheets(1)
[COLOR="blue"]'Hàng bắt đầu lấy dữ liệu trong sheet đầu tiên là 6[/COLOR]
lRow = 6 : lLastRow = 100
[COLOR="blue"] 'Bạn có thể dùng
'LastRow = oXLWs.Range("A1").End(xlDown).Row
'LastCol = oXLWs .Range("A1").End(xlToRight).Column
'để lấy hàng cuối hoặc cột cuối của khối dữ liệu liên tục
'Nếu bạn muốn người dùng thấy workbook của bạn thì[/COLOR]
[COLOR="blue"] 'oXL.Visible = True
'Đến đây bạn có thể bắt đầu lấy dữ liệu từ Excel[/COLOR]
For i=lRow To lLastRow
[COLOR="blue"] 'Bắt đầu lấy dữ liệu từ Excel[/COLOR]
vContent = oXLWs.Range("A" & lRow)
[COLOR="blue"] 'Đưa dữ liệu lấy được vào các đối tượng hoặc biến bạn muốn lưu trữ dữ liệu
'Các bước tiếp theo[/COLOR]
Next i
ErrorExit:
[COLOR="blue"] 'Giải phóng bộ nhớ[/COLOR]
Set oXLWs = Nothing
[COLOR="blue"] 'Đóng Workbook lại mà không có lưu[/COLOR]
oXLWb.Close SaveChanges:=False
Set oXLWb = Nothing
[COLOR="blue"] 'Đóng Excel[/COLOR]
oXL.Quit
Set oXL = Nothing
Exit Sub
ErrorHandler:
[COLOR="blue"] 'Thực hiện gì khi xãy ra lỗi tại đây
'Ví dụ như thông báo hoặc ghi lỗi ra tập tin chẳng hạn[/COLOR]
Resume ErrorExit
End Sub
Bác có thể cho em đoạn code không? Bác đã xem giúp cho em cái em làm chưa? Em mở lần đầu khi chạy thì ok nhưng mở lần 2 thì bị lỗi.Một cách khác nữa là dùng ADO để kết nối và truyền dữ liệu, cách này dể dùng và cải thiện tốc độ đáng kể.
Hy vọng với đoạn mã trên bạn có thể làm được.
Lê Văn Duyệt
Ví dụ file CSDL Excel của bạn có tên là Book1 và nằm chung trong 1 folder thì code sẽ như sau:Bác có thể cho em đoạn code không? Bác đã xem giúp cho em cái em làm chưa? Em mở lần đầu khi chạy thì ok nhưng mở lần 2 thì bị lỗi.
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Option Explicit
Private Sub Command1_Click()
Set rs = New ADODB.Recordset
rs.Open "SELECT * FROM [Sheet1$] ", cn, adOpenDynamic, adLockOptimistic
Set DataGrid1.DataSource = rs
End Sub
Private Sub Form_Load()
On Error GoTo ErrHandler
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.4.0"
cn.ConnectionString = "Data Source= " & App.Path & "/Book1.xls; Extended Properties=Excel 8.0;"
cn.CursorLocation = adUseClient
cn.Open
Exit Sub
ErrHandler:
MsgBox "Khong the ket noi voi CSDL"
End Sub
Private Sub Command3_Click()
Unload Me
End Sub
Bác có thể cho em đoạn code không? Bác đã xem giúp cho em cái em làm chưa? Em mở lần đầu khi chạy thì ok nhưng mở lần 2 thì bị lỗi.
Vậy sao bạn lại có cái tiêu đề: Liên kết Excel với VB6.Em đang làm một chương trình phục vụ cho công việc. CSDL của em là CSDL động, động ở đây là không nhất thiết file csdl phải là một tên file cố định. Vì csdl của em được xuất ra từ một chương trình khác nên có thể người dùng sẽ đặt những tên file khác nhau, họ có thể ghi lại bất cứ nơi nào.
Sub ImportDN()
Dim xlWb As Workbook
Dim xlWs As Worksheet
Dim rngSource As Range, lLastRowSource As Long, lLastRowTarget As Long, lRow As Long
Dim sFilter As String
Dim vaFile As Variant
Dim sPosDate As String
Dim ExistFolder As Boolean, sPathFolderKeep As String
On Error GoTo ErrorHandler
SpeedOn 'Xem trong thư viện code
'Luu thu muc mac dinh
sPathFolderKeep = Application.DefaultFilePath
' Thay đổi thư mục mặc định
ExistFolder = ChoDirNet("C:\")
If ExistFolder = False Then
MsgBox "Loi xay ra khi thay doi thu muc"
GoTo ErrorHandler
End If
'Xây dựng danh sách tập tin muốn hiện ra
'sFilter = "Excel 2007 Files,*.xlsx," & _
"Excel 2000-2003 Files,*.xls"
sFilter = "Excel 2000-2003 Files,*.xls"
vaFile = Application.GetOpenFilename(FileFilter:=sFilter, FilterIndex:=1, _
Title:="Open a New or Old File", MultiSelect:=False)
'Nếu người dùng Cancel thì thoát, nếu không thì chọn tập tin
If vaFile <> False Then
'Đây chỉ là ví dụ tương ứng với dữ liệu của tôi
'Bạn có thể thay đổi theo như dữ liệu của mình.
Workbooks.Open Filename:=vaFile
vaFile = FileNameOnly(vaFile)
' Create an instance of Excel and add a workbook
Set xlWb = Application.Workbooks(vaFile)
Set xlWs = xlWb.Worksheets(1)
lLastRowSource = [C6].End(xlDown).Row
Set rngSource = Range("C6:Q" & lLastRowSource)
lLastRowTarget = FindLastRow(ThisWorkbook.Worksheets("Delivery_Record"))
lLastRowTarget = lLastRowTarget + 1
For lRow = 1 To rngSource.Rows.Count
With ThisWorkbook.Worksheets("Delivery_Record")
If Len(rngSource(lRow, 1)) = 0 Then
GoTo ErrorExit
End If
sPosDate = rngSource(lRow, 10) 'rngSource(lRow, 13)
' Delivered date/DN issued date
.Range("A" & lLastRowTarget) = Format(DateSerial(Mid(sPosDate, 7, 4), Mid(sPosDate, 4, 2), Mid(sPosDate, 1, 2)), "mm/dd/yyyy")
' DN No.
.Range("B" & lLastRowTarget) = rngSource(lRow, 1)
' Dealer code
.Range("C" & lLastRowTarget) = rngSource(lRow, 11)
' Dealer name
.Range("D" & lLastRowTarget).Formula = "=VLOOKUP(C" & lLastRowTarget & ",Dealers,2,0)"
' Item code
.Range("E" & lLastRowTarget) = rngSource(lRow, 4)
' Item name
.Range("F" & lLastRowTarget) = UCase$(Trim$(rngSource(lRow, 5)))
' Unit of measurement
.Range("G" & lLastRowTarget) = rngSource(lRow, 6)
' Qty
.Range("H" & lLastRowTarget) = rngSource(lRow, 7)
' This field to check
.Range("I" & lLastRowTarget) = "DN" 'DN=SAP System, Delivered=Sent to customer
' Document no.
.Range("J" & lLastRowTarget) = rngSource(lRow, 14)
End With
'increase lLastRowTarget
lLastRowTarget = lLastRowTarget + 1
Next lRow
Else
GoTo ErrorExit
End If
ErrorExit:
'Close workbook
Workbooks(vaFile).Close
'Tra lai thu muc ban dau
ExistFolder = ChDirNet(sPathFolderKeep)
SpeedOff
Exit Sub
ErrorHandler:
If bCentralErrorHandler(cs_Module_Name, "ImportDN", False) Then
Stop
Resume
Else
Resume ErrorExit
End If
End Sub
Em đang làm một chương trình phục vụ cho công việc. CSDL của em là CSDL động, động ở đây là không nhất thiết file csdl phải là một tên file cố định. Vì csdl của em được xuất ra từ một chương trình khác nên có thể người dùng sẽ đặt những tên file khác nhau, họ có thể ghi lại bất cứ nơi nào. Chuơng trình sẽ lấy csld đã được xuất ra vào ADO sau đó lại xuất ra report theo mẫu của công việc. Em sẽ đưa ra trường hợp lỗi của em: Ví dụ ở cơ quan em có 2 người làm chung một máy tính. Người A xuất ra một file A, người B xuất ra một file B, chạy chương trình người A tìm đến file A thì ok, nhưng tìm tiếp đến file B thì bị lỗi. Kính nhờ các bác test thử rồi sửa giúp em.
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim ExcelFile As String
Private Sub Command1_Click()
cc.DefaultExt = "XLS"
cc.Filter = "File Excel(*.xls)|*.xls"
cc.ShowOpen
ExcelFile = cc.FileName
Label2.Caption = UCase(ExcelFile)
Pos = InStrRev(ExcelFile, "\")
ExcelFile = Mid(ExcelFile, Pos + 1)
Pos = InStrRev(ExcelFile, ".")
ExcelFile = Mid(ExcelFile, 1, Pos - 1)
Call Import
cn.Close
End Sub
Private Sub Import()
cn.Open "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & Label2.Caption & ";" & _
"Extended Properties=Excel 8.0;"
rs.CursorLocation = adUseClient
rs.Open "select * from [" & ExcelFile & "$]", cn, 3, 3
Set DataGrid1.DataSource = rs
DataGrid1.Refresh
End Sub
Mã:Private Sub Import() cn.Open "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & Label2.Caption & ";" & _ "Extended Properties=Excel 8.0;" rs.CursorLocation = adUseClient rs.Open "select * from [" &[COLOR=red] [B]ExcelFile[/B][/COLOR]& "$]", cn, 3, 3 Set DataGrid1.DataSource = rs DataGrid1.Refresh End Sub