Lấy dữ liệu từ file csv

Nongtiep

Yêu THVBA
Chào anh chị
em có viết code VBA lấy dữ liệu từ file gốc . . . em tạo file tổng hợp Start 1 chay file gốc 1, Start 2 chay cho file gốc 2.
Nhưng em chỉ biết viết lấy dữ liệu từ tên sheet mặc định.( vì file gốc định dạng tải mặc định là CSV. nên đổi tên sheet lại mất nhiều thời gian
Anh chị có biết cách nào khác mà không cần vào file gốc đổi tên sheet không ạ
mong Anh chị giúp đỡ.
 

tuhocvba

Administrator
Thành viên BQT
File csv thì chỉ có một sheet thôi. Cho nên bạn có thể dùng là:
Workbooks(ten_wb).Sheets(1)
 

Nongtiep

Yêu THVBA
Sub Main2()
Dim sourceFile As Variant

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

sourceFile = Worksheets("Main").Cells(4, "C").Value

GetData sourceFile, "chuong trinh 2", "A2:B1000", Sheets("GetData").Range("A8"), False, False
Split_data2
Sheets("GetData").Range("A8:B1006").ClearContents
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
 

Euler

Administrator
Thành viên BQT
Bạn đọc topic này giúp mình:
Topic của bạn, chúng tôi không hỗ trợ thêm, mong bạn hết sức thông cảm.
================
  • Nếu bạn không biết cách upload ảnh lên diễn đàn, bạn vui lòng tham khảo topic sau: .
  • Bạn lưu ý phải sử dụng thẻ Code khi viết code trên forum. Xin xem mục 4 trong .
  • Bạn nên nói rõ Input là gì? Output muốn ra sao?
  • Bạn nên có file demo. Bạn có thể upload file lên google drive hoặc mediafire.com rồi dẫn link về diễn đàn.

Một bài viết trình bày dễ hiểu là một bài viết sử dụng hình minh họa trực quan. Một bài viết chỉ toàn chữ sẽ khiến người khác không muốn đọc.

Một bài viết dễ hiểu sẽ giảm thiểu thời gian đọc hiểu cho người khác, bạn sẽ nhanh chóng nhận được hỗ trợ nếu bài viết của bạn là một bài viết dễ hiểu.
Chúng tôi mong bạn hiểu và hợp tác.
 

Nongtiep

Yêu THVBA
em mới bắt đầu học. Vba nên chưa hiểu rõ lắm. mong anh chị giúp
các file đínhh kèm em để trên ạ
*
*
*
 

tuhocvba

Administrator
Thành viên BQT
Mình hiểu rồi. Nếu không ai giải quyết thì mai mình sẽ xem.
 

NhanSu

SMod
Thành viên BQT
Để mình xử lý cũng được. Có gì để sáng mai mình sẽ post code. Bạn @Nongtiep cần đưa file đúng định dạng gốc. File excel gốc của bạn có 2 sheet, không biết bạ muốn lấy sheet nào?
 
Sửa lần cuối:

tuhocvba

Administrator
Thành viên BQT
@Nongtiep trả lời phản hồi của bạn @NhanSu . Chú ý không đặt tiêu đề topic chỉ toàn chữ cái viết hoa. Không biết bạn nhìn có thấy khó chịu không.
Mình sửa rồi đấy.
 

NhanSu

SMod
Thành viên BQT
@Nongtiep dùng ADO lấy dữ liệu từ file CSV khác với lấy dữ liệu từ file excel. Khi lấy dữ liệu từ file excel, ta tạo kết nối với file đó rồi open recordset với sheet, table hay range nhưng với CSV ta tạo kết nối với folder chứa file rồi open recordset với chính tên file CSV. Code ví dụ đơn giản dưới đây chọn file CSV, lấy nội dung của file vào excel. Bạn tùy biến cho file của mình nhé.
Mã:
Option Explicit

Sub GetDataFromCSV()
    Dim oCnn As New ADODB.Connection
    Dim oRs As New ADODB.Recordset
    Dim s$, FName$, FPath$, i&
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Filters.Add "CSV file", "*.CSV", 1
        .Show
        s = .SelectedItems(1)
    End With
    i = InStrRev(s, "\")
    FName = Right(s, Len(s) - i)
    FPath = Left(s, i)
   
    s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & FPath & "';Extended Properties='Text;HDR=No;FMT=Delimited;MaxScanRows=0'"
    oCnn.Open s
    s = "SELECT * FROM [" & FName & "]"
    oRs.Open s, oCnn
    Range("A1").CopyFromRecordset oRs
    If Not oRs Is Nothing Then
        oRs.Close
        Set oRs = Nothing
    End If
    If Not oRs Is Nothing Then
        oCnn.Close
        Set oCnn = Nothing
    End If
End Sub
 
Sửa lần cuối:

Nongtiep

Yêu THVBA
@Nongtiep dùng ADO lấy dữ liệu từ file CSV khác với lấy dữ liệu từ file excel. Khi lấy dữ liệu từ file excel, ta tạo kết nối với file đó rồi open recordset với sheet, table hay range nhưng với CSV ta tạo kết nối với folder chứa file rồi open recordset với chính tên file CSV. Code ví dụ đơn giản dưới đây chọn file CSV, lấy nội dung của file vào excel. Bạn tùy biến cho file của mình nhé.
Mã:
Option Explicit

Sub GetDataFromCSV()
    Dim oCnn As New ADODB.Connection
    Dim oRs As New ADODB.Recordset
    Dim s$, FName$, FPath$, i&
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Filters.Add "CSV file", "*.CSV", 1
        .Show
        s = .SelectedItems(1)
    End With
    i = InStrRev(s, "\")
    FName = Right(s, Len(s) - i)
    FPath = Left(s, i)
  
    s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & FPath & "';Extended Properties='Text;HDR=No;FMT=Delimited;MaxScanRows=0'"
    oCnn.Open s
    s = "SELECT * FROM [" & FName & "]"
    oRs.Open s, oCnn
    Range("A1").CopyFromRecordset oRs
    If Not oRs Is Nothing Then
        oRs.Close
        Set oRs = Nothing
    End If
    If Not oRs Is Nothing Then
        oCnn.Close
        Set oCnn = Nothing
    End If
End Sub
Bạn có thể cho code này vào trong file "Tong hop" mình tạo được không. để thay thế code em đã gắn nút "Start 2" trong file.
vì em mới học nên chưa hiểu về Vba cho lắm ạ
 

NhanSu

SMod
Thành viên BQT
Bạn thử file này xem, mình đã sửa lại Sub Main2.
Mã:
Sub Main2()
Dim sourceFile As Variant

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

sourceFile = Worksheets("Main").Cells(4, "C").Value

'GetData sourceFile, "chuong trinh 2", "A2:B1000", Sheets("GetData").Range("A8"), False, False
'Split_data2
Sheets("GetData").Range("A8:B1006").ClearContents
GetDataFromCSV sourceFile, Sheets("GetData").Range("A8")
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Sub GetDataFromCSV(ByVal FullFileName$, r As Range)
    Dim oCnn As New ADODB.Connection
    Dim oRs As New ADODB.Recordset
    Dim s$, FName$, FPath$, i&
    i = InStrRev(FullFileName, "\")
    FName = Right(FullFileName$, Len(FullFileName$) - i)
    FPath = Left(FullFileName$, i)
   
    s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & FPath & "';Extended Properties='Text;HDR=Yes;FMT=Delimited;MaxScanRows=0'"
    oCnn.Open s
    s = "SELECT * FROM [" & FName & "]"
    oRs.Open s, oCnn
    
    r.CopyFromRecordset oRs
    If Not oRs Is Nothing Then
        oRs.Close
        Set oRs = Nothing
    End If
    If Not oRs Is Nothing Then
        oCnn.Close
        Set oCnn = Nothing
    End If
 

Nongtiep

Yêu THVBA
Bạn thử file này xem, mình đã sửa lại Sub Main2.
Mã:
Sub Main2()
Dim sourceFile As Variant

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

sourceFile = Worksheets("Main").Cells(4, "C").Value

'GetData sourceFile, "chuong trinh 2", "A2:B1000", Sheets("GetData").Range("A8"), False, False
'Split_data2
Sheets("GetData").Range("A8:B1006").ClearContents
GetDataFromCSV sourceFile, Sheets("GetData").Range("A8")
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub

Sub GetDataFromCSV(ByVal FullFileName$, r As Range)
    Dim oCnn As New ADODB.Connection
    Dim oRs As New ADODB.Recordset
    Dim s$, FName$, FPath$, i&
    i = InStrRev(FullFileName, "\")
    FName = Right(FullFileName$, Len(FullFileName$) - i)
    FPath = Left(FullFileName$, i)
  
    s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & FPath & "';Extended Properties='Text;HDR=Yes;FMT=Delimited;MaxScanRows=0'"
    oCnn.Open s
    s = "SELECT * FROM [" & FName & "]"
    oRs.Open s, oCnn
   
    r.CopyFromRecordset oRs
    If Not oRs Is Nothing Then
        oRs.Close
        Set oRs = Nothing
    End If
    If Not oRs Is Nothing Then
        oCnn.Close
        Set oCnn = Nothing
    End If
mình cảm ơn bạn rất nhiều
nhưng khi ấn nút Start 2 thấy bảo lỗi này bạn ạ. bạn xem giúp mình với
 

NhanSu

SMod
Thành viên BQT
Bạn vào Tool Reference kiểm tra xem. Nếu máy bạn đang hiện Missing ... thì cần thay đổi phiên bản ADO cho phù hợp. Máy mình dùng 365 nên ADO là 6.1, mình up ảnh toàn lỗi chán thật

 

Nongtiep

Yêu THVBA
Bạn vào Tool Reference kiểm tra xem. Nếu máy bạn đang hiện Missing ... thì cần thay đổi phiên bản ADO cho phù hợp. Máy mình dùng 365 nên ADO là 6.1, mình up ảnh toàn lỗi chán thật

Bạn cần đăng nhập để thấy đa phương tiện
Mình cũng không up được ảnh lên. Cứ phải thông qua link.
Bạn xem giúp mình phần ở sheet2 "getdata" có thể đổi 2 vị trí này cho nhau không. Ảnh
và phần Module & Slot này mình chỉ lấy 1-1 chứ không lấy chữ M đằng trước
 

NhanSu

SMod
Thành viên BQT
Bạn sửa lại câu truy vấn như sau
Mã:
s = "SELECT PartNumber,Right(Location,len(Location)-1) FROM [" & FName & "]"
 
Top