Lấy dữ liệu từ 1 file Excel khách đang đóng

Liên hệ QC

Cuongnv0920

Thành viên chính thức
Tham gia
24/3/18
Bài viết
62
Được thích
8
Giới tính
Nam
Mã:
Sub importData_test()
    Dim owb As Workbook
    Dim sh As Worksheet
   
    Set sh = Sheet1
    'mở file cần lấy dữ liệu
    Set owb = Workbooks.Open("C:\Users\cuong\Desktop\VBA\dulieu.xlsx")
    'copy vùng dữ liệu cần lấy
    owb.Sheets("Data").Range("C1:G200").Copy
    'dán vào vũng cần lấy kết quá
    sh.Range("A1").PasteSpecial xlPasteAll
    owb.Close False
End Sub

Trong trường hợp này thì sheet cần lấy dữ liệu phải có tên là "Data"
nhưng mình muốn nhờ mọi người giúp trong trường hợp Sheets"Data" là 1 cái tên bất kỳ mà vẫn lấy được dữ liệu
mong mọi người giúp ạ. :)
 
Mã:
Sub importData_test(ten_bat_ky as string)
    Dim owb As Workbook
    Dim sh As Worksheet
  
    Set sh = Sheet1
    'mở file cần lấy dữ liệu
    Set owb = Workbooks.Open("C:\Users\cuong\Desktop\VBA\dulieu.xlsx")
    'copy vùng dữ liệu cần lấy
    owb.Sheets(ten_bat_ky).Range("C1:G200").Copy
    'dán vào vũng cần lấy kết quá
    sh.Range("A1").PasteSpecial xlPasteAll
    owb.Close False
End Sub
muốn nhập sheet nào thì gọi sub này ra, ví dụ sheet tên là Du_lieu thì
Mã:
 call  importData_test("Du_lieu")
 
Upvote 0
Mã:
Sub importData_test(ten_bat_ky as string)
    Dim owb As Workbook
    Dim sh As Worksheet

    Set sh = Sheet1
    'mở file cần lấy dữ liệu
    Set owb = Workbooks.Open("C:\Users\cuong\Desktop\VBA\dulieu.xlsx")
    'copy vùng dữ liệu cần lấy
    owb.Sheets(ten_bat_ky).Range("C1:G200").Copy
    'dán vào vũng cần lấy kết quá
    sh.Range("A1").PasteSpecial xlPasteAll
    owb.Close False
End Sub
muốn nhập sheet nào thì gọi sub này ra, ví dụ sheet tên là Du_lieu thì
Mã:
 call  importData_test("Du_lieu")

mình mới tìm hiểu thì chỉ cẩn thay đổi sheet("Data") bằng Worksheets(1)
Số (1) là số thứ tự đếm từ trái qua
 
Upvote 0
Bạn yêu cầu là tên bất kỳ(.name) thì mình mới gợi ý code như vậy, còn cái bạn nói về số là vị trí của sheet trong workbook rồi (.index). Tùy vào bảng tính của bạn như thế nào thì bạn lựa chọn nên sử dụng thuộc tính name hay index, nếu bạn muốn sử dụng index thì mình nghỉ thay đổi vầy thôi.
Mã:
Sub importData_test(vi_tri as integer)
    Dim owb As Workbook
    Dim sh As Worksheet
 
    Set sh = Sheet1
    'mở file cần lấy dữ liệu
    Set owb = Workbooks.Open("C:\Users\cuong\Desktop\VBA\dulieu.xlsx")
    'copy vùng dữ liệu cần lấy
    owb.Sheets(vi_tri).Range("C1:G200").Copy
    'dán vào vũng cần lấy kết quá
    sh.Range("A1").PasteSpecial xlPasteAll
    owb.Close False
End Sub
Sau đó muốn lấy dữ liệu sheet số mấy thì gọi thủ tục này ra,ví dụ sheet số 5 trong workbook
Mã:
call  importData_test(5)
Mình chưa test, bạn test thử xem được không.
 
Upvote 0
Bạn yêu cầu là tên bất kỳ(.name) thì mình mới gợi ý code như vậy, còn cái bạn nói về số là vị trí của sheet trong workbook rồi (.index). Tùy vào bảng tính của bạn như thế nào thì bạn lựa chọn nên sử dụng thuộc tính name hay index, nếu bạn muốn sử dụng index thì mình nghỉ thay đổi vầy thôi.
Mã:
Sub importData_test(vi_tri as integer)
    Dim owb As Workbook
    Dim sh As Worksheet

    Set sh = Sheet1
    'mở file cần lấy dữ liệu
    Set owb = Workbooks.Open("C:\Users\cuong\Desktop\VBA\dulieu.xlsx")
    'copy vùng dữ liệu cần lấy
    owb.Sheets(vi_tri).Range("C1:G200").Copy
    'dán vào vũng cần lấy kết quá
    sh.Range("A1").PasteSpecial xlPasteAll
    owb.Close False
End Sub
Sau đó muốn lấy dữ liệu sheet số mấy thì gọi thủ tục này ra,ví dụ sheet số 5 trong workbook
Mã:
call  importData_test(5)
Mình chưa test, bạn test thử xem được không.
Mình làm được rồi nhưng dữ liệu của mình khoảng 20.000 dòng x 12 cột, sau khi mở file nguồn ra, khi nó đóng lại thì nó thông báo theo hình dưới. Có cách nào tắt nó luôn không vậy?
Và có thể thay đổi vị trí sheet (ví dụ: 1 , 2, 3...) thành tên worksheet không?
1535013425719.png
 
Upvote 0
bạn đưa file của bạn lên đây mình xem thử
 
Upvote 0
Mình gởi 2 file lên nhờ bạn xem dùm nhé.
Ngoài ra, đê thuận tiện cho việc sao chép file này ra nhiều file khác nhau, mình có ý là đường link và tên sheet có thể đặt trong file đích tại ô B1 và B2, code sẽ lấy theo 2 ô này. Vì nếu copy file này ra vị trí khác thì phải vào code để chỉnh sửa thì sẽ khó khăn cho người khác. Họ cứ chèn link và tên sheet vào 2 vị trí trên là được.

1535367136869.png
 

File đính kèm

  • Part list (Updated).xls
    5.3 MB · Đọc: 11
  • Book1.xlsm
    1.4 MB · Đọc: 11
Upvote 0
Hic...hic... nhờ bạn nào giúp mình câu hỏi trên nhé.
 
Upvote 0
Hic...hic... nhờ bạn nào giúp mình câu hỏi trên nhé.

Xin chào anh79_ct
Trước hết bạn hãy bỏ các dấu " tại ô B1 và B2 đi nhé:
Ví dụ:
"qryexpPartsList" thì sửa thành: qryexpPartsList

Vì khi đã khai báo: ten_bat_ky As String như vậy có nghĩa tên sheet là dạng chuỗi (String)
Tương tự bạn hãy bỏ 2 dấu "" trong ô B1, code bạn Oanh Thơ sửa lại như sau:

Mã:
Sub importData_test(ten_bat_ky As String)
    Dim owb As Workbook, sh As Worksheet
    Dim tenfile As String

    Set sh = ThisWorkbook.Worksheets("Sheet1")
    tenfile = sh.Range("B1")
    'mở file cần lấy dữ liệu
    Set owb = Workbooks.Open(tenfile)
    
    'copy vùng dữ liệu cần lấy
    owb.Sheets(ten_bat_ky).Range("A1:L20000").Copy
    'dán vào vùng cần lấy kết quả
    sh.Range("A3").PasteSpecial xlPasteAll
    Application.CutCopyMode = False
    owb.Close False
End Sub

Sub Button2_Click()
    Dim tenSheet As String
    tenSheet = ThisWorkbook.Worksheets("Sheet1").Range("B2")
    Call importData_test(tenSheet)
End Sub
 
Upvote 0
Hình như cái này là mở file lên, lấy dữ liệu rồi đóng file thì phải? Chứ không phải như ADO là lấy dữ liệu không mở file.
Vậy trường hợp file này đang bị user khác mở rồi thì code này có chạy được ko?
 
Upvote 0
Hình như cái này là mở file lên, lấy dữ liệu rồi đóng file thì phải? Chứ không phải như ADO là lấy dữ liệu không mở file.
Vậy trường hợp file này đang bị user khác mở rồi thì code này có chạy được ko?

Xin chào babyheomoi,
Nếu trường hợp mở file rồi thì thêm hàm kiểm tra xem file đã mở hay chưa nếu chưa mở thì mở file còn nếu mở rồi thì không mở nữa, code sẽ sửa lại như sau:
Mã:
Sub importData_test(ten_bat_ky As String)
    Dim owb As Workbook, sh As Worksheet
    Dim tenfile As String, source_FileName As String
    Set sh = ThisWorkbook.Worksheets("Sheet1")
    tenfile = sh.Range("B1")
    source_FileName = Mid(tenfile, InStrRev(tenfile, "\") + 1)
    If bIsBookOpen(source_FileName) Then
        Set owb = Workbooks(source_FileName)
    Else
        Set owb = Workbooks.Open(tenfile)
    End If
    owb.Sheets(ten_bat_ky).Range("A1:L20000").Copy
    sh.Range("A3").PasteSpecial
    Application.CutCopyMode = False
'    owb.Close False
End Sub

Sub Button2_Click()
    Dim tenSheet As String
    tenSheet = ThisWorkbook.Worksheets("Sheet1").Range("B2")
    Call importData_test(tenSheet)
End Sub

Function bIsBookOpen(ByRef szBookName As String) As Boolean
    On Error Resume Next
    bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing)
End Function
OanhThơ chưa thử trong trường hợp tập tin để trong thư mục sharefull , khi các user khác mở nên thì sẽ thế nào.Nếu bạn có điều kiện nhờ bạn test giúp.
 
Upvote 0
Hình như cái này là mở file lên, lấy dữ liệu rồi đóng file thì phải? Chứ không phải như ADO là lấy dữ liệu không mở file.
Vậy trường hợp file này đang bị user khác mở rồi thì code này có chạy được ko?
Bạn thử chạy file đính kèm.
Trong ô B1, B2, bỏ dấu "
 

File đính kèm

  • Book1.xlsm
    1.4 MB · Đọc: 24
Upvote 0
Cám ơn các bạn rất nhiều, nếu thêm 1 yêu cầu nữa là khi mở file lên, nó tự động lấy luôn dữ liệu ở file đang đóng luôn được không? Không cần tạo nút lệnh.
 
Upvote 0
Cám ơn các bạn rất nhiều, nếu thêm 1 yêu cầu nữa là khi mở file lên, nó tự động lấy luôn dữ liệu ở file đang đóng luôn được không? Không cần tạo nút lệnh.

Xin chào anh79_ct, bạn thử như sau:
Trong cửa sổ VBA, tại ThisWorkbook bạn thêm đoạn code:
Mã:
Private Sub Workbook_Open()
    Call Button2_Click
End Sub
 
Upvote 0
Xin chào babyheomoi,
Nếu trường hợp mở file rồi thì thêm hàm kiểm tra xem file đã mở hay chưa nếu chưa mở thì mở file còn nếu mở rồi thì không mở nữa, code sẽ sửa lại như sau:
Mã:
Sub importData_test(ten_bat_ky As String)
    Dim owb As Workbook, sh As Worksheet
    Dim tenfile As String, source_FileName As String
    Set sh = ThisWorkbook.Worksheets("Sheet1")
    tenfile = sh.Range("B1")
    source_FileName = Mid(tenfile, InStrRev(tenfile, "\") + 1)
    If bIsBookOpen(source_FileName) Then
        Set owb = Workbooks(source_FileName)
    Else
        Set owb = Workbooks.Open(tenfile)
    End If
    owb.Sheets(ten_bat_ky).Range("A1:L20000").Copy
    sh.Range("A3").PasteSpecial
    Application.CutCopyMode = False
'    owb.Close False
End Sub

Sub Button2_Click()
    Dim tenSheet As String
    tenSheet = ThisWorkbook.Worksheets("Sheet1").Range("B2")
    Call importData_test(tenSheet)
End Sub

Function bIsBookOpen(ByRef szBookName As String) As Boolean
    On Error Resume Next
    bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing)
End Function
OanhThơ chưa thử trong trường hợp tập tin để trong thư mục sharefull , khi các user khác mở nên thì sẽ thế nào.Nếu bạn có điều kiện nhờ bạn test giúp.

Vậy xin cho em hỏi: em muốn copy dữ liệu dòng cuối cùng của file nguồn Sheet1 vào dòng cuối cùng của file đích Sheet A thì điều chỉnh code như thế nào ạ?
 
Upvote 0
Vậy xin cho em hỏi: em muốn copy dữ liệu dòng cuối cùng của file nguồn Sheet1 vào dòng cuối cùng của file đích Sheet A thì điều chỉnh code như thế nào ạ?
Vậy chắc bạn sẽ phải thêmcode tìm dòng cuối rồi mới copy! Code tìm dòng cuối nè, bạn tự sửa lại phù hợp nhé!
Mã:
With Sheet1
    eR = .Range("A" & .Rows.Count).End(xlUp).Row + 1
    .Range("A" & eR).Resize(1, 8) = LsR
End With
 
Upvote 0
Vậy chắc bạn sẽ phải thêmcode tìm dòng cuối rồi mới copy! Code tìm dòng cuối nè, bạn tự sửa lại phù hợp nhé!
Mã:
With Sheet1
    eR = .Range("A" & .Rows.Count).End(xlUp).Row + 1
    .Range("A" & eR).Resize(1, 8) = LsR
End With

Mình copy để vào chỗ nào trong đoạn code trên bạn nhỉ?
Cảm ơn bạn lắm lắm
 
Upvote 0
Web KT
Back
Top Bottom