Lỗi khi lấy dữ liệu từ file CSV bằng ADO

Liên hệ QC
MinhKhai
Bác ơi, đừng tự làm khổ mình.

Chuỗi nguồn đặt trong hai dấu nháy kép hoặc nháy đơn thì không cần đến Shortname

Data Source = "".../.../...csv"";
Hoặc: Data Source = '.../.../...csv';

Còn với câu lệnh Sort, bác có thể viết trong câu lệnh truy vấn SQL hoặc khi Recordset đã nhận được kết quả.

Ví dụ Sort cột 1:
RS.Sort RS.Fields(0).Name & " Desc" ' Hoặc " Asc"
Cảm ơn bạn, mai mình mới kiểm tra trên máy tính xem gơi ý của bạn có chạy như mong muốn không
 
MinhKhai
Bác ơi, đừng tự làm khổ mình.

Chuỗi nguồn đặt trong hai dấu nháy kép hoặc nháy đơn thì không cần đến Shortname

Data Source = "".../.../...csv"";
Hoặc: Data Source = '.../.../...csv';

Còn với câu lệnh Sort, bác có thể viết trong câu lệnh truy vấn SQL hoặc khi Recordset đã nhận được kết quả.

Ví dụ Sort cột 1:
RS.Sort RS.Fields(0).Name & " Desc" ' Hoặc " Asc"
Bạn ơi, mình thử vài lần mà không thành công, mình gửi file đính kèm, bạn thêm giúp mình cái dấu nháy đơn hoặc nháy kép như bạn hướng dẫn nhé
Cảm ơn bạn
 

File đính kèm

  • GPE2.rar
    36.9 KB · Đọc: 11
Chủ thớt xem bài số 4 Mục số 2 là làm được như hình sau
hôm nào rảnh đưa thêm CSV vào SQL cho mà xài ... chỉ là thêm cái If nữa là xong thôi mà

đang mò đưa cái gán dữ liệu lên Sheet kiểu Office 365 trên Delphi mà kẹt vài thứ chưa xong ( Khi nào xong úp DLL cho he )

Với Mạnh chỉ hướng dẫn cho vậy thôi ... còn làm chi tiết thì ít lắm
1598969025529.png
 
Bạn ơi, mình thử vài lần mà không thành công, mình gửi file đính kèm, bạn thêm giúp mình cái dấu nháy đơn hoặc nháy kép như bạn hướng dẫn nhé
Cảm ơn bạn
Đúng là trong trường hợp của bác là phải dùng ShortName, vì tên chứa dấu ngoại lệ.

Trong Connect path chứa dấu ngoại lệ:
strConnect = "Provider=Microsoft.ACE.OLEDB.16.0; " _
& "Data Source =""" & Path & """;" _
& "Extended Properties=""Text;HDR=No;FMT=Delimited""; "

Trong Query: Thêm cặp ngoặc vuông [] nếu từ khóa chứa chuỗi unicode, kí tự ngoại lệ, hoặc shortName


Dưới đây là đoạn code mà bác không cần dùng đến ShortName, vì nếu file trong folder là duy nhất.
Code dưới cũng sẽ lấy Header nếu có

JavaScript:
Sub GetData_1()
  Dim d As Date, CellKQ As Range, fileDirPath As String
  Dim CN, RS, Query$
  d = Sheets("DATA").Range("A2").Value
  fileDirPath = ThisWorkbook.Path & "\" & Format(d, "yyyy.mm.dd") & "\"
  Set CN = VBA.CreateObject("ADODB.Connection")
  With CN
    .Provider = "Microsoft.ACE.OLEDB.16.0"
    .ConnectionString = "Data Source='" & fileDirPath & "';Extended Properties='text;hdr=no;IMEX=1'"
  End With
  CN.Open
  Set RS = VBA.CreateObject("ADODB.Recordset")
  Query = "SELECT * FROM [" & Format(d, "yyyymm") & "~1" & ".csv] WHERE ISNUMERIC(F2) ORDER BY 6 ASC"
  RS.Open Query, CN, 3, 1
  If Not RS.BOF Or Not RS.EOF Then Sheets("DATA").Cells(5, 1).CopyFromRecordset RS
  Set RS = VBA.CreateObject("ADODB.Recordset")
  Query = "SELECT TOP 1 * FROM [" & Format(d, "yyyymm") & "~1" & ".csv] WHERE NOT ISNUMERIC(F2)"
  RS.Open Query, CN, 3, 1
  If Not RS.BOF Or Not RS.EOF Then Sheets("DATA").Cells(4, 1).CopyFromRecordset RS
  CN.Close
  Set CN = Nothing: Set RS = Nothing
End Sub
 

File đính kèm

  • GetData_O2.xlsb
    32.8 KB · Đọc: 18
@Chủ Topic
Thực hiện theo Short Name, và đặt HDR=YES ---> rồi Order theo đúng tiêu đề có trong CSV là được mong muốn
Nhưng tên đặt kiểu thư mục / file này thì làm khó chính mình thôi
 
@Chủ Topic
Thực hiện theo Short Name, và đặt HDR=YES ---> rồi Order theo đúng tiêu đề có trong CSV là được mong muốn
Nhưng tên đặt kiểu thư mục / file này thì làm khó chính mình thôi
Thực hiện theo Shortname thì bài #2 bạn @befaint đã giúp em rồi. Do có bạn HeSanbi nói đặt chuỗi nguồn trong nháy kép mà không cần shortname nên em mới hỏi lại.
Về vấn đề đặt tên thư mục, em không thay đổi được, em lấy dữ liệu của người khác chia sẻ vì vậy phải tìm cách vượt qua thử thách này thôi
Bài đã được tự động gộp:

Chủ thớt xem bài số 4 Mục số 2 là làm được như hình sau
hôm nào rảnh đưa thêm CSV vào SQL cho mà xài ... chỉ là thêm cái If nữa là xong thôi mà
Bạn chia sẻ phần này cho mình được không. Mình cũng đang rất quan tâm đến cái này. Thực tế mình đang lấy dữ liệu từ .csv vào sheet rồi đẩy vào SQL Server. Trước có @ongke0711 đã hướng dẫn nhưng quá trình thực hiện gặp vướng mắc nên đành đi đường vòng qua worksheet của Excel
 
Lần chỉnh sửa cuối:
Đúng là trong trường hợp của bác là phải dùng ShortName, vì tên chứa dấu ngoại lệ.

Trong Connect path chứa dấu ngoại lệ:
strConnect = "Provider=Microsoft.ACE.OLEDB.16.0; " _
& "Data Source =""" & Path & """;" _
& "Extended Properties=""Text;HDR=No;FMT=Delimited""; "

Trong Query: Thêm cặp ngoặc vuông [] nếu từ khóa chứa chuỗi unicode, kí tự ngoại lệ, hoặc shortName


Dưới đây là đoạn code mà bác không cần dùng đến ShortName, vì nếu file trong folder là duy nhất.
Code dưới cũng sẽ lấy Header nếu có

JavaScript:
Sub GetData_1()
  Dim d As Date, CellKQ As Range, fileDirPath As String
  Dim CN, RS, Query$
  d = Sheets("DATA").Range("A2").Value
  fileDirPath = ThisWorkbook.Path & "\" & Format(d, "yyyy.mm.dd") & "\"
  Set CN = VBA.CreateObject("ADODB.Connection")
  With CN
    .Provider = "Microsoft.ACE.OLEDB.16.0"
    .ConnectionString = "Data Source='" & fileDirPath & "';Extended Properties='text;hdr=no;IMEX=1'"
  End With
  CN.Open
  Set RS = VBA.CreateObject("ADODB.Recordset")
  Query = "SELECT * FROM [" & Format(d, "yyyymm") & "~1" & ".csv] WHERE ISNUMERIC(F2) ORDER BY 6 ASC"
  RS.Open Query, CN, 3, 1
  If Not RS.BOF Or Not RS.EOF Then Sheets("DATA").Cells(5, 1).CopyFromRecordset RS
  Set RS = VBA.CreateObject("ADODB.Recordset")
  Query = "SELECT TOP 1 * FROM [" & Format(d, "yyyymm") & "~1" & ".csv] WHERE NOT ISNUMERIC(F2)"
  RS.Open Query, CN, 3, 1
  If Not RS.BOF Or Not RS.EOF Then Sheets("DATA").Cells(4, 1).CopyFromRecordset RS
  CN.Close
  Set CN = Nothing: Set RS = Nothing
End Sub
Cảm ơn bạn đã hỗ trợ.
Code của bạn đã chạy tốt.
Cho mình hỏi thêm là dữ liệu csv đã được copy vào file nhưng thứ tự cột không giống file csv. Không rõ đoạn code kiểm soát thứ tự các cột được copy vào file ở chỗ nào. Bạn chỉ giúp mình nhé !
 
Thực hiện theo Shortname thì bài #2 bạn @befaint đã giúp em rồi. Do có bạn HeSanbi nói đặt chuỗi nguồn trong nháy kép mà không cần shortname nên em mới hỏi lại.
Về vấn đề đặt tên thư mục, em không thay đổi được, em lấy dữ liệu của người khác chia sẻ vì vậy phải tìm cách vượt qua thử thách này thôi
Bài đã được tự động gộp:


Bạn chia sẻ phần này cho mình được không. Mình cũng đang rất quan tâm đến cái này. Thực tế mình đang lấy dữ liệu từ .csv vào sheet rồi đẩy vào SQL Server. Trước có @ongke0711 đã hướng dẫn nhưng quá trình thực hiện gặp vướng mắc nên đành đi đường vòng qua worksheet của Excel

Đã SQL server thì nên dùng chính chương trình của SQL server sẽ nhanh hơn (Store Procedure)
 
Bạn chia sẻ phần này cho mình được không. Mình cũng đang rất quan tâm đến cái này. Thực tế mình đang lấy dữ liệu từ .csv vào sheet rồi đẩy vào SQL Server. Trước có @ongke0711 đã hướng dẫn nhưng quá trình thực hiện gặp vướng mắc nên đành đi đường vòng qua worksheet của Excel
Bài số 2 và bài số 24 đã làm cho bạn hết rồi mà ... Mình muốn nếu vấn đề ra đó để mở rộng nghiên cứu thêm thôi mà
Thong thả bạn thử mò xem sao ===> xong rút ra cái mình cần ===> tự tay mà viết code lấy là ok ngay và luôn đó
 
Anh dùng Task Scheduler kích hoạt file Excel với tính năng Workbook_Open mà em
Bạn đang dùng VBA của các bạn khác ổn định nên tôi không ý kiến cái gì hay hơn (SQL hay Power query). Có điều tôi chưa hiểu "Task Scheduler kích hoạt file Excel với tính năng Workbook_Open" tại sao không dùng được với Power query? Bản thân Query có tính năng refresh on open, không những thế trong sự kiện workbook_Open cũng có thể viết câu lệnh refresh query được mà?
 
Có điều tôi chưa hiểu "Task Scheduler kích hoạt file Excel với tính năng Workbook_Open" tại sao không dùng được với Power query? Bản thân Query có tính năng refresh on open, không những thế trong sự kiện workbook_Open cũng có thể viết câu lệnh refresh query được mà?

Power query không có tự động mở Workbook (chạy Excel) bác à.
 
Bạn đang dùng VBA của các bạn khác ổn định nên tôi không ý kiến cái gì hay hơn (SQL hay Power query). Có điều tôi chưa hiểu "Task Scheduler kích hoạt file Excel với tính năng Workbook_Open" tại sao không dùng được với Power query? Bản thân Query có tính năng refresh on open, không những thế trong sự kiện workbook_Open cũng có thể viết câu lệnh refresh query được mà?
Chào bác.
Đúng là em chưa dùng tính năng nào của Power Query trừ tính năng Copy from Web để lấy dữ liệu từ Google sheet.
Theo em hình dung, dùng Power Query thì vẫn cần người dùng có vài thao tác theo menu của PQ. Còn em dùng Code VBA sẽ tự động hoàn toàn. Ngoài ra, em nghĩ rằng dùng PQ không nhanh, mượt bằng ADO.
Đây là suy nghĩ của em, nếu đuoc bác cho vài mẫu để em thấy sức mạnh của nó nhằm có động lực tìm hiểu về PQ thì tốt quá
 
Chào bác.
Đúng là em chưa dùng tính năng nào của Power Query trừ tính năng Copy from Web để lấy dữ liệu từ Google sheet.
Theo em hình dung, dùng Power Query thì vẫn cần người dùng có vài thao tác theo menu của PQ. Còn em dùng Code VBA sẽ tự động hoàn toàn. Ngoài ra, em nghĩ rằng dùng PQ không nhanh, mượt bằng ADO.
Đây là suy nghĩ của em, nếu đuoc bác cho vài mẫu để em thấy sức mạnh của nó nhằm có động lực tìm hiểu về PQ thì tốt quá
Chữ Power đủ để nói lên tất cả anh ạ. Chắc chắn sẽ không có j tiếc nuối. ADO mà ăn cả 1 folder chắc bội thực luôn.
 
Chào bác.
Đúng là em chưa dùng tính năng nào của Power Query trừ tính năng Copy from Web để lấy dữ liệu từ Google sheet.
Theo em hình dung, dùng Power Query thì vẫn cần người dùng có vài thao tác theo menu của PQ. Còn em dùng Code VBA sẽ tự động hoàn toàn. Ngoài ra, em nghĩ rằng dùng PQ không nhanh, mượt bằng ADO.
Đây là suy nghĩ của em, nếu đuoc bác cho vài mẫu để em thấy sức mạnh của nó nhằm có động lực tìm hiểu về PQ thì tốt quá
Power query thao tác một lần duy nhất, sau đó chỉ cần refresh để cập nhật dữ liệu mới nhất, nếu gộp nhiều file thành một thì thậm chí khi thêm file, chỉ cần chép thêm file vào thư mục. Cũng tương đương SQL Union nhiều file trong thư mục. Thao tác cũng đơn giản chứ không khó như học lập trình, học SQL
Tài liệu tôi đã chia sẻ từ 2019: https://www.giaiphapexcel.com/diend...pivot-nhân-sinh-nhật-gpe13.143641/post-927216
 
Đã SQL server thì nên dùng chính chương trình của SQL server sẽ nhanh hơn (Store Procedure)
Ôi may quá, chủ đề đang tìm kiếm.
Em dựng 1 con SQL Server có cài SSMS được mấy tháng mà chưa làm ăn được gì với nó. Mục đích là dựng database của riêng mình từ các file csv (được kết xuất từ DB khác (tất nhiên em ko đc mò vào cái DB ấy rồi).
Mấy bài em hỏi về ADO cũng là để truy xuất dữ liệu ra Excel và đưa dữ liệu vào DB. Việc truy xuất thì em đã copy đc đoạn code mẫu trên diễn đàn nên tạm thời yên tâm. Riêng việc đưa dữ liệu vào SQL Server thì thật tốn thời gian vì phải đi lòng vòng theo đúng khả năng hạn hẹp của mình. Em đã tạo Job và chỉ chờ cái quan trọng nhất là SP (Stored Procedure) nhưng chưa khi nào làm được dù cũng sục sạo trên Youtube và Google. Tiện đây bác chỉ giúp em với nhé hoặc em mở topic mới thì bác hướng dẫn em. Cảm ơn bác
Bài đã được tự động gộp:

Power query thao tác một lần duy nhất, sau đó chỉ cần refresh để cập nhật dữ liệu mới nhất, nếu gộp nhiều file thành một thì thậm chí khi thêm file, chỉ cần chép thêm file vào thư mục. Cũng tương đương SQL Union nhiều file trong thư mục. Thao tác cũng đơn giản chứ không khó như học lập trình, học SQL
Tài liệu tôi đã chia sẻ từ 2019: https://www.giaiphapexcel.com/diend...pivot-nhân-sinh-nhật-gpe13.143641/post-927216
Bác ơi, mỗi ngày tên file csv lại khác nhau mà. Tên file được có quy luật là kèm tiền tố là ngày tháng được tạo ra. Không rõ PQ có uyển chuyển được vấn đề này không ?
 
Bác ơi, mỗi ngày tên file csv lại khác nhau mà. Tên file được có quy luật là kèm tiền tố là ngày tháng được tạo ra. Không rõ PQ có uyển chuyển được vấn đề này không ?
Nó lấy tất. Bạn xem tài liệu mục Combine
 
Ôi may quá, chủ đề đang tìm kiếm.
Em dựng 1 con SQL Server có cài SSMS được mấy tháng mà chưa làm ăn được gì với nó. Mục đích là dựng database của riêng mình từ các file csv (được kết xuất từ DB khác (tất nhiên em ko đc mò vào cái DB ấy rồi).
Mấy bài em hỏi về ADO cũng là để truy xuất dữ liệu ra Excel và đưa dữ liệu vào DB. Việc truy xuất thì em đã copy đc đoạn code mẫu trên diễn đàn nên tạm thời yên tâm. Riêng việc đưa dữ liệu vào SQL Server thì thật tốn thời gian vì phải đi lòng vòng theo đúng khả năng hạn hẹp của mình. Em đã tạo Job và chỉ chờ cái quan trọng nhất là SP (Stored Procedure) nhưng chưa khi nào làm được dù cũng sục sạo trên Youtube và Google. Tiện đây bác chỉ giúp em với nhé hoặc em mở topic mới thì bác hướng dẫn em. Cảm ơn bác
Bài đã được tự động gộp:


Bác ơi, mỗi ngày tên file csv lại khác nhau mà. Tên file được có quy luật là kèm tiền tố là ngày tháng được tạo ra. Không rõ PQ có uyển chuyển được vấn đề này không ?
Đây xem tạm vậy
Nhưng không có quyền truy xuất .. dến DB thì còn làm được gì vậy, vậy nhờ IT - người quản lý khóa cái đó giúp bạn
 
Thử vậy xem sao

1/ từ Excel lấy dữ liệu File CSV lên cái Array ( Mảng Tính toán gì đó xong )
2/ sau khi có cái mục số 1 xong chạy code lưu cái Array đó vào Server
 
Ôi may quá, chủ đề đang tìm kiếm.

Mấy bài em hỏi về ADO cũng là để truy xuất dữ liệu ra Excel và đưa dữ liệu vào DB. Việc truy xuất thì em đã copy đc đoạn code mẫu trên diễn đàn nên tạm thời yên tâm. Riêng việc đưa dữ liệu vào SQL Server thì thật tốn thời gian vì phải đi lòng vòng theo đúng khả năng hạn hẹp của mình. Em đã tạo Job và chỉ chờ cái quan trọng nhất là SP (Stored Procedure) nhưng chưa khi nào làm được dù cũng sục sạo trên Youtube và Google. Tiện đây bác chỉ giúp em với nhé hoặc em mở topic mới thì bác hướng dẫn em. ]

Cái stored proc. Bulk insert trực tiếp vào SQL Sv nó không đáp ứng yêu cầu của bạn à?
 
Web KT

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

Back
Top Bottom