Ghi dữ liệu vào file excel đang đóng

Liên hệ QC

hanhpptc

Thành viên tiêu biểu
Tham gia
16/5/08
Bài viết
459
Được thích
320
Mình muốn có một macro ghi dữ liệu từ một file excel này (đang mở) sang một file excel khác đang đóng. Bạn nào biết xin hướng dẫn dùm cú pháp, cám ơn
 
Mình có 1 File A và file B đều nằm trong thư mục C. Vấn đề là làm sao không cần mở file B nhưng từ file A có thể ghi dữ liệu vào sheet 1 ô A1 của file B. Mong các bạn giúp
 
Upvote 0
Mình có 1 File A và file B đều nằm trong thư mục C. Vấn đề là làm sao không cần mở file B nhưng từ file A có thể ghi dữ liệu vào sheet 1 ô A1 của file B. Mong các bạn giúp
2 file nằm chung 1 folder thì code như sau: (Mở file B ra và copy dữ liệu file A vào, đóng file B lại)

Mã:
Sub Copy()
  On Error Resume Next
  Dim wk As Workbook
  Dim s As Worksheet
  Dim a As Range
  Dim strPath, strFile As String
  
  Set a = Sheet1.Range("a1:f" & Sheet1.Range("a65500").End(xlUp).Row)
  strPath = ThisWorkbook.Path
  strFile = "B.xls"
  Set wk = Workbooks.Open(strPath & "\" & strFile)
  Set s = wk.Sheets("Sheet1")
  a.Copy s.Range("a65536").End(xlUp).Offset(1, 0)
  
  Set a = Nothing
  Set s = Nothing
  
  wk.Save
  wk.Close True
  Set wk = Nothing
  
End Sub

Bạn tham khảo thêm file nhé (Nhớ giải nén ra rồi mới chạy file A nhé)
 

File đính kèm

  • Copy.rar
    9.3 KB · Đọc: 291
Upvote 0
Bạn xem link này, trong link mình làm bài toán là lấy dữ liệu từ các file đang đóng sang file hiện hành, bài toán ngược lại là hoàn toàn tương tự.

http://www.giaiphapexcel.com/forum/showthread.php?t=28735

@ ptlong04x1
1. Tôi đã xem bài của bạn nhưng đối với tôi việc nhập chính xác đường dẫn bằng thủ công còn khó hơn việc mở file ra copy rồi đóng lại bằng thủ công nên bài này đã nhiều lần "mở ra rồi lại đậy lại, chẳng làm gì được". Nếu bạn thêm phần Open... thì tốt quá.

2. Không phải ai cũng biết sửa code để làm ngược lại những bài tương tự do đó bạn làm giúp luôn đi để khi chưa kịp học vẫn có cái mà sài tạm.

Mình đang chờ để ăn chực nên mong bạn sớm trở lại bài này.
 
Upvote 0
@ ptlong04x1
1. Tôi đã xem bài của bạn nhưng đối với tôi việc nhập chính xác đường dẫn bằng thủ công còn khó hơn việc mở file ra copy rồi đóng lại bằng thủ công nên bài này đã nhiều lần "mở ra rồi lại đậy lại, chẳng làm gì được". Nếu bạn thêm phần Open... thì tốt quá.

2. Không phải ai cũng biết sửa code để làm ngược lại những bài tương tự do đó bạn làm giúp luôn đi để khi chưa kịp học vẫn có cái mà sài tạm.

Mình làm thử 1 ví dụ này, mọi người chỉnh sửa code lại cho phù hợp.

PHP:
Sub RecData(FilPath As String)
    On Error Resume Next
    With New Scripting.FileSystemObject
        With .GetFile(FilPath)
            If InStr(.Name, ".xls") = 0 Then Exit Sub
            With Workbooks.Open(.Path)
                .Sheets(1).Range("A1") = ThisWorkbook.Sheets(1).Range("A1")
                .Close (True)
            End With
        End With
    End With
End Sub

'------------------------------------------------------------'

Sub Run()
    On Error Resume Next
    With Application.FileDialog(msoFileDialogFilePicker)
        .Show
        .AllowMultiSelect = False
        Call RecData(.SelectedItems(1))
    End With
End Sub
 

File đính kèm

  • Ghi DL.xls
    28 KB · Đọc: 254
Upvote 0
Cám ơn ptlong04x1! mình đã test được rồi. Việc chỉnh sửa code để lấy dữ liệu theo ý muốn mình có thể làm được nhưng mình thật sự chưa hiểu các câu lệnh của code.

Phiền Long và các bạn dịch nghĩa giúp code này. Thanks!
 
Upvote 0
PHP:
Sub RecData(FilPath As String)
    On Error Resume Next
1    With New Scripting.FileSystemObject
2        With .GetFile(FilPath)
3          If InStr(.Name, ".xls") = 0 Then Exit Sub
4            With Workbooks.Open(.Path)
5               .Sheets(1).Range("A1") = ThisWorkbook.Sheets(1).Range("A1")
6               .Close (True)
            End With
        End With
    End With
End Sub

'------------------------------------------------------------'

Sub Run()
    On Error Resume Next
7   With Application.FileDialog(msoFileDialogFilePicker)
8       .Show
9       .AllowMultiSelect = False
10      Call RecData(.SelectedItems(1))
    End With
End Sub

Em xin giải thích như sau :

1. Tạo 1 đối tượng FileSytemObject mới (đối tượng này dùng để xử lý file và thư mục).

2. Tạo đối tượng File với phương thức .GetFile của đối tượng FileSytemObject với đường đẫn FilPath được truyền vào.

3. Nếu tên file chứa ".xls" thì ...

4. Mở file với đường dẫn là thuộc tính .Path của .GetFile.

5. Gán dữ liệu.

6. Đóng file vừa mở --> True --> Saves Change.

7. Mở hộp thoại Browse.

8. Hiện hộp thoại.

9. Không cho chọn nhiều File --> False.

10. Gọi Sub RecData với tham số truyền vào là đường đẫn của File vừa được chọn trong hộp thoại Browse (.SelectedItems(1) <--> FilPath).
 
Lần chỉnh sửa cuối:
Upvote 0
Để ghi dữ liệu thì bắt buộc phải mở file ra, trong trường hợp này là mở ngầm và âm thầm thoát ra.
 
Upvote 0
@ ptlong04x1
1. Tôi đã xem bài của bạn nhưng đối với tôi việc nhập chính xác đường dẫn bằng thủ công còn khó hơn việc mở file ra copy rồi đóng lại bằng thủ công nên bài này đã nhiều lần "mở ra rồi lại đậy lại, chẳng làm gì được". Nếu bạn thêm phần Open... thì tốt quá.

2. Không phải ai cũng biết sửa code để làm ngược lại những bài tương tự do đó bạn làm giúp luôn đi để khi chưa kịp học vẫn có cái mà sài tạm.

Hi anh, có lẽ chúng ta đang phức tạp hoá vấn đề và lạc sang topic khác mất rồi, với yêu cầu của tác giả thì theo em code chỉ thế này là đủ.

PHP:
Sub RecData()
    On Error Resume Next
    With Workbooks.Open(ThisWorkbook.Path & "\B.xls")
        .Sheets(1).[A1] = ThisWorkbook.Sheets(1).[A1]
        .Close (True)
    End With
End Sub

Code ở bài trước em viết, nó chỉ là 1 ví dụ cho việc sử dụng đối tượng FileSystemObject (đối tượng này có nhiều thứ rất hay ho), nhưng theo em không cần thiết sử dụng nó cho bài này.

 

File đính kèm

  • A.xls
    25 KB · Đọc: 138
Lần chỉnh sửa cuối:
Upvote 0
Chào ptlong04x1 Tôi thì không nghĩ như bạn, chủ Topic viết là File A, B chỉ là ví dụ thôi, nếu viết rõ là ThisWorkbook.Path & "\B.xls" thì mỗi khi áp dụng cho file khác lại phải sửa code à? hơn nữa bài trên vẫn đáp ứng được yêu cầu của chủ Topic mà, những cái vượt yêu cầu đâu có thừa "người ta xin cá - bạn cho cá và cho luôn cả cần câu" càng tốt chứ sao.

 
Upvote 0
Hi anh, có lẽ chúng ta đang phức tạp hoá vấn đề và lạc sang topic khác mất rồi, với yêu cầu của tác giả thì theo em code chỉ thế này là đủ.

PHP:
Sub RecData()
    On Error Resume Next
    With Workbooks.Open(ThisWorkbook.Path & "\B.xls")
        .Sheets(1).[A1] = ThisWorkbook.Sheets(1).[A1]
        .Close (True)
    End With
End Sub
Code ở bài trước em viết, nó chỉ là 1 ví dụ cho việc sử dụng đối tượng FileSystemObject (đối tượng này có nhiều thứ rất hay ho), nhưng theo em không cần thiết sử dụng nó cho bài này.

Bạn ơi, ví dụ của bạn rất hay nhưng sao nó chỉ lưu dữ liệu tại ô A1, còn các ô khác không được. Nếu muốn lưu cả sheet1 thì phải sửa thế nào. Chỉ giúp mình với vì mình thử mãi vãn không được.
 
Upvote 0
Bạn thay dòng :
PHP:
.Sheets(1).[A1] = ThisWorkbook.Sheets(1).[A1]

Bằng :
PHP:
ThisWorkbook.Sheets(1).Cells.Copy .Sheets(1).Cells
 
Lần chỉnh sửa cuối:
Upvote 0
Mình muốn có một macro ghi dữ liệu từ một file excel này (đang mở) sang một file excel khác đang đóng. Bạn nào biết xin hướng dẫn dùm cú pháp, cám ơn
Chào anh chị.
Trường hợp của em cũng giống như bạn hanhpptc, em đã tìm trong diễn đàn có mấy bài tương tự dùng ADO (tại hướng dẫn của thầy NDU, thầy Hai Lúa Miền Tây, thầy Viet Hoài, Thuyeu và các bài ADO căn bản của thớt học ADO) nhưng vẫn chưa làm được. Em cũng tìm trên google nhưng toàn là trường hợp ngược lại (Nghĩa là lấy dữ liệu từ file đang đóng sang book đang mở).
Nhờ anh chị gửi giúp em một ví dụ thật đơn giản để ghi dữ liệu từ một file A (đang mở) sang một file B (đang đóng) bằng ADO được không ạ? Trên file A chỉ 1 vùng nhỏ thôi ạ.
Em cảm ơn nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào anh chị.
Trường hợp của em cũng giống như bạn hanhpptc, em đã tìm trong diễn đàn có mấy bài tương tự dùng ADO (tại hướng dẫn của thầy NDU, thầy Hai Lúa Miền Tây, thầy Viet Hoài, Thuyeu và các bài ADO căn bản của thớt học ADO) nhưng vẫn chưa làm được. Em cũng tìm trên google nhưng toàn là trường hợp ngược lại (Nghĩa là lấy dữ liệu từ file đang đóng sang book đang mở).
Nhờ anh chị gửi giúp em một ví dụ thật đơn giản để ghi dữ liệu từ một file A (đang mở) sang một file B (đang đóng) bằng ADO được không ạ? Trên file A chỉ 1 vùng nhỏ thôi ạ.
Em cảm ơn nhiều.
Thử ví dụ như sau:

[GPECODE=sql]Sub GhiDL_HLMT()
Dim cn As Object
Set cn = CreateObject("ADODB.Connection")
With cn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
"data source=" & ThisWorkbook.Path & _
"\B.xls;extended properties=""excel 8.0;HDR=Yes;"";"
.Open
.Execute "INSERT INTO [Data$] SELECT STT,TEN,SL FROM [excel 8.0;database=" & _
ThisWorkbook.FullName & ";HDR=Yes].[Sheet1$B8:D23]"
End With
cn.Close: Set cn = Nothing
End Sub

[/GPECODE]
 

File đính kèm

  • Test.rar
    13.4 KB · Đọc: 188
Upvote 0
Em cảm ơn thầy nhiều lắm, ví dụ của thầy đơn giản và đúng ý của em rồi.
Tuy nhiên, em thử đổi lại câu truy vấn để bênh file B đưa đúng vị trí như bênh file A (Hoặc đưa vào một vị trí nào đó tuỳ mình), em sửa như vầy mà bị báo lỗi:
PHP:
.Execute "INSERT INTO [Data$B8:D23] SELECT STT,TEN,SL FROM [excel 8.0;database=" & _                    ThisWorkbook.FullName & ";HDR=Yes].[Sheet1$B8:D23]"
Em thử đổi tên sheet Data trong file B cho giống với sheet 1 và sửa lại câu truy vấn như vầy nhưng cũng vẫn báo lỗi:
PHP:
.Execute "INSERT INTO [Sheet1$B8:D23] SELECT STT,TEN,SL FROM [excel 8.0;database=" & _                    ThisWorkbook.FullName & ";HDR=Yes].[Sheet1$B8:D23]"
Mong thầy hướng dẫn thêm, em cảm ơn thầy nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Về vị trí của dữ liệu bên File B: bạn chẳng cần phải sửa gì cả, muốn dữ liệu nằm ở đâu thì bạn phải nhập trước tiêu đề cột vào vị trí đó.

Sửa tên sheet: khi đổi tên Sheet bên File A hoặc B hoặc cả 2 thì bạn xem chỗ màu đỏ trong code sẽ hiểu phải sửa như thế nào.

Thay đổi vùng dữ liệu bên File nguồn (File A): khi vùng dữ liệu của File nguồn khác với ví dụ này thì bạn sửa lại [Data_A$B8:D23] theo file nguồn của bạn. Ví dụ dữ liệu của bạn nằm trong vùng D5:F25 thì bạn sửa [Data_A$B8:D23]=[Data_A$D5:F25]

(nguyên văn là code của HLMT, tôi đổi lại tên sheet và vùng dữ liệu để làm ví dụ)

Mã:
Sub GhiDL_HLMT()
    Dim cn As Object
    Set cn = CreateObject("ADODB.Connection")
    With cn
        .ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
                            "data source=" & ThisWorkbook.Path & _
                            "\B.xls;extended properties=""excel 8.0;HDR=Yes;"";"
        .Open
        .Execute "INSERT INTO [[COLOR=#ff0000][B]Data_B[/B][/COLOR]$] SELECT STT,TEN,SL FROM [excel 8.0;database=" & _
                    ThisWorkbook.FullName & ";HDR=Yes].[[B][COLOR=#ff0000]Data_A[/COLOR][/B]$[B][COLOR=#ff0000]B8[/COLOR][/B]:D23]"
    End With
    cn.Close: Set cn = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh TrungChinhs.
Chắc anh hiểu nhầm ý em rồi. Ý em ở đây là mình thay đổi địa chỉ đầu ra của file B. Dùng code của thầy "Hai Lúa Miền Tây" thì khi chạy nó tự động đưa về vị trí ô A1 của file B. Ý em muốn ở đây là mình muốn ghi vào một vùng bất kỳ trên file B. (Chẳng hạn nằm đúng với vị trí giống như ở file A).
Cảm ơn anh đã đóng góp, mong nhận ý kiến phải hồi của anh.
 
Upvote 0
Cảm ơn anh TrungChinhs.
Chắc anh hiểu nhầm ý em rồi. Ý em ở đây là mình thay đổi địa chỉ đầu ra của file B. Dùng code của thầy "Hai Lúa Miền Tây" thì khi chạy nó tự động đưa về vị trí ô A1 của file B. Ý em muốn ở đây là mình muốn ghi vào một vùng bất kỳ trên file B. (Chẳng hạn nằm đúng với vị trí giống như ở file A).
Cảm ơn anh đã đóng góp, mong nhận ý kiến phải hồi của anh.
Bạn muốn chèn dữ liệu vào File B Tại vùng B8:D8 trở xuống thì tại B8:D8 tại file B bạn đặt tiêu đề STT,TEN,SL. Sau đó chạy Code anh HLMT.
 
Upvote 0
Cảm ơn anh TrungChinhs.
Chắc anh hiểu nhầm ý em rồi. Ý em ở đây là mình thay đổi địa chỉ đầu ra của file B. Dùng code của thầy "Hai Lúa Miền Tây" thì khi chạy nó tự động đưa về vị trí ô A1 của file B. Ý em muốn ở đây là mình muốn ghi vào một vùng bất kỳ trên file B. (Chẳng hạn nằm đúng với vị trí giống như ở file A).
Cảm ơn anh đã đóng góp, mong nhận ý kiến phải hồi của anh.

Tôi không hiểu nhầm ý bạn đâu hay nói cách khác là với cách này thì không thể. Vớí câu lệnh "INSERT INTO [Data_B$] SELECT STT,TEN,SL FROM [excel 8.0;database=..." nếu không tìm thấy các trường STT,TEN,SL bên File đích -file B (tức là nếu ta không nhập trước bên file B) thì code sẽ báo lỗi, nó khác hoàn toàn với copy - paste.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom