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

hanhpptc

Thành viên tiêu biểu
Tham gia ngày
16 Tháng năm 2008
Bài viết
457
Được thích
320
Điểm
710
Tuổi
49
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
 

hanhpptc

Thành viên tiêu biểu
Tham gia ngày
16 Tháng năm 2008
Bài viết
457
Được thích
320
Điểm
710
Tuổi
49
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
 

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia ngày
18 Tháng ba 2008
Bài viết
7,386
Được thích
14,280
Điểm
1,910
Nơi ở
Tp.HCM
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

TrungChinhs

Thành viên tích cực
Tham gia ngày
18 Tháng hai 2008
Bài viết
1,478
Được thích
2,454
Điểm
860
Nơi ở
Mường La, Sơn La
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.
 

ptlong04x1

Thành viên tích cực
Tham gia ngày
15 Tháng mười 2008
Bài viết
1,031
Được thích
1,524
Điểm
860
Tuổi
35
@ 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

TrungChinhs

Thành viên tích cực
Tham gia ngày
18 Tháng hai 2008
Bài viết
1,478
Được thích
2,454
Điểm
860
Nơi ở
Mường La, Sơn La
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. Cảm ơn!
 

ptlong04x1

Thành viên tích cực
Tham gia ngày
15 Tháng mười 2008
Bài viết
1,031
Được thích
1,524
Điểm
860
Tuổi
35
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:

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,893
Được thích
23,493
Điểm
1,860
Nơi ở
Hà Nội
Để 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.
 

ptlong04x1

Thành viên tích cực
Tham gia ngày
15 Tháng mười 2008
Bài viết
1,031
Được thích
1,524
Điểm
860
Tuổi
35
@ 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

  • 25 KB Đọc: 112
Lần chỉnh sửa cuối:

TrungChinhs

Thành viên tích cực
Tham gia ngày
18 Tháng hai 2008
Bài viết
1,478
Được thích
2,454
Điểm
860
Nơi ở
Mường La, Sơn La
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.

 

thanchetvnt

Thành viên chính thức
Tham gia ngày
28 Tháng bảy 2008
Bài viết
68
Được thích
21
Điểm
670
Tuổi
41
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.
 

ptlong04x1

Thành viên tích cực
Tham gia ngày
15 Tháng mười 2008
Bài viết
1,031
Được thích
1,524
Điểm
860
Tuổi
35
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:

vba_gpe

Thành viên thường trực
Tham gia ngày
15 Tháng mười hai 2010
Bài viết
276
Được thích
43
Điểm
385
Nơi ở
Bốn bể là nhà
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:

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia ngày
18 Tháng ba 2008
Bài viết
7,386
Được thích
14,280
Điểm
1,910
Nơi ở
Tp.HCM
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

vba_gpe

Thành viên thường trực
Tham gia ngày
15 Tháng mười hai 2010
Bài viết
276
Được thích
43
Điểm
385
Nơi ở
Bốn bể là nhà
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:

TrungChinhs

Thành viên tích cực
Tham gia ngày
18 Tháng hai 2008
Bài viết
1,478
Được thích
2,454
Điểm
860
Nơi ở
Mường La, Sơn La
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:

vba_gpe

Thành viên thường trực
Tham gia ngày
15 Tháng mười hai 2010
Bài viết
276
Được thích
43
Điểm
385
Nơi ở
Bốn bể là nhà
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.
 

dhn46

Hướng tới tương lai
Tham gia ngày
1 Tháng ba 2011
Bài viết
3,246
Được thích
3,831
Điểm
560
Nơi ở
Hải Phòng
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.
 

TrungChinhs

Thành viên tích cực
Tham gia ngày
18 Tháng hai 2008
Bài viết
1,478
Được thích
2,454
Điểm
860
Nơi ở
Mường La, Sơn La
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:
Top Bottom