Chia sẻ Code Import/Export Data từ Excel đến Excel

Liên hệ QC

BigBang007

Thành viên mới
Tham gia
29/5/14
Bài viết
17
Được thích
9
Hi Các Bác,
Sau khi sưu tầm và chỉnh sửa code, hôm nay mình xin tổng hợp lại code dùng để Nhập và Xuất (Import / Export) dữ liệu từ 1 Excel đến file Excel khác.

1. Code Nhập dữ liệu từ file excel khác, không cần mở file.

Code này sưu tầm từ Bác nmhung49:

Chú ý: nếu file bạn liên kết đến mà không đặt Password thì phần Password trong code để trống nha.

Mã:
Sub connect_file()
Dim fname
On Error Resume Next
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
fname = Application.GetOpenFilename("Excel Files (*.xls*), *.xls")
With Workbooks.Open(fname, , , , "password") ' PW can dat trong dau ngoac kep, neu ko co password thi de trong
    Sheets("Sheet1").Range("A4:D20000").Copy ThisWorkbook.Sheets("Sheet2").Range("A4")
    .Close False
End With
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

2. Code Xuất dữ liệu từ ra file excel khác.

Code này mình tham khảo nhiều nơi và viết lại, do trình độ VBA yếu kém, nên chỉ viết cho nó chạy thôi, không phải là Code hay.

Mã:
Sub ExportRangetoFile()
Dim wb As Workbook
Dim saveFile As String
Dim WorkRng As Range
On Error Resume Next
xTitleId = "ExportDataExcelToExcel"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set wb = Application.Workbooks.Add
WorkRng.Copy
wb.Worksheets("Sheet1").Paste
saveFile = Application.GetSaveAsFilename(fileFilter:="Excel files (*.xls*),*.xls")
wb.SaveAs Filename:=saveFile, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
wb.Close
Application.CutCopyMode = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

2 code này bạn bỏ vào Module và chạy nhé.

Nếu các Bác có code hay hơn thì chia sẽ để mình học hỏi thêm nha.
 
Với code này:
Mã:
Sub connect_file()
................................
With [COLOR=#ff0000]Workbooks.Open[/COLOR](fname, , , , "password") 
.................................
End Sub
Mà bạn nói không cần mở file sao?
1. Code Nhập dữ liệu từ file excel khác, không cần mở file

.
 
Upvote 0
Hi Các Bác,
Sau khi sưu tầm và chỉnh sửa code, hôm nay mình xin tổng hợp lại code dùng để Nhập và Xuất (Import / Export) dữ liệu từ 1 Excel đến file Excel khác.

1. Code Nhập dữ liệu từ file excel khác, không cần mở file.

Code này sưu tầm từ Bác nmhung49:

Chú ý: nếu file bạn liên kết đến mà không đặt Password thì phần Password trong code để trống nha.

Mã:
Sub connect_file()
Dim fname
On Error Resume Next
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
fname = Application.GetOpenFilename("Excel Files (*.xls*), *.xls")
With Workbooks.Open(fname, , , , "password") ' PW can dat trong dau ngoac kep, neu ko co password thi de trong
    Sheets("Sheet1").Range("A4:D20000").Copy ThisWorkbook.Sheets("Sheet2").Range("A4")
    .Close False
End With
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub

2. Code Xuất dữ liệu từ ra file excel khác.

Code này mình tham khảo nhiều nơi và viết lại, do trình độ VBA yếu kém, nên chỉ viết cho nó chạy thôi, không phải là Code hay.

Mã:
Sub ExportRangetoFile()
Dim wb As Workbook
Dim saveFile As String
Dim WorkRng As Range
On Error Resume Next
xTitleId = "ExportDataExcelToExcel"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set wb = Application.Workbooks.Add
WorkRng.Copy
wb.Worksheets("Sheet1").Paste
saveFile = Application.GetSaveAsFilename(fileFilter:="Excel files (*.xls*),*.xls")
wb.SaveAs Filename:=saveFile, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
wb.Close
Application.CutCopyMode = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

2 code này bạn bỏ vào Module và chạy nhé.

Nếu các Bác có code hay hơn thì chia sẽ để mình học hỏi thêm nha.

Code nhập và xuất dữ liệu ra file khác mà không cần mở file thì bạn nên tìm và đọc thêm về ADO nhé.
 
Upvote 0
Với code này:
Mã:
Sub connect_file()
................................
With [COLOR=#ff0000]Workbooks.Open[/COLOR](fname, , , , "password") 
.................................
End Sub
Mà bạn nói không cần mở file sao?
Dạ, ở đây ý em là: Nếu File A cần lấy dữ liệu từ File B thì chỉ cần mở file A, chạy Code và chọn file B(tại hộp thoại Open). thế là xong, không cần phải mở File B lên.

Code em đưa lên là đã test rồi ạ, chạy OK em mới gửi lên.
 
Upvote 0
Dạ, ở đây ý em là: Nếu File A cần lấy dữ liệu từ File B thì chỉ cần mở file A, chạy Code và chọn file B(tại hộp thoại Open). thế là xong, không cần phải mở File B lên.

Code em đưa lên là đã test rồi ạ, chạy OK em mới gửi lên.

Code trên tuy bạn không trực tiếp mở file nhưng code nó mở. Nếu muốn sử dụng code mà không mở file thì dùng ADO
 
Upvote 0
Code trên tuy bạn không trực tiếp mở file nhưng code nó mở. Nếu muốn sử dụng code mà không mở file thì dùng ADO

Nếu nói chính xác thì làm gì có chuyện "không mở file". Notepad, Paint, Access, Excel, Word ... muốn lấy dữ liệu đề phải "mở" file. Mở không hiển thị hay mở và hiển thị thì lại là chuyện khác. Tập tin là chuỗi bai trên đĩa, phải đọc vào RAM chứ lấy dữ liệu từ đâu?
------------
Mở ngầm thì đúng hơn. Vì thậm chí code Excel mở thì vẫn thấy "nháy" tập tin được mở và "nháy" tập tin được đóng. Còn "cách kia" thì user "không cảm nhận được gì"
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu nói chính xác thì làm gì có chuyện "không mở file". Notepad, Paint, Access, Excel, Word ... muốn lấy dữ liệu đề phải "mở" file. Mở không hiển thị hay mở và hiển thị thì lại là chuyện khác. Tập tin là chuỗi bai trên đĩa, phải đọc vào RAM chứ lấy dữ liệu từ đâu?
------------
Mở ngầm thì đúng hơn. Vì thậm chí code Excel mở thì vẫn thấy "nháy" tập tin được mở và "nháy" tập tin được đóng. Còn "cách kia" thì user "không cảm nhận được gì"

Nói vậy xin hỏi là khi ta kết nối với 1 CSDL nào đó thông qua đường truyền internet chẳng hạn thì ta cũng gọi là mở file? Em nghĩ mở file và mở kết nối thì nó khác nhau chứ phải không anh?
 
Upvote 0
Theo điều kiện lý tưởng thì một tiện ích "đọc" dữ liệu phải có tuỳ chọn đọc một copy của dữ liệu lúc kết nối connection. Khi ấy nó có thể đọc mà không cần mở (nó mở cái copy trong cache của nó). Nhưng tôi chưa đọc được tài liệu này cho nên không biết làm, và cũng chưa chắc điều kiện lý tuởng này đã hiện hữu.

Làm thử 1 sub mở connecion với một file, treo đó, khoan đóng connection. Qua Win Explorer xoá thử file sẽ thấy nó báo là file đang bị mở. Trở lại sub và chạy qua phần đóng connection. Trở lại Win Explorer để Retry sẽ thấy nó cho xoá.
 
Upvote 0
Theo điều kiện lý tưởng thì một tiện ích "đọc" dữ liệu phải có tuỳ chọn đọc một copy của dữ liệu lúc kết nối connection. Khi ấy nó có thể đọc mà không cần mở (nó mở cái copy trong cache của nó). Nhưng tôi chưa đọc được tài liệu này cho nên không biết làm, và cũng chưa chắc điều kiện lý tuởng này đã hiện hữu.

Làm thử 1 sub mở connecion với một file, treo đó, khoan đóng connection. Qua Win Explorer xoá thử file sẽ thấy nó báo là file đang bị mở. Trở lại sub và chạy qua phần đóng connection. Trở lại Win Explorer để Retry sẽ thấy nó cho xoá.

Nhưng hãy thử với SQLServer hay là gì đó ta có thể mở hay xóa bình thường cho dù đã được kết nối vào hay chưa.
 
Upvote 0
Nói vậy xin hỏi là khi ta kết nối với 1 CSDL nào đó thông qua đường truyền internet chẳng hạn thì ta cũng gọi là mở file? Em nghĩ mở file và mở kết nối thì nó khác nhau chứ phải không anh?

Khi bạn tạo kết nối thì ADO liên hệ với CSDL này để xin kết nối. Bởi vậy có cái phần "Provider".

Những CSDL hạng gộc (như SQL Server chẳng hạn) thì chúng có sẵn mấy cửa ngõ cho các phần mềm phác như ADO kết nối vào. Nếu qua Internet thì giao diện do máy chủ (DBase Server) phối hợp với OLEDB và SQL Server mà tạo giao diện cho ADO. Lưu ý là ADO không thể tự ý đi thẳng vào vùng chứa dữ liệu. SQL Server phải đang chạy và phải cho phép kết nối. Tất cả những gì VBA+ADO truy cập được từ bảng nào của SQL Server đều do SQL Server cung cấp. Người chủ CSDL đã định sẵn quyền hạn và pham vi truy cập cho mỗi loại kết nối.

Những loại khác (như Excel chẳng hạn) thì ADO phải sử dụng cái cổ máy JET hoăc ACCESS để truy cập file. Nếu qua Internet thì file phải nằm trong các thư mục cho phép "share" (luật của mạng: nếu không có share thì không thể nào truy cập). Trong trường hợp này, ADO sẽ đi thẳng vào vùng chứa dữ liệu của file (nếu file không có password). Vì file chỉ là một hệ thống dữ liệu phẳng cho nên ADO sau khi kết nối xong, có toàn quyền muốn làm gì thì làm.
 
Lần chỉnh sửa cuối:
Upvote 0
Nói vậy xin hỏi là khi ta kết nối với 1 CSDL nào đó thông qua đường truyền internet chẳng hạn thì ta cũng gọi là mở file? Em nghĩ mở file và mở kết nối thì nó khác nhau chứ phải không anh?

Thì tôi nói

Chẳng qua buồn thì đôi co thôi. Người ta nói là "kiểu thói xấu bắt bẻ từng câu".

Tất nhiên kết nối hay không thì cuối cùng "một cái gì đó" sẽ được "chạy" và cái đó sẽ đọc dữ liệu từ tập tin. Tập tin được ghi trên đĩa local hoặc server và phải có cái gì đấy "mở" ra và đọc nội dung.

Ta không mở thì ta viết code đặt đơn và cái gì đấy sẽ mở và trả về kết quả. Tập tin vẫn được mở nhưng không phải là ta mở.

Gọi là "kiểu thói xấu ..." thôi.
 
Upvote 0
Theo điều kiện lý tưởng thì một tiện ích "đọc" dữ liệu phải có tuỳ chọn đọc một copy của dữ liệu lúc kết nối connection. Khi ấy nó có thể đọc mà không cần mở (nó mở cái copy trong cache của nó). Nhưng tôi chưa đọc được tài liệu này cho nên không biết làm, và cũng chưa chắc điều kiện lý tuởng này đã hiện hữu.

Nếu tập tin chưa được mở thì nó chỉ tồn tại trên đĩa, làm gì có trong RAM trong cache nào?

Làm thử 1 sub mở connecion với một file, treo đó, khoan đóng connection. Qua Win Explorer xoá thử file sẽ thấy nó báo là file đang bị mở. Trở lại sub và chạy qua phần đóng connection. Trở lại Win Explorer để Retry sẽ thấy nó cho xoá.

Bạn cũng có thể viết code như thế, chuyên nhỏ. Có nhiều kiểu.

Sau khi nhấn Button1 thì không thể xóa được tập tin "C:\hichic.txt", thậm chí đúp chuột cũng không mở được. Notepad báo là: "Tôi bó tay". Sau khi nhấn Button2 thì tập tin được đóng và xóa được hichic.txt

Mã:
Private Const GENERIC_READ As Long = &H80000000
Private Const OPEN_EXISTING As Long = 3
Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80
Private Const PAGE_READWRITE As Long = &H4
Private Const FILE_MAP_ALL_ACCESS As Long = &HF001F

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CreateFileMapping Lib "kernel32.dll" Alias "CreateFileMappingA" (ByVal hFile As Long, ByRef lpFileMappigAttributes As SECURITY_ATTRIBUTES, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long
Private Declare Function MapViewOfFile Lib "kernel32.dll" (ByVal hFileMappingObject As Long, ByVal dwDesiredAccess As Long, ByVal dwFileOffsetHigh As Long, ByVal dwFileOffsetLow As Long, ByVal dwNumberOfBytesToMap As Long) As Long
Private Declare Function UnmapViewOfFile Lib "kernel32.dll" (ByRef lpBaseAddress As Any) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

Private hFile As Long, hMapFile As Long, lpMapAddress As Long

Sub Button1_Click()
Dim sa As SECURITY_ATTRIBUTES
    hFile = CreateFile("c:\hichic.txt", GENERIC_READ, 0, sa, OPEN_EXISTING, _
            FILE_ATTRIBUTE_NORMAL, 0)
    hMapFile = CreateFileMapping(hFile, sa, PAGE_READWRITE, 0, 0, "MyFileMappingObject")
    
    If hMapFile <> 0 Then
        lpMapAddress = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0)
    End If
End Sub

Sub Button2_Click()
    UnmapViewOfFile ByVal lpMapAddress
    CloseHandle hMapFile
    CloseHandle hFile
End Sub
 

File đính kèm

  • delete denied.xlsm
    15.6 KB · Đọc: 25
Lần chỉnh sửa cuối:
Upvote 0
Hi Các Bác. Cảm ơn các Bác đã tranh luận.
Vì 2 câu "không cần mở file" mà các Bác cải nhau ghê quá, vì trong lĩnh vực VBA này, em là người mới level 0.5. Do đó em thấy không cần mở file đó lên thì em nói ko cần mở file theo đúng nghĩa đen, còn các Bác là Cao thủ rồi sẽ có nhìn nhận khác. kiểu như Bác học và học sinh tiểu học.

Mục đích em post lên 2 phần này để giúp các bạn có yêu cầu đơn giản, có thể áp dụng theo code của em. Còn yêu cầu cao hơn thì nhờ tới các Bác vậy.
 
Upvote 0
Hi Các Bác. Cảm ơn các Bác đã tranh luận.
Vì 2 câu "không cần mở file" mà các Bác cải nhau ghê quá, vì trong lĩnh vực VBA này, em là người mới level 0.5. Do đó em thấy không cần mở file đó lên thì em nói ko cần mở file theo đúng nghĩa đen, còn các Bác là Cao thủ rồi sẽ có nhìn nhận khác. kiểu như Bác học và học sinh tiểu học.

Mục đích em post lên 2 phần này để giúp các bạn có yêu cầu đơn giản, có thể áp dụng theo code của em. Còn yêu cầu cao hơn thì nhờ tới các Bác vậy.

Đây là diễn đàn học hỏi. Người có nhu cầu này, kẻ có nhu cầu khác. Nếu không có những bàn luận rộng thì tôi vào đây là thừa à? Tất cả những nhu cầu đơn giản chỉ 1 người viết code là đủ. Thậm chí hầu hết mấy cái hàm đơn giản đều đã có rồi, chỉ chịu khó truy tìm (seacrh) là ra hết.

Nhưng bạn đã muốn nói chuyện theo code của bạn thì tôi nói chuyện theo code của bạn.

Code này chưa đạt đến trình độ "đơn giản, có thể áp dụng theo". Trước mắt là:


1. Code Nhập dữ liệu từ file excel khác, không cần mở file.

Code này sưu tầm từ Bác nmhung49:

Chú ý: nếu file bạn liên kết đến mà không đặt Password thì phần Password trong code để trống nha.

Mã:
Sub connect_file()
Dim fname
On Error Resume Next
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
fname = Application.GetOpenFilename("Excel Files (*.xls*), *.xls")
With Workbooks.Open(fname, , , , "password") ' PW can dat trong dau ngoac kep, neu ko co password thi de trong
    Sheets("Sheet1").Range("A4:D20000").Copy ThisWorkbook.Sheets("Sheet2").Range("A4")
    .Close False
End With
[B][COLOR=#ff0000]Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
[/COLOR][/B]End Sub

2. Code Xuất dữ liệu từ ra file excel khác.

Code này mình tham khảo nhiều nơi và viết lại, do trình độ VBA yếu kém, nên chỉ viết cho nó chạy thôi, không phải là Code hay.

Mã:
Sub ExportRangetoFile()
Dim wb As Workbook
Dim saveFile As String
Dim WorkRng As Range
On Error Resume Next
xTitleId = "ExportDataExcelToExcel"
Set WorkRng = Application.Selection
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set wb = Application.Workbooks.Add
WorkRng.Copy
wb.Worksheets("Sheet1").Paste
saveFile = Application.GetSaveAsFilename(fileFilter:="Excel files (*.xls*),*.xls")
wb.SaveAs Filename:=saveFile, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
wb.Close
[B][COLOR=#ff0000]Application.CutCopyMode = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
[/COLOR][/B]End Sub


Cái phần tôi tô đỏ là code nguy hiểm. Hàm này theo luật lập trình thì được liệt vào loại "không tái hoàn" (non-reentrant). Lý do là nó tự ý đổi trạng thái (modes) của application.

Nếu viết đứng đắn thì lúc đầu hàm, những trạng thái này phải được ghi (saved) lại và cuối hàm thì hoàn nguyên cho chúng.
 
Upvote 0
Đây là diễn đàn học hỏi. Người có nhu cầu này, kẻ có nhu cầu khác. Nếu không có những bàn luận rộng thì tôi vào đây là thừa à? Tất cả những nhu cầu đơn giản chỉ 1 người viết code là đủ. Thậm chí hầu hết mấy cái hàm đơn giản đều đã có rồi, chỉ chịu khó truy tìm (seacrh) là ra hết.

Nhưng bạn đã muốn nói chuyện theo code của bạn thì tôi nói chuyện theo code của bạn.

Code này chưa đạt đến trình độ "đơn giản, có thể áp dụng theo". Trước mắt là:



Cái phần tôi tô đỏ là code nguy hiểm. Hàm này theo luật lập trình thì được liệt vào loại "không tái hoàn" (non-reentrant). Lý do là nó tự ý đổi trạng thái (modes) của application.

Nếu viết đứng đắn thì lúc đầu hàm, những trạng thái này phải được ghi (saved) lại và cuối hàm thì hoàn nguyên cho chúng.

Em vẫn chưa rõ lắm, Nếu vậy thì em cần thay đổi Code thế nào đây anh?
 
Upvote 0
Theo nguyên tắc, một hàm (hay phương thức) chỉ chỉnh sửa những gì thuộc về công việc của nó mà thôi. Những gì không phải là công việc của nó nhưng vì lý do nào đó nó phải tạm sửa thì trước khi thoát ra, nó có bổn phận phải trả lại cho người ta.

Trong hàm connect_File trên, đầu hàm đặt:
Application.ScreenUpdating = False
Như vậy là nó tam mượn cái thuộc tính ScreenUpdating của Application để làm gì đó.
Cuối hàm đặt lại:
Application.ScreenUpdating = True
Mục đích nó nghĩ: "Ê Application, tớ trả cái thuộc tính ScreenUpdating về cho cậu đây. Thế là hết nợ nần nhau nhé!"
Đúng không?

Bạn nào nghĩ đúng là cả đoan. Bạn không bao giờ nghĩ là có lúc Application nó phản đối: "Khoan đã, cái cậu connect_File kia. Lúc cậu mượn tôi, ScreenUpdating nó là False. Lúc cậu trả tôi nó là True. Cậu làm việc như thế mà xem được à?"

connect_File: "Ơ tôi cứ ngỡ lúc nào nó cũng là True cơ"

Application: "Ngỡ? Làm việc mà nói chuyện ngỡ? Lúc vừa mượn được tại sao cậu không xem trước?"

Ví dụ thực tiễn:

Hàm LamGiDo gọi hàm connect_File

Sub LamGiDo()
Application.ScreenUpdating = False
...
connect_File
... ' LamGiDo bị hẫng ở đây, bởi vì connect_File sửa Application.ScreenUpdating thành True
' màn hình có thể sẽ giật tưng bừng hoa lá ở đây thì là do lỗi của ai?
...
End Sub
 
Upvote 0
Theo nguyên tắc, một hàm (hay phương thức) chỉ chỉnh sửa những gì thuộc về công việc của nó mà thôi. Những gì không phải là công việc của nó nhưng vì lý do nào đó nó phải tạm sửa thì trước khi thoát ra, nó có bổn phận phải trả lại cho người ta.

Trong hàm connect_File trên, đầu hàm đặt:
Application.ScreenUpdating = False
Như vậy là nó tam mượn cái thuộc tính ScreenUpdating của Application để làm gì đó.
Cuối hàm đặt lại:
Application.ScreenUpdating = True
Mục đích nó nghĩ: "Ê Application, tớ trả cái thuộc tính ScreenUpdating về cho cậu đây. Thế là hết nợ nần nhau nhé!"
Đúng không?

Bạn nào nghĩ đúng là cả đoan. Bạn không bao giờ nghĩ là có lúc Application nó phản đối: "Khoan đã, cái cậu connect_File kia. Lúc cậu mượn tôi, ScreenUpdating nó là False. Lúc cậu trả tôi nó là True. Cậu làm việc như thế mà xem được à?"

connect_File: "Ơ tôi cứ ngỡ lúc nào nó cũng là True cơ"

Application: "Ngỡ? Làm việc mà nói chuyện ngỡ? Lúc vừa mượn được tại sao cậu không xem trước?"

Ví dụ thực tiễn:

Hàm LamGiDo gọi hàm connect_File

Sub LamGiDo()
Application.ScreenUpdating = False
...
connect_File
... ' LamGiDo bị hẫng ở đây, bởi vì connect_File sửa Application.ScreenUpdating thành True
' màn hình có thể sẽ giật tưng bừng hoa lá ở đây thì là do lỗi của ai?
...
End Sub

Thanks Anh VetMini,
Câu ví dụ của anh rất hay rất dễ hiểu.
Theo như em tìm hiểu câu lệnh Application.ScreenUpdating (False hay True) chỉ là để bật tắt tính năng cập nhật thông tin, đầu code thì mình tắt cập nhật để nó tập trung xử lý các lệnh bên trong code, sau đó cho nó true để nó cập nhật lại >> Em hiểu như vậy là đúng hay sai anh?
Quả thật em có test 1 đoạn code và nó bị giật màng hình, khi xóa Application.ScreenUpdating đi thì ko còn nữa. Em cũng chưa biết tại sao.
 
Upvote 0
Theo nguyên tắc, một hàm (hay phương thức) chỉ chỉnh sửa những gì thuộc về công việc của nó mà thôi. Những gì không phải là công việc của nó nhưng vì lý do nào đó nó phải tạm sửa thì trước khi thoát ra, nó có bổn phận phải trả lại cho người ta.

Trong hàm connect_File trên, đầu hàm đặt:
Application.ScreenUpdating = False
Như vậy là nó tam mượn cái thuộc tính ScreenUpdating của Application để làm gì đó.
Cuối hàm đặt lại:
Application.ScreenUpdating = True
Mục đích nó nghĩ: "Ê Application, tớ trả cái thuộc tính ScreenUpdating về cho cậu đây. Thế là hết nợ nần nhau nhé!"
Đúng không?

Bạn nào nghĩ đúng là cả đoan. Bạn không bao giờ nghĩ là có lúc Application nó phản đối: "Khoan đã, cái cậu connect_File kia. Lúc cậu mượn tôi, ScreenUpdating nó là False. Lúc cậu trả tôi nó là True. Cậu làm việc như thế mà xem được à?"

connect_File: "Ơ tôi cứ ngỡ lúc nào nó cũng là True cơ"

Application: "Ngỡ? Làm việc mà nói chuyện ngỡ? Lúc vừa mượn được tại sao cậu không xem trước?"

Ví dụ thực tiễn:

Hàm LamGiDo gọi hàm connect_File

Sub LamGiDo()
Application.ScreenUpdating = False
...
connect_File
... ' LamGiDo bị hẫng ở đây, bởi vì connect_File sửa Application.ScreenUpdating thành True
' màn hình có thể sẽ giật tưng bừng hoa lá ở đây thì là do lỗi của ai?
...
End Sub
Thực sự là bây giờ không biết là nên hay không việc sử dụng application.sreenupdating. Mình có đọc cuốn vba trong excel cải thiện và tăng tốc của tác giả Kyo thì thấy tác giả khuyên nên sử dụng. Giờ đọc bài của anh vietMini lại bảo đây là code nguy hiểm.
Vậy mong anh VietMini và các bạn trên gpe cho biết là có nên sử dụng application.sreenupdating hay không ạ? Trong trường hợp nào thì nên dùng? Th nào thì không nên dùng.
 
Upvote 0
Thực sự là bây giờ không biết là nên hay không việc sử dụng application.sreenupdating. Mình có đọc cuốn vba trong excel cải thiện và tăng tốc của tác giả Kyo thì thấy tác giả khuyên nên sử dụng. Giờ đọc bài của anh vietMini lại bảo đây là code nguy hiểm.
Vậy mong anh VietMini và các bạn trên gpe cho biết là có nên sử dụng application.sreenupdating hay không ạ? Trong trường hợp nào thì nên dùng? Th nào thì không nên dùng.

Bạn đọc cho kỹ sẽ thấy là vẫn nên dùng, nhưng vấn đề là dùng như thế nào
 
Upvote 0
Web KT
Back
Top Bottom