Ghi dữ liệu vào file excel đang đóng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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

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

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

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

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
Em nghĩ như thế này nếu đổi tên sheet như chú TrungChinhs vi dụ A.xls với sheet Data_A, B.xls với sheet Data_B thì code để ghi từ file B.xls sang file A.xls thì code như sau:
[GPECODE=vb]
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 & _
"\A.xls;extended properties=""excel 8.0;HDR=Yes;"";"
.Open
.Execute "INSERT INTO [Data_A$] SELECT STT,TEN,SL FROM [excel 8.0;database=" & _
ThisWorkbook.FullName & ";HDR=Yes].[Data_B$A1:C16]"
End With
cn.Close: Set cn = Nothing
End Sub


[/GPECODE]
 
Upvote 0
Nghĩa là đối với việc này ADO nó không cho phép phải không ạnh.
 
Upvote 0
Nghĩa là đối với việc này ADO nó không cho phép phải không ạnh.

Đúng vậy. Chính vì thế nên nhiều người mới dùng đến cách làm "ngầm" tức là mở file đích lên, dán vào vị trí tùy ý (như mong muốn của bạn) rồi đóng lại.
 
Upvote 0
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.
Cảm ơn anh, đúng là làm như vậy là sẽ xử lý được vấn đề của em rồi. Cho em hỏi thêm một câu nữa, Các tiêu đề STT, TEN,SL mình có set gì không? Hay là cứ đặt STT, TEN, SL là được. Nếu trong file đích có nhiều hơn 1 ký tự STT thì câu lệnh sẽ xử lý thế nào anh nhỉ.
 
Upvote 0
Cảm ơn anh, đúng là làm như vậy là sẽ xử lý được vấn đề của em rồi. Cho em hỏi thêm một câu nữa, Các tiêu đề STT, TEN,SL mình có set gì không? Hay là cứ đặt STT, TEN, SL là được. Nếu trong file đích có nhiều hơn 1 ký tự STT thì câu lệnh sẽ xử lý thế nào anh nhỉ.

Tốt nhất là nên tiếng Việt không dâu nếu lỡ có dùng TV có dấu thì nên insert thêm dòng rồi đánh TV không dấu để kết nối A.xls, B.xls thì trường 2 bên giống nhau tức là tiêu đề giống nhau và là duy nhất không trùng, nếu giống nhau và lỡ thích sài tiêu đề TV có dấu thì nên cho HDR=No dùng để dùng tên trường F1,F2,F3 .....
 
Upvote 0
Cảm ơn anh, đúng là làm như vậy là sẽ xử lý được vấn đề của em rồi. Cho em hỏi thêm một câu nữa, Các tiêu đề STT, TEN,SL mình có set gì không? Hay là cứ đặt STT, TEN, SL là được. Nếu trong file đích có nhiều hơn 1 ký tự STT thì câu lệnh sẽ xử lý thế nào anh nhỉ.
Để biết cách xử lý cho các trường hợp phát sinh bạn cần tìm hiểu ADO thì mới có thể tuỳ biến nhiều được.
Với câu hỏi của bạn mình dựa theo CODE anh HLMT trả lời như sau

Đoạn truy vấn
Mã:
        .Execute "INSERT INTO [Data_B$] SELECT [B]STT,TEN,SL [/B]FROM [excel 8.0;database=" & _
                    ThisWorkbook.FullName & ";[B]HDR=Yes[/B]].[Data_A$B8:D23]"

Đoạn in đậm có nghĩa là file A của bạn có tiêu đề gồm STT, TEN, SL. Dữ liệu được chèn vào file B dự theo cái tiêu đề này (HDR=Yes). => Như vậy để chèn vào File B thì bắt buộc tiêu đề file B phải giống hoàn toàn file A. Bạn cứ thử theo hướng này sẽ cho kết quả.
 
Upvote 0
Cảm ơn anh. Cái gì cũng phải có nguyên tắc của nó đúng không anh, nếu cứ bám theo hướng đó là xử lý được, không nên đặt ra những truờng hợp khó xử lý. ^^
Cảm ơn mọi người nhiều lắm.
 
Upvote 0
Cảm ơn anh. Cái gì cũng phải có nguyên tắc của nó đúng không anh, nếu cứ bám theo hướng đó là xử lý được, không nên đặt ra những truờng hợp khó xử lý. ^^
Cảm ơn mọi người nhiều lắm.
Tôt nhất bạn nên tìm hiểu các đề tài của anh HaiLuaMienTay có hướng dẫn và giải thích rất rõ ràng nếu chưa biết gì ADO chúc bạn thành công
 
Upvote 0
Cảm ơn bạn nrnhung49.
Mình tìm trong thớt học ADO của anh HLMT nhưng vẫn chưa tìm được cách để sửa câu truy vấn sao cho mỗi lần ghi là nó cập nhật lại dữ liệu thay cho dữ liệu cũ chứ không phải ghi bổ sung thêm. Trong trường hợp ví dụ của anh HLMT thì mỗi khi mình bấm ghi là nó ghi nối tiếp theo, dữ liệu cũ thì vẫn còn, dữ liệu mới ở bênh dưới dữ liệu cũ. Hay là phải dùng code để xoá dữ liệu trước đó, rồi sau đó mới ghi lại.
Mong bạn giải đáp giúp trường hợp hợp này nhé, cảm ơn bạn nhiều.
 
Upvote 0
Ah vậy là câu lệnh khác rồi bạn tìm hiểu lệnh update từ bài 101 nhen Bài tập về ADO căn bản.
Hihi. Kiểu này chắc em phải đọc lại từ bài 1 trong thớt của thầy HLMT quá. Thầy đưa ra có một yêu cầu, mà anh Viet Hoai đã xử luôn rồi, không ai hỏi tiếp về chủ đề update nữa. Bài tiếp theo là sắp xếp và xoá trong cơ sở dữ liệu. ^^
Do đọc nữa chừng cũng hơi khó để hiểu và theo kịp mọi người trong thớt. (ADO Căn bản mà cũng khó quá, vậy mới thấy được thầy HLMT và các anh chị trong diễn đàn mình giỏi quá).
 
Upvote 0
Trong hướng dẫn của thầy HLMT có nói cú pháp của lệnh Update:
1./ Cú pháp:

[GPECODE=sql]UPDATE [Tên Bảng] SET [Cột 1]=GiaTri_1, [Cột 2]=GiaTri_2, ...,[Cột n]=GiaTri_n
WHERE [Tên_Cột_Và_Điều_Kiện_Update][/GPECODE]
Trong trường hợp của em, em muốn update toàn bộ các giá trị như ví dụ của thấy HLMT, em set theo cú pháp hướng dẫn của thầy có phải là như vầy không anh nmhung49:
[GPECODE=sql]
Sub UDATE()
Dim lsSQL As String, cnn As Object, lrs As Object
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0;" & _
"data source=" & ThisWorkbook.Path & _
"\B.xls;extended properties=""excel 8.0;HDR=Yes;"";"
.Open
End With
lsSQL = "UPDATE [Data$] " & _
"SET [TEN], [SL] " & _
"WHERE [STT]"
lrs.Open lsSQL, cnn, 3, 1
Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]
Em không hiểu đoạn
Mã:
    lrs.Open lsSQL, cnn, 3, 1
trong bài gửi tại #105 của anh Viet Hoai ý nghĩa là gì anh nhỉ.
Mong nhận hồi đáp của anh và mọi người.
 
Lần chỉnh sửa cuối:
Upvote 0
Có thể do bài viết không đưa lên được các bài trong này nên chắc mọi người không để ý.
Nhờ các anh chị tư vấn giúp em thêm về trường hợp này nhé.
Cảm ơn anh chị nhiều.
 
Upvote 0
Có thể do bài viết không đưa lên được các bài trong này nên chắc mọi người không để ý.
Nhờ các anh chị tư vấn giúp em thêm về trường hợp này nhé.
Cảm ơn anh chị nhiều.

- Dùng update thì ít nhất file B phải có cái gì đó để làm điều kiện update chứ bạn.
- Các câu lệnh Update, Insert, Delete... Nói chung là những câu lệnh không trả về dòng nào thì ta không cần khởi tạo Recordset.
 
Lần chỉnh sửa cuối:
Upvote 1
- Dùng update thì ít nhất file B phải có cái gì đó để làm điều kiện update chứ bạn.
- Các câu lệnh Update, Insert, Delete... Nói chung là những câu lệnh không trả về dòng nào thì ta không cần khởi tạo Recordset.
Cảm ơn anh.
Như trong trường hợp của em, chỉ đơn giản là cập nhật dữ liệu, thay thế dữ liệu cũ, vị trí thì giống như vị trí cũ thì mình phải đặt điều kiện gì anh nhỉ?
Cảm ơn anh
 
Upvote 0
Thầy ơi, cũng là vd này nhưng chỉ ghi dòng mới nào có đặt nút "GHI DL SANG FILE B" thì nội dung của dòng đó trên file A được ghi vào file B thôi được không thầy.
Vì e muốn ứng dụng vào mỗi lần em nhập nội dung xuất kho cho NV KD tên A thì cuối dòng e để tên A và khi click vào tên A đó nội dung xuất kho được nhập vào công nợ cho NVKD A ( file công nợ của A này đang là file B trong VD của Thầy) .
Xin cảm ơn Thầy nhiều lắm a.
--------------------------------------------------------
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]
---------------------------------------------------------------------------------------
 
Upvote 0
Thầy ơi, cũng là vd này nhưng chỉ ghi dòng mới nào có đặt nút "GHI DL SANG FILE B" thì nội dung của dòng đó trên file A được ghi vào file B thôi được không thầy.
Vì e muốn ứng dụng vào mỗi lần em nhập nội dung xuất kho cho NV KD tên A thì cuối dòng e để tên A và khi click vào tên A đó nội dung xuất kho được nhập vào công nợ cho NVKD A ( file công nợ của A này đang là file B trong VD của Thầy) .
Xin cảm ơn Thầy nhiều lắm a.
--------------------------------------------------------

---------------------------------------------------------------------------------------
Bạn chịu khó gửi ví dụ xem sao nhé.
 
Upvote 0
Gởi thầy Fiile đính kèm. Thầy giúp dùm em nha. Cảm ơn thầy nhiều.
Bạn dùng code sau nhé.

Mã:
Sub GhiDL()
    Dim cn, rst As Object
    Dim arrNV As Variant
    Dim strFile As String
    Set cn = CreateObject("ADODB.Connection")
    Set rst = CreateObject("ADODB.Recordset")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0"
    rst.Open "select distinct NVKD from [XUAT KHO T#10$A3:M]", cn, 1
    arrNV = rst.GetRows()
    For i = 0 To rst.RecordCount - 1
       strFile = ThisWorkbook.Path & "\CONGNO-" & arrNV(0, i) & ".xlsx"
       cn.Close
       cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFile & ";Extended Properties=Excel 12.0")
       cn.Execute ("Insert Into [A:K] select TT,NgayCT,SoCT,KhachHang,MaHang,MatHang,DVT,SoLuong,DonGia,ThanhTien,GhiChu from [Excel 12.0;Database=" & ThisWorkbook.FullName & "].[XUAT KHO T#10$A3:M] where DaGhiDL is null and NVKD='" & arrNV(0, i) & "'")
    Next
    Sheet1.Range("M4:M" & Sheet1.Range("J65000").End(xlUp).Row) = "x"
End Sub
Lưu ý là Tên Sheet, Tiêu đề cột, tên file cần ghi phải theo mẫu đính kèm nhé.
 

File đính kèm

Upvote 0
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

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

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

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

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: 29
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
nếu muốn để file b ở folder khác và a ở folder khác thì code thay đổi như nào ạ
 
Upvote 0

Bài viết mới nhất

Back
Top Bottom