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
 
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).
Bạn ptlong04x1 cho mình hỏi có cách nào để copy vào nhiều file cùng 1 lúc không?
 
Upvote 0
Các anh chị cho em hỏi, các ví dụ trên đều là ghi dữ liệu vào file đóng cùng Folder, giờ ghi dữ liệu vào file đóng khác Folder thì chỉnh code làm sao ạ.
Của em file A là ở thư mục "TaiLieu", file B ở thư mục "Dulieuchiase" thế thì ghi dữ liệu từ file A vào file B đóng thì chỉnh code làm sao ạ. (hai file cùng cấu trúc, cùng tên file, cùng ổ D.)
 
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

Tôi đọc ví dụ của AC nhưng câu "hoàn toàn tương tự" có vẻ như quá khó, vui lòng hướng dẫn cụ thể ví dụ Cập nhật Dữ liệu ở A20 và A21 của file đang mở ghi vào ô D10, D11 của File đang đóng bằng VBA giúp tôi với.
 
Upvote 0
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
Hi anh! Và mọi người! có thể điều chỉnh giúp em theo nhu cầu thực tế được không ạ. Em có tìm hiểu về VBA, nhưng vì không chuyên em không sao điều chỉnh được ạ. Nội dung như sau ạ:
- em muốn ghi một vùng dữ liệu "M2 : P2" ở sheet "TIEN_DO" của file A sang vùng dữ liệu "M2 : P2" bên sheet " dulieu" của file B đồng thời hiển thị thời gian ghi dữ liệu và đường dẫn của file A ở vùng "Q2 : R2" sheet "dulieu" của file B .
- mỗi lần ghi dữ liệu từ file A sang file B thì dữ liệu mới nằm dưới dữ liệu cũ ( không xóa dữ liệu cũ)
Giúp em với ạ, em cảm ơn nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Hi anh! Và mọi người! có thể điều chỉnh giúp em theo nhu cầu thực tế được không ạ. Em có tìm hiểu về VBA, nhưng vì không chuyên em không sao điều chỉnh được ạ. Nội dung như sau ạ:
- em muốn ghi một vùng dữ liệu "M2 : P2" ở sheet "TIEN_DO" của file A sang vùng dữ liệu "M2 : P2" bên sheet " dulieu" của file B đồng thời hiển thị thời gian ghi dữ liệu và đường dẫn của file A ở vùng "Q2 : R2" sheet "dulieu" của file B .
- mỗi lần ghi dữ liệu từ file A sang file B thì dữ liệu mới nằm dưới dữ liệu cũ ( không xóa dữ liệu cũ)
Giúp em với ạ, em cảm ơn nhiều
Có lẽ ý tưởng mà mình nghĩ ra khó. Nhưng cũng hy vọng có anh chị nào thấy và giúp đỡ. Mình đang cố tìm cách rút ngắn thời gian làm việc với excel.
 
Upvote 0
Có lẽ ý tưởng mà mình nghĩ ra khó. Nhưng cũng hy vọng có anh chị nào thấy và giúp đỡ. Mình đang cố tìm cách rút ngắn thời gian làm việc với excel.
Sao rút ngắn thời gian làm việc với Excel?
Ở đây (forum) mọi người đều tăng thời gian làm việc với Exce để có kiến thức, kinh nghiệm

Muốn giúp gì thì đưa file lên thì mới cụ thể được, còn mô tả kiểu này thì mọi người chỉ đọc cho vui, sau đó có thể giúp bằng cách chỉ đường chung chung như sau:
Dùng VBA: không ghi được với ADO thì dùng cách workbooks.open mở file mà ghi rồi save vào là được
 
Upvote 0
Sao rút ngắn thời gian làm việc với Excel?
Ở đây (forum) mọi người đều tăng thời gian làm việc với Exce để có kiến thức, kinh nghiệm

Muốn giúp gì thì đưa file lên thì mới cụ thể được, còn mô tả kiểu này thì mọi người chỉ đọc cho vui, sau đó có thể giúp bằng cách chỉ đường chung chung như sau:
Dùng VBA: không ghi được với ADO thì dùng cách workbooks.open mở file mà ghi rồi save vào là được
Có thể dùng ADO để giải bài toán này không bạn?
 
Upvote 0
Sao rút ngắn thời gian làm việc với Excel?
Ở đây (forum) mọi người đều tăng thời gian làm việc với Exce để có kiến thức, kinh nghiệm

Muốn giúp gì thì đưa file lên thì mới cụ thể được, còn mô tả kiểu này thì mọi người chỉ đọc cho vui, sau đó có thể giúp bằng cách chỉ đường chung chung như sau:
Dùng VBA: không ghi được với ADO thì dùng cách workbooks.open mở file mà ghi rồi save vào là được
Anh hiểu nhầm ý mình rồi ạ. DO mình làm việc nhóm, mình muốn làm file tiến độ thực hiện để rút ngắn thời gian làm việc với excel ạ. Mình rất hào hứng khi tìm hiểu về VBA nên mình quyết định tìm hiểu để đáp ứng công việc và có cơ hội để học hỏi cố tìm cách giải quyết ý tưởng với VBA và khi được các anh chị giúp đỡ. Mình lang thang tìm giải pháp thích hợp thì thấy có code của anh ptlong04x1 thích hợp với yêu cầu bản thân đặt ra là: Từ "file A" thành viên nhóm sẽ ghi tiến độ thực hiện vào " File B" mà không cần mở " file B", nội dung như sau ạ:
- em muốn ghi một vùng dữ liệu "M2 : Q2" ở sheet "TIEN_DO" của file A sang vùng dữ liệu "M2 : Q2" bên sheet " dulieu" của file B đồng thời hiển thị thời gian ghi dữ liệu và đường dẫn của file A ở vùng "R2 : S2" sheet "dulieu" của file B .
- mỗi lần ghi dữ liệu từ file A sang file B thì dữ liệu mới nằm dưới dữ liệu cũ ( không xóa dữ liệu cũ), nếu file B đang đóng thì mở file B ghi dữ liệu rồi đóng, nếu file B đang mở thì ghi dữ liệu mà không đóng file B .
cảm ơn vì đã quan tâm của mọi người ạ
 

File đính kèm

  • FILE A.xlsm
    21.6 KB · Đọc: 7
  • FILE B.xlsm
    33.5 KB · Đọc: 7
Upvote 0
Dạ. Em ghi nhầm ạ. Từ M2 : q2 ạ
Dùng thử code sau nhé:

Mã:
Sub GhiDL_HLMT()
    Dim strFileA As String, strFileB As String
    strFileA = ThisWorkbook.FullName
    strFileB = ThisWorkbook.Path & "\File B.xlsm"
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileB & ";Extended Properties=""Excel 12.0;HDR=No"""
        .Execute ("Insert Into [dulieu$M2:S] Select F1,F2,F3,F4,F5,NOW() as F6,'" & strFileA & "' as F7 FROM [EXCEL 12.0;HDR=No;Database=" & strFileA & "].[TIEN_DO$M2:Q2] ")
    End With
End Sub
 

File đính kèm

  • CapNhat.rar
    45.1 KB · Đọc: 32
Upvote 0
Dùng thử code sau nhé:

Mã:
Sub GhiDL_HLMT()
    Dim strFileA As String, strFileB As String
    strFileA = ThisWorkbook.FullName
    strFileB = ThisWorkbook.Path & "\File B.xlsm"
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileB & ";Extended Properties=""Excel 12.0;HDR=No"""
        .Execute ("Insert Into [dulieu$M2:S] Select F1,F2,F3,F4,F5,NOW() as F6,'" & strFileA & "' as F7 FROM [EXCEL 12.0;HDR=No;Database=" & strFileA & "].[TIEN_DO$M2:Q2] ")
    End With
End Sub
Dạ. em cảm ơn nhiều. Em sẽ xem rồi báo lại ạ
 
Upvote 0
Dạ. em cảm ơn nhiều. Em sẽ xem rồi báo lại ạ
Thật tuyêt! code chạy ổn ạ, em đã mất hơn 15 đêm làm và nghiên cứu mà ko có kết quả. Vì em đang giai đoạn bắt đầu thực hiện ý tưởng nên có phát sinh thêm chút nữa ạ. Có thể giúp em thêm chứ, em sẽ rất cảm kích vì điều này. Em có ghi cụ thể trong 2 file em gửi kèm. Sơ bộ như sau:
- em điều chỉnh vùng dữ liệu của file nhận ( vị trí cột) , chỉ thay đổi cột trong code. nhưng qua file nhận " file B" dữ liệu nó cách hàng đầu tiên tới 20 hàng chứ không như ban đầu Anh code giúp.
- Vì file B ( file chính) nó nằm ở vị trí khác cùng mạng, và đổi tên theo dự án. Làm sao để cho phép chọn file chứa dữ liệu ghi "file B" trước khi ghi dữ liệu .
- Ghi dữ liệu vào file B với điều kiện ( nếu ở ô L2 ở file A là "a" thì ghi dữ liệu vào vùng có điều kiện :"a" ở sheet "dulieu" của file B.
- Đây là cơ hội tốt để em tìm hiểu chuyên sâu về excel, Anh có thể giải thích giúp em về code đã viết được không ạ
Em có gửi kèm file và ghi rõ nội dung trong file ạ.
 

File đính kèm

  • CapNhat-v1.rar
    50.4 KB · Đọc: 8
Upvote 0
Thật tuyêt! code chạy ổn ạ, em đã mất hơn 15 đêm làm và nghiên cứu mà ko có kết quả. Vì em đang giai đoạn bắt đầu thực hiện ý tưởng nên có phát sinh thêm chút nữa ạ. Có thể giúp em thêm chứ, em sẽ rất cảm kích vì điều này. Em có ghi cụ thể trong 2 file em gửi kèm. Sơ bộ như sau:
(1) - em điều chỉnh vùng dữ liệu của file nhận ( vị trí cột) , chỉ thay đổi cột trong code. nhưng qua file nhận " file B" dữ liệu nó cách hàng đầu tiên tới 20 hàng chứ không như ban đầu Anh code giúp.
(2) - Vì file B ( file chính) nó nằm ở vị trí khác cùng mạng, và đổi tên theo dự án. Làm sao để cho phép chọn file chứa dữ liệu ghi "file B" trước khi ghi dữ liệu .
(3) - Ghi dữ liệu vào file B với điều kiện ( nếu ở ô L2 ở file A là "a" thì ghi dữ liệu vào vùng có điều kiện :"a" ở sheet "dulieu" của file B.
(4) - Đây là cơ hội tốt để em tìm hiểu chuyên sâu về excel, Anh có thể giải thích giúp em về code đã viết được không ạ
Em có gửi kèm file và ghi rõ nội dung trong file ạ.
(1) Xóa cả dòng từ dưới tiêu đề cột đến dòng 20. Lưu ý là phải xóa bằng cách delete entire row nhé.
(2) Chịu khó tìm kiếm cách dùng Open FileDialog
Ví dụ ráp code sau vào:

Mã:
Sub test()
    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .Filters.Clear
        .Title = "Select an Excel File"
        .Filters.Add "Excel Files", "*.xls*", 1
        .AllowMultiSelect = False
        Dim sFile As String
        If .Show = True Then
            sFile = .SelectedItems(1)
        End If
    End With
    MsgBox sFile
End Sub
(3) Không thể ghi dữ liệu trên cùng 1 bảng tính với nhiều bảng dữ liệu như bạn quy định ngoại trừ cách đặt name.

Code như sau:
Mã:
Sub GhiDL_HLMT()
    Dim strFileA As String, strFileB As String
    strFileA = ThisWorkbook.FullName
    strFileB = ThisWorkbook.Path & "\File B.xlsm"
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileB & ";Extended Properties=""Excel 12.0;HDR=No"""
        .Execute ("Insert Into [" & Sheets("TIEN_DO").Range("L2") & "] Select F1,F2,F3,F4,F5,NOW() as F6,'" & strFileA & "' as F7 FROM [EXCEL 12.0;HDR=No;Database=" & strFileA & "].[TIEN_DO$M2:Q2] ")
    End With
End Sub

(4) Hãy tập đọc và viết nhiều hơn nữa để tích lũy kinh nghiệm nhé.

Riêng mục (2) hãy tự thân vận động mới mau tiến bộ nhé.
 

File đính kèm

  • CapNhat_HLMT.rar
    49.4 KB · Đọc: 34
Upvote 0
(1) Xóa cả dòng từ dưới tiêu đề cột đến dòng 20. Lưu ý là phải xóa bằng cách delete entire row nhé.
(2) Chịu khó tìm kiếm cách dùng Open FileDialog
Ví dụ ráp code sau vào:

Mã:
Sub test()
    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .Filters.Clear
        .Title = "Select an Excel File"
        .Filters.Add "Excel Files", "*.xls*", 1
        .AllowMultiSelect = False
        Dim sFile As String
        If .Show = True Then
            sFile = .SelectedItems(1)
        End If
    End With
    MsgBox sFile
End Sub
(3) Không thể ghi dữ liệu trên cùng 1 bảng tính với nhiều bảng dữ liệu như bạn quy định ngoại trừ cách đặt name.

Code như sau:
Mã:
Sub GhiDL_HLMT()
    Dim strFileA As String, strFileB As String
    strFileA = ThisWorkbook.FullName
    strFileB = ThisWorkbook.Path & "\File B.xlsm"
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileB & ";Extended Properties=""Excel 12.0;HDR=No"""
        .Execute ("Insert Into [" & Sheets("TIEN_DO").Range("L2") & "] Select F1,F2,F3,F4,F5,NOW() as F6,'" & strFileA & "' as F7 FROM [EXCEL 12.0;HDR=No;Database=" & strFileA & "].[TIEN_DO$M2:Q2] ")
    End With
End Sub

(4) Hãy tập đọc và viết nhiều hơn nữa để tích lũy kinh nghiệm nhé.

Riêng mục (2) hãy tự thân vận động mới mau tiến bộ nhé.
Vâng. Em rất cảm kích. Sẽ cố gắng với tiêu chí gian nan không nản. Cảm ơn ạ.
 
Upvote 0
Vâng. Em rất cảm kích. Sẽ cố gắng với tiêu chí gian nan không nản. Cảm ơn ạ.
Theo tôi thì bạn nên cho vào 1 bảng dữ liệu, không nên tách ra thành nhiều bảng. Trong bảng dữ liệu đó thêm 1 cột để ghi thông tin tên danh mục của các bảng đó. Như vậy dữ liệu sẽ mạch lạc hơn.
 
Upvote 0
Theo tôi thì bạn nên cho vào 1 bảng dữ liệu, không nên tách ra thành nhiều bảng. Trong bảng dữ liệu đó thêm 1 cột để ghi thông tin tên danh mục của các bảng đó. Như vậy dữ liệu sẽ mạch lạc hơn.
Cảm ơn anh góp ý thêm. Có lẻ em sẽ xem sét vấn đề này sau khi em ghép được cái sub tìm file đích "file b" vào sub ghi dữ liệu. Em nghĩ chắc lâu
1f60a.png
. vì em loay từ trưa giờ mà ko có kết quả.
 
Upvote 0
(1) Xóa cả dòng từ dưới tiêu đề cột đến dòng 20. Lưu ý là phải xóa bằng cách delete entire row nhé.
(2) Chịu khó tìm kiếm cách dùng Open FileDialog
Ví dụ ráp code sau vào:

Mã:
Sub test()
    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .Filters.Clear
        .Title = "Select an Excel File"
        .Filters.Add "Excel Files", "*.xls*", 1
        .AllowMultiSelect = False
        Dim sFile As String
        If .Show = True Then
            sFile = .SelectedItems(1)
        End If
    End With
    MsgBox sFile
End Sub
(3) Không thể ghi dữ liệu trên cùng 1 bảng tính với nhiều bảng dữ liệu như bạn quy định ngoại trừ cách đặt name.

Code như sau:
Mã:
Sub GhiDL_HLMT()
    Dim strFileA As String, strFileB As String
    strFileA = ThisWorkbook.FullName
    strFileB = ThisWorkbook.Path & "\File B.xlsm"
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileB & ";Extended Properties=""Excel 12.0;HDR=No"""
        .Execute ("Insert Into [" & Sheets("TIEN_DO").Range("L2") & "] Select F1,F2,F3,F4,F5,NOW() as F6,'" & strFileA & "' as F7 FROM [EXCEL 12.0;HDR=No;Database=" & strFileA & "].[TIEN_DO$M2:Q2] ")
    End With
End Sub

(4) Hãy tập đọc và viết nhiều hơn nữa để tích lũy kinh nghiệm nhé.

Riêng mục (2) hãy tự thân vận động mới mau tiến bộ nhé.
Hi anh. Anh không phiền nếu tiếp tục giúp em chứ ạ. Em có gửi ảnh đính kèm, ANh xem và giúp em với
 

File đính kèm

  • hoibai.jpg
    hoibai.jpg
    89 KB · Đọc: 26
Upvote 0
Hi anh. Anh không phiền nếu tiếp tục giúp em chứ ạ. Em có gửi ảnh đính kèm, ANh xem và giúp em với
Đưa 2 dòng code sau lên trên cùng Module1
Mã:
Option Explicit
Public strFileB As String

Chép code sau vào Module1
Mã:
Sub DuongDan()
    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .Filters.Clear
        .Title = "Select an Excel File"
        .Filters.Add "Excel Files", "*.xls*", 1
        .AllowMultiSelect = False
        If .Show = True Then
            strFileB = .SelectedItems(1)
        End If
    End With
End Sub

Cuối cùng cũng chép code sau và chạy nó.
Mã:
Sub GhiDL_HLMT()
    Dim strFileA As String
    If Len(strFileB) = 0 Then
        Call DuongDan
    End If
    strFileA = ThisWorkbook.FullName
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileB & ";Extended Properties=""Excel 12.0;HDR=No"""
        .Execute ("Insert Into [" & Sheets("TIEN_DO").Range("L2") & "] Select F1,F2,F3,F4,F5,NOW() as F6,'" & strFileA & "' as F7 FROM [EXCEL 12.0;HDR=No;Database=" & strFileA & "].[TIEN_DO$M2:Q2] ")
    End With
End Sub
 
Upvote 0
Đưa 2 dòng code sau lên trên cùng Module1
Mã:
Option Explicit
Public strFileB As String

Chép code sau vào Module1
Mã:
Sub DuongDan()
    Dim fd As Office.FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .Filters.Clear
        .Title = "Select an Excel File"
        .Filters.Add "Excel Files", "*.xls*", 1
        .AllowMultiSelect = False
        If .Show = True Then
            strFileB = .SelectedItems(1)
        End If
    End With
End Sub

Cuối cùng cũng chép code sau và chạy nó.
Mã:
Sub GhiDL_HLMT()
    Dim strFileA As String
    If Len(strFileB) = 0 Then
        Call DuongDan
    End If
    strFileA = ThisWorkbook.FullName
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileB & ";Extended Properties=""Excel 12.0;HDR=No"""
        .Execute ("Insert Into [" & Sheets("TIEN_DO").Range("L2") & "] Select F1,F2,F3,F4,F5,NOW() as F6,'" & strFileA & "' as F7 FROM [EXCEL 12.0;HDR=No;Database=" & strFileA & "].[TIEN_DO$M2:Q2] ")
    End With
End Sub
Help! Em đã học được rất nhiều và đang hoàn thành ý tưởng của mình nhờ sự giúp đỡ của anh, vấn đề của em vướng phải bây giờ là khi đưa file lên ondriver để mọi người dùng chung. lấy fileA ghi vào fileB thì nhận thông báo lỗi như hình đính kèm. Em không biết lý do vì sao. Em lang thang khắp các diễn đàn, có nhiều hướng hướng dẫn, mà vì mới nghiên cứu nên em chưa hiểu hết và áp dụng, ráp vào code mà anh đã chỉ giúp. Anh có thể giúp đỡ thêm vấn đề này được không ạ.
Bài đã được tự động gộp:

Help! Em đã học được rất nhiều và đang hoàn thành ý tưởng của mình nhờ sự giúp đỡ của anh, vấn đề của em vướng phải bây giờ là khi đưa file lên ondriver để mọi người dùng chung. lấy fileA ghi vào fileB thì nhận thông báo lỗi như hình đính kèm. Em không biết lý do vì sao. Em lang thang khắp các diễn đàn, có nhiều hướng hướng dẫn, mà vì mới nghiên cứu nên em chưa hiểu hết và áp dụng, ráp vào code mà anh đã chỉ giúp. Anh có thể giúp đỡ thêm vấn đề này được không ạ.
Có cách nào để mình dùng được trên ondriver không ạ. Nếu ở trên onedriver từ fileA cho chọn tìm fileB mà vẫn dùng được, nếu ở máy tính cục bộ vẫn cho duyệt tìm fileB và dùng được. Do tụi em làm việc nhóm bằng ondriver, làm việc từ xa.
 

File đính kèm

  • 1.jpg
    1.jpg
    15.5 KB · Đọc: 12
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom