Xin giúp đỡ : Lấy dữ liệu từ các file khác nhau? (1 người xem)

Liên hệ QC

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

USB1394

Thành viên hoạt động
Tham gia
20/12/08
Bài viết
173
Được thích
12
Nghề nghiệp
Lính triều đình
Em đang dùng Excel 2003 , và đang gặp phải vấn đề khó cần giúp đỡ .Em có 1 thư mục tên : CSDL chứa các file excel (*.xls) ,em muốn lọc lấy dữ liệu của các file này để xử lý trên 1 file excel mới nhưng làm không được ,em có gởi kèm file .
Một số hướng dẫn em thấy có một số cách dùng mã PHP là dùng như thế nào ? Em nhìn mà như mù đi đêm vậy , nếu có thể xin gởi hướng dẫn kèm hình ảnh
Xin cảm ơn rất nhiều --=0--=0--=0
 
Lần chỉnh sửa cuối:
Em đang dùng Excel 2003 , và đang gặp phải vấn đề khó cần giúp đỡ .Em có 1 thư mục tên : CSDL chứa các file excel (*.xls) ,em muốn lọc lấy dữ liệu của các file này để xử lý trên 1 file excel mới nhưng làm không được ,em có gởi kèm file .
Một số hướng dẫn em thấy có một số cách dùng mã PHP là dùng như thế nào ? Em nhìn mà như mù đi đêm vậy , nếu có thể xin gởi hướng dẫn kèm hình ảnh
Xin cảm ơn rất nhiều --=0--=0--=0
Bạn xem file đính kèm của mình và tùy biến cho hợp với ý tưởng của bạn nhé.
Chúc thành công!
 

File đính kèm

Wa!!!! tuyệt !!!! xin hỏi bạn nếu mình muốn dùng trong file khác thì làm sao ? (xin bạn nói chi tiết dùm , phải copy cái gì , sửa lại cái gì) .xin cám ơn bạn rất nhiều vì nó mà mình mất ngủ 2 ngày (vì không biết dùng hàm gì ? mình ko biết về code PHP đâu) Xin cám ơn bạn rất nhiều

Bạn Nghiaphuc ơi , mình áp dụng công thức tương tự với file khác thì không được vậy
$N$9 : ô nhập ngày dữ liệu
N10:N13 : là vùng xuất kết quả lọc từ file XLS
B2 : Là ô đầu tiên trong các file XLS cần lọc (bắt đầu từ ô này)
sau đó tạo liên kết tới file : ='E:\BFO\Excel\Noidung\[09 11 03.xls]Sheet1'!B2 (ví dụ là vậy đi)
Đổi Sheet1 là sheet tương ứng của file XLS ,nhưng do tên sheet XLS của em có dấu ("Kê tiền" ,rename từ sheet 3) ,nên em thay Sheet1=Sheet3
----vẫn không chạy được ,chương trình tô màu vàng tại dòng này : S1.Range("U8:U23").ClearContents
----Xin giúp đỡ ,cin cám ơn rất nhiều
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn Nghiaphuc ơi , mình áp dụng công thức tương tự với file khác thì không được vậy
$N$9 : ô nhập ngày dữ liệu
N10:N13 : là vùng xuất kết quả lọc từ file XLS
B2 : Là ô đầu tiên trong các file XLS cần lọc (bắt đầu từ ô này)
sau đó tạo liên kết tới file : ='E:\BFO\Excel\Noidung\[09 11 03.xls]Sheet1'!B2 (ví dụ là vậy đi)
Đổi Sheet1 là sheet tương ứng của file XLS ,nhưng do tên sheet XLS của em có dấu ("Kê tiền" ,rename từ sheet 3) ,nên em thay Sheet1=Sheet3
----vẫn không chạy được ,chương trình tô màu vàng tại dòng này : S1.Range("U8:U23").ClearContents
----Xin giúp đỡ ,cin cám ơn rất nhiều
Nếu bạn để ý thì tên Sheet ở file Noidung.xls là Sheet1 nhưng trong lệnh VBA (Visual Basic for Application, bạn thường thấy chữ Code PHP, nhưng thực chất đó là Code VBA) mà bạn nhìn thấy lại là S1.Range("N10:N13") hoặc S1.Range("N10") chứ không phải là WorkSheets("Sheet1").Range("N10:N13") hay WorkSheets("Sheet1").Range("N10"). Cũng cần nói thêm trong trường hợp này "Sheet1" là tên trong Excel (Name) còn "S1" là tên trong VBA (CodeName). Sở dĩ mình dùng CodeName mà không dùng Name bởi vì Name thì có thể sử dụng tiếng Việt (tiếng Việt Unicode không thể hiện được trong code VBA), còn CodeName thì không, dùng CodeName thì đỡ rắc rối hơn, bạn có thể đổi tên Sheet trong Excel thoải mái mà không ảnh hưởng đến code VBA.
Bạn làm theo hình này xem có được không nhé.
Còn vấn đề tên Sheet của các file dữ liệu thành phần có tên tiếng Việt có dấu:
sau đó tạo liên kết tới file : ='E:\BFO\Excel\Noidung\[09 11 03.xls]Sheet1'!B2 (ví dụ là vậy đi)
Đổi Sheet1 là sheet tương ứng của file XLS ,nhưng do tên sheet XLS của em có dấu ("Kê tiền" ,rename từ sheet 3) ,nên em thay Sheet1=Sheet3
có phải ý của bạn là ở chỗ Sheet1 phải thay bằng Kê tiền không, tức là phải thay công thức thành ='E:\BFO\Excel\Noidung\[09 11 03.xls]Kê tiền'!B2 đúng không?
Nếu đúng như vậy thì mình thấy Excel tự động biến đổi mà. Bạn thử mở 1 file nào đó (VD file 09 11 03.xls) và đổi tên Sheet1 thành Kê tiền thử xem.
 

File đính kèm

  • HD.JPG
    HD.JPG
    62.5 KB · Đọc: 394
Lần chỉnh sửa cuối:
em làm đúng như anh nhưng cũng không làm thay đổi vấn đề , em gởi kèm anh những hình ảnh miêu tả sự thay đổi ,nhờ anh xem qua có gì sai sót mong anh chỉnh lại dùm ,xin cám ơn **~****~****~****~****~**
 
Lần chỉnh sửa cuối:
- Thứ nhất: Trường hợp bị lỗi của bạn là khi bạn nhập một ngày mà không có file dữ liệu tương ứng. Ngược lại, nếu bạn nhập 1 ngày hợp lệ thì sẽ không có dòng báo lỗi này mà sẽ có dòng báo lỗi tại câu
PHP:
S1.Range("U8").Copy Destination:=S1.Range("U9:U23")
Nguyên nhân của lỗi này là do trong sheet KLT, bạn đã sử dụng Merge Cells. Thực chất ô U8 là vùng U8:Y8 còn vùng U9:U23 là vùng U9:Y23
Nếu bạn để ý thì trước khi bạn thấy dòng báo lỗi màu vàng, Excel có hộp thoại báo lỗi với nội dung là bạn không thể thay đổi nội dung của 1 ô trong vùng được Merge.
=> Hướng xử lý: Bỏ chức năng Merge Cells trong sheet KLT (mình không hiểu vì sao bạn lại dùng Merge Cells, bạn hoàn toàn có thể dùng ô đơn và thay đổi độ rộng cột, dùng Merge Cells rất rắc rối). Còn nếu bạn cứ "quyết tâm" sử dụng Merge Cells thì phải thay các câu lệnh sau (ứng với các vị trí bạn khoanh tròn trên hình):
PHP:
S1.Range("U8:Y23").ClearContents
S1.Range("U8:Y8").Formula="=Hàm của bạn"
S1.Range("U8:Y8").Copy Destination:=S1.Range("U9:Y23")
- Thứ hai: File dữ liệu của bạn có nhiều sheet (5 sheet) mà bạn lại muốn lấy dữ liệu ở sheet "khó chịu" nhất là sheet "Kê tiền", nhưng trong VBA lại không gõ được chữ này.
=> Hướng xử lý: Đổi tên sheet thành tiếng Việt không dấu ("Ke tien") và sửa lại câu lệnh thành
PHP:
S1.Range("U8:Y8").Formula = "='" & ThisWorkbook.Path & "\[" & FName & "]Ke tien'!G5"
Nếu bạn vẫn muốn tên sheet phải là "Kê tiền" thì thay bởi câu lệnh sau:
PHP:
S1.Range("U8:Y8").Formula = "='" & ThisWorkbook.Path & "\[" & FName & "]Kê ti" & ChrW(7873) & "n'!G5"
Lưu ý: Các file dữ liệu của bạn phải cùng cấu trúc như nhau.
Bạn có thể tham khảo ở file đính kèm sau (mình đã bỏ chức năng Merge Cell ở file KLT)
 

File đính kèm

Lần chỉnh sửa cuối:
Mình mới nảy ra ý tưởng dùng Calendar thay cho việc nhập ngày tháng, thấy cũng hay hay. Bạn thử xem file đính kèm nhé.
 

File đính kèm

Em lựa chọn : Tiếng việt và dùng Merge Cells (vì em dễ bố trí nội dung ,giống như anh đang viết 1 giao diện chương trình bằng . . .excel ấy mà - xin lỗi vì em ko được học lập trình VBA nên em viết thủ công bằng các hàm trong excel vậy)
Em đã làm giống anh chỉ và thành công nhưng có điều các file XLS phải cùng nằm chung thư mục với file KLT.xls , em muốn file XLS nằm trong folder : CSDL , còn folder này và file KLT.xls sẽ nằm cùng 1 thư mục .Vậy em sửa như thế nào đây

Mình mới nảy ra ý tưởng dùng Calendar thay cho việc nhập ngày tháng, thấy cũng hay hay. Bạn thử xem file đính kèm nhé.

Cách này rất hay nếu ta ứng dụng để kiểm tra bất kì này này đó thì quả là tuyệt .nhưng trong TH của em thì khác , Giá trị kê tiền từng ngày được người kê (người tạo ra file XLS ấy) tạo ra và đưa cho em cùng với tiền .Nhiệm vụ của em là nhận tiền và kê lại xem có đúng ko ,nếu sót thì ở đâu .Nhưng do muốn anh dễ hiểu em đã đơn giản hóa vấn đề lại ,mong anh thông cảm
 
Chỉnh sửa lần cuối bởi điều hành viên:
Em đã làm giống anh chỉ và thành công nhưng có điều các file XLS phải cùng nằm chung thư mục với file KLT.xls , em muốn file XLS nằm trong folder : CSDL , còn folder này và file KLT.xls sẽ nằm cùng 1 thư mục .Vậy em sửa như thế nào đây
Nếu vậy thì bạn chỉ cần tìm trong code có đoạn sau và chỉnh lại là (chú ý phần màu đỏ):
PHP:
    With FileS
        .NewSearch
        .Filename = FName
        .LookIn = ThisWorkbook.Path & "\CSDL"
        .SearchSubFolders = False
        .Execute
    End With
Em lựa chọn : Tiếng việt và dùng Merge Cells (vì em dễ bố trí nội dung ,giống như anh đang viết 1 giao diện chương trình bằng . . .excel ấy mà
Tất nhiên là mình không hề áp đặt, và mình cũng đã nêu ra cách xử lý trong tình huống này rồi, nhưng như bạn thấy, nếu dùng Merge Cells thì code sẽ dài hơn, đúng không?
xin lỗi vì em ko được học lập trình VBA nên em viết thủ công bằng các hàm trong excel vậy)
Thực ra thì mình cũng không được học qua 1 lớp VBA nào, kể cả VB cũng vậy. Mình bắt đầu với VBA bằng cách sử dụng chức năng Record Macro của Excel, sau đó xem và chỉnh lại code trong VBE, có thể sử dụng chức năng Help trong VBE cũng rất tốt. Thú thật là từ khi đăng ký thành viên GPE, mình học hỏi được rất nhiều.
 
Chỉ thêm vào & "\CSDL" cuối dòng lệnh LockIn
và sửa lại đường dẫn trên file XLS
(em có đính kèm hình) ---> cuối cùng vẫn ko được ,anh xem lại dùm!$@!!!$@!!!$@!!!$@!!

Thực ra thì mình cũng không được học qua 1 lớp VBA nào, kể cả VB cũng vậy. Mình bắt đầu với VBA bằng cách sử dụng chức năng Record Macro của Excel, sau đó xem và chỉnh lại code trong VBE, có thể sử dụng chức năng Help trong VBE cũng rất tốt. Thú thật là từ khi đăng ký thành viên GPE, mình học hỏi được rất nhiều.

chức năng Record Macro của Excel bắt đầu học sử dụng ra sao ? Ví dụ : em muốn nhập ngày vào ô A1 bằng chức năng Calender thì áp dụng như thế nào (bằng cái record macro ấy) .... thật thú vị !$@!!!$@!!!$@!!!$@!!
 
Lần chỉnh sửa cuối:
Xin lỗi, mình thiếu. Bạn cần sửa lại câu lệnh này một xíu (chú ý phần màu đỏ):
Mã:
S1.Range("U8").Formula = "='" & ThisWorkbook.Path[COLOR=red][B] & "\CSDL"[/B][/COLOR] & "\[" & FName & "]Kê ti" & ChrW(7873) & "n'!G5"
Một vấn đề nữa: Nếu ở máy tính có cài đặt ngày hệ thống dạng mặc định (M/d/yyyy) thì file KLT bị lỗi (ví dụ bạn nhập vào ngày 10/11/2009 - dạng dd/MM/yyyy). Để khắc phục lỗi này, bạn sửa câu lệnh
PHP:
FName = Right(Ngay, 2) & " " & Mid(Ngay, 4, 2) & " " & Left(Ngay, 2) & ".xls"
thành câu lệnh
PHP:
FName = Right(Year(Ngay), 2) & " " & Month(Ngay) & " " & Day(Ngay) & ".xls"
(mình đang nói đến code trong file có sử dụng Calendar, còn ở file không sử dụng Calendar thì thay Ngay bởi Target)
chức năng Record Macro của Excel bắt đầu học sử dụng ra sao ? Ví dụ : em muốn nhập ngày vào ô A1 bằng chức năng Calender thì áp dụng như thế nào (bằng cái record macro ấy) .... thật thú vị !$@!!!$@!!!$@!!!$@!!
Để sử dụng chức năng Record Macro, bạn chọn Tool\Macro\Record New Macro... => Nhập tên Macro => OK => Thực hiện thao tác gì đó theo ý bạn => Nhấn nút Stop Recording => Nhấn Alt+F11, tìm đến Macro bạn vừa ghi và xem mã lệnh tương ứng.
Còn ở ví dụ của bạn thì hơi dài dòng: Bạn cứ cho Record New Macro => OK => Chọn Insert\Object\Calendar Control 11.0 => Khi đó sẽ có một thanh công cụ mới hiện ra => Bạn nhấn nút Design Mode và nhấn nút Stop Recording. Khi đó vào trong VBE, đến Macro bạn vừa ghi sẽ có câu lệnh:
PHP:
ActiveSheet.OLEObjects.Add(ClassType:="MSCAL.Calendar", Link:=False, DisplayAsIcon:=False).Select
Bạn thêm vào câu lệnh sau nữa là OK.
PHP:
Selection.LinkedCell = "A1"
Sau đó, bạn lưu lại file, đóng và mở lại là sử dụng được Calendar.
Việc cho ẩn, hiện Calendar, bạn có thể tham khảo ở file KLT trong bài #8 của mình
 
Tại sao lại phải lấy dữ liệu từ các file khác nhau, nhỉ?

Mình cảm giác rằng, trước tiên chúng ta phải thảo luận về cấu trúc của các file đó;

Có khi sau khi thảo luận, chúng ta lại không cần đến yêu cầu này nữa không chừng!

--=0 :-= --=0 :-= --=0
 
Hay quá, tớ cũng đang cần một code như vậy bạn Nghiaphuc giúp tớ với. Tớ có 1 Folder "Don hang" gồm các đơn hàng số 001;002;003;... tớ muốn nó tự động update dữ liệu trong các đơn hàng đó vào một File theo dõi tổng hợp "Master" với các thông tin giống như trong đơn hàng.
Bạn giúp tớ với nhé, cảm ơn bạn nhiều!
 
Mình cảm giác rằng, trước tiên chúng ta phải thảo luận về cấu trúc của các file đó;

Có khi sau khi thảo luận, chúng ta lại không cần đến yêu cầu này nữa không chừng!

--=0 :-= --=0 :-= --=0
Bạn có thể nói rõ hơn một chút không? Phải chăng ý bạn là chúng ta thao tác trực tiếp trên file dữ liệu của từng ngày? Ví dụ như khi đưa mẫu để nhập dữ liệu, ta đặt sẵn 1 sheet để kiểm kê lại ở ngay trong file mẫu đó?
Tớ có 1 Folder "Don hang" gồm các đơn hàng số 001;002;003;... tớ muốn nó tự động update dữ liệu trong các đơn hàng đó vào một File theo dõi tổng hợp "Master" với các thông tin giống như trong đơn hàng.
Bạn giúp tớ với nhé, cảm ơn bạn nhiều!
Bạn cần nói rõ hơn là cấu trúc các file 001, 002,... và file Master như thế nào (số sheet, tên các sheet), tốt nhất là bạn nên gửi các file lên để mình có thể dễ hình dung hơn và sản phẩm cũng phù hợp với ý bạn hơn.
 
Lần chỉnh sửa cuối:
Bạn có thể nói rõ hơn một chút không? Phải chăng ý bạn là chúng ta thao tác trực tiếp trên file dữ liệu của từng ngày? Ví dụ như khi đưa mẫu để nhập dữ liệu, ta đặt sẵn 1 sheet để kiểm kê lại ở ngay trong file mẫu đó?



Thường trước nay mình chỉ sử dụng 1 workBook để chứa hầm bà lằng các dữ liệu phát sinh;
& chỉ 1 WorkBook nữa, nếu cần thiét, để lưu những số liếu không biến đổi trong thới gian dài;

(Đến đây là phải cụ thể, mà cụ thể e rằng không đúng nghề của bạn. Muốn tiếp ta phải xét 1 trường hợp cụ thể nào đó chung nhất - do tác giả topic đưa ra; nhưng tiếc là chưa có)
. . . .

Chúc vui!
 
Xin cám ơn anh Nghiaphuc rất nhiều , em đã áp dụng thành công rồi .trong cách anh hướng dẫn học VBA bằng marco em làm thử (VD : Cột A là số nguyên , cột B = Cột A * 2) sau đó em mở Edit code lên thì nhìn vào cũng chẳng hiểu gì hết .Cũng như trong ví dụ của em mà anh đã hướng dẫn (nhập ngày bằng calender ấy) thì bí mật cũng ở chổ làm cách nào để tìm và dùng dòng lệnh : Selection.LinkedCell = "A1"
Em từng học qua lập trình Pascal rồi nhưng ko ứng dụng được ,Anh có thể giúp em nhập môn này được ko ? Hay chỉ giúp em sách nào có thể tự học được vì em ko có nhiều thời gian .
Sẵn đây anh cho em hỏi thêm , để viết 1 chương trình quản lý kinh doanh (ở dạng giao diện hộp thoại) thì em nên đầu tư và học VBA hay Access
Vì chương trình ko lớn , mà mua thì ko đủ kinh phí , nên em chọn giải pháp : "Viết các hàm chuyên dùng rồi đóng gói chúng dưới dạng Add-in" ,Không biết anh có hứng thú với đề tài này ko !?


Thường trước nay mình chỉ sử dụng 1 workBook để chứa hầm bà lằng các dữ liệu phát sinh;
& chỉ 1 WorkBook nữa, nếu cần thiét, để lưu những số liếu không biến đổi trong thới gian dài;

(Đến đây là phải cụ thể, mà cụ thể e rằng không đúng nghề của bạn. Muốn tiếp ta phải xét 1 trường hợp cụ thể nào đó chung nhất - do tác giả topic đưa ra; nhưng tiếc là chưa có)
. . . .

Chúc vui!

Bạn Hyén7 ơi ! Bạn có thể nói rõ hơn ý tưởng của bạn ko ? Mình nghĩ bạn nói như thế là muốn chia sẽ kinh nghiệm của mình với mọi người thì đây sẽ là một cơ hội tốt cho những người như tôi vậy ! %#^#$%#^#$%#^#$

Anh Nghiaphuc ơi , có một vấn đề lại phát sinh rồi .
File KLT.xls được đặt password chỉ cho phép nhập giá trị vào ô U7 ,nhưng khi đó thì ô kết quả U8:Y23 không thể cập nhật được giá trị ,vậy mình sửa code như thế nào đây anh! (Đặt Password tránh việc công thức bị mất hoặc thay đổi) .Xin anh giúp dùm
 
Chỉnh sửa lần cuối bởi điều hành viên:
Anh Nghiaphuc ơi , có một vấn đề lại phát sinh rồi .
File KLT.xls được đặt password chỉ cho phép nhập giá trị vào ô U7 ,nhưng khi đó thì ô kết quả U8:Y23 không thể cập nhật được giá trị ,vậy mình sửa code như thế nào đây anh! (Đặt Password tránh việc công thức bị mất hoặc thay đổi) .Xin anh giúp dùm
Bạn đặt Password để khóa sheet đúng không? Nếu vậy thì bạn thêm câu lệnh
PHP:
S1.Unprotect "Password của bạn"
vào trước câu
PHP:
If FileS.FoundFiles.Count = 0 Then
và thêm câu lệnh
PHP:
S1.Protect "Password của bạn"
vào cuối Sub (sau dòng lệnh End If)
 
Bây giờ mình có thể sử dụng KLT.xls một cách thuận tiện ,xin cám ơn Anh .

Anh Nghiaphuc ơi , em áp dùng cho file khác ko làm được , File KLT.xls có vùng kết quả ở dạng cột (U8:Y23) còn trong trường hợp này File BC1.xls có vùng kết quả ở dạng hàng (F11:AR11) ,trong vùng kết quả có nhiều ô mà các ô này lại có mergi cell ko bằng nhau nữa .Xin anh giúp dùm ,xin cám ơn
 
Chỉnh sửa lần cuối bởi điều hành viên:
Mình đã làm theo yêu cầu mới của bạn tại Sheet "Báo cáo TC" tương ứng với dữ liệu tại Sheet "BC" theo hướng: mở file dữ liệu => Copy => đóng file dữ liệu. Tuy nhiên mình vẫn thấy không ưa cách gộp ô của bạn. Hẳn bạn cũng thấy trường hợp gộp ô lại thì xử lý khó chịu hơn và dữ liệu được sao chép chỉ là giá trị, nó không tự động cập nhật khi file dữ liệu nguồn thay đổi.
Mình cũng đã sửa lại cấu trúc các Sheet "Báo cáo TC" và "BC" theo hướng bỏ gộp ô (tại các Sheet tương ứng là "Báo cáo TC 1" và "BC1"), mình gộp các Sheet này vào file KLT.xls luôn, nếu bạn muốn đưa sang file khác thì chỉ cần Move or Copy sheet là xong.
Ở đây, mình vẫn còn vướng mắc 2 vấn đề: 1 là Calendar không hiển thị như ý muốn và 2 là ở ô nhập ngày tháng, nếu nhập dữ liệu không phải là Date thì Macro không chạy được. Vấn đề đó xử lý sau. Trước mắt, bạn tham khảo ở file đính kèm này đã nhé.
Chúc thành công!
 

File đính kèm

Lần chỉnh sửa cuối:
Anh Nghiaphuc ơi, anh gởi nhầm file cho em rồi , chỉ có 1 file nhập ngày bằng giao diện Calender thôi (cái này gởi rồi) ,xin gởi lại dùm em nha ,cám ơn nhiều

"...trường hợp gộp ô lại thì xử lý khó chịu hơn và dữ liệu được sao chép chỉ là giá trị, nó không tự động cập nhật khi file dữ liệu nguồn thay đổi..." !$@!!!$@!!anh có thể nói rõ hơn ý này ko ? có phải dữ liệu sao chép ngoài giá trị ra rồi còn gì nữa ko , ko tự động cập nhật khi dữ liệu nguồn thay đổi - là thay đổi gì -\\/.-\\/.

". . .
Ở đây, mình vẫn còn vướng mắc 2 vấn đề . ." !$@!!!$@!!Anh có thể nói rõ hơn ko , em chưa hiểu ý anh muốn nói gì -\\/.-\\/.

". . . Hẳn bạn cũng thấy trường hợp gộp ô lại thì xử lý khó chịu hơn . ."
Em đang có 1 ý tưởng mới giúp khắc phục điều này ,xin anh chờ trong giấy lát
 
Anh Nghiaphuc ơi, anh gởi nhầm file cho em rồi , chỉ có 1 file nhập ngày bằng giao diện Calender thôi (cái này gởi rồi) ,xin gởi lại dùm em nha ,cám ơn nhiều

"...trường hợp gộp ô lại thì xử lý khó chịu hơn và dữ liệu được sao chép chỉ là giá trị, nó không tự động cập nhật khi file dữ liệu nguồn thay đổi..." !$@!!!$@!!anh có thể nói rõ hơn ý này ko ? có phải dữ liệu sao chép ngoài giá trị ra rồi còn gì nữa ko , ko tự động cập nhật khi dữ liệu nguồn thay đổi - là thay đổi gì -\\/.-\\/.

". . .Ở đây, mình vẫn còn vướng mắc 2 vấn đề . ." !$@!!!$@!!Anh có thể nói rõ hơn ko , em chưa hiểu ý anh muốn nói gì -\\/.-\\/.

". . . Hẳn bạn cũng thấy trường hợp gộp ô lại thì xử lý khó chịu hơn . ." Em đang có 1 ý tưởng mới giúp khắc phục điều này ,xin anh chờ trong giấy lát
- Thành thật xin lỗi, không biết có phải lúc đó buồn ngủ quá không nữa. bạn xem lại file đính kèm ở bài trên (#25)
- Trong cách không gộp ô, dữ liệu thu được là từ công thức, nghĩa là khi dữ liệu nguồn thay đổi thì dữ liệu ở file tổng hợp cũng tự động cập nhật theo, còn với file của bạn (có gộp ô) thì dữ liệu thu được không phải là từ công thức mà là copy dữ liệu ở file nguồn rồi dán giá trị sang file tổng hợp, do đó nó sẽ không thể tự động cập nhật giá trị được.
- "Ở đây, mình vẫn còn vướng mắc 2 vấn đề":
1 - Nếu chọn ngày có file tương ứng (10/11/2009) thì không thấy ngày đã chọn trên Calendar.
2 - Mình đã nói rõ: Bạn cứ nhập text bất kỳ (VD: abc), bạn sẽ thấy lỗi ở dòng lấy tên file dữ liệu. Mình đã xử lý anh chàng này (hơi "củ chuối" một xíu): Vào Module1, thay đổi Sub sau:
PHP:
Sub Copy_Data_TC1() 'Sao chep du lieu cho S3'
    Dim Ngay, FName As String
    Dim FileS As FileSearch
 
    Ngay = [B11]
    If Ngay = "" Then
        MsgBox "Phai chon mot ngay nao do.", vbOKOnly, "Thong bao loi"
        [C11:J11].ClearContents
        Exit Sub
    End If
    On Error GoTo Day_Error
    FName = Right("0" & Year(Ngay) Mod 100, 2) & " " & Month(Ngay) & " " & Day(Ngay) & ".xls"
    Set FileS = Application.FileSearch
    With FileS
        .NewSearch
        .Filename = FName
        .LookIn = ThisWorkbook.Path & "\CSDL"
        .SearchSubFolders = False
        .Execute
    End With
    If FileS.FoundFiles.Count = 0 Then
        MsgBox "Khong ton tai file du lieu tuong ung.", vbOKOnly, "Thong bao loi"
        [C11:J11].ClearContents
        Exit Sub
    Else
        FName = Replace(FName, ThisWorkbook.Path & "\CSDL\", "")
        [C11].Formula = "='" & ThisWorkbook.Path & "\CSDL\[" & FName & "]BC1'!D14"
        [C11].Copy Destination:=[D11:J11]
        Exit Sub
    End If
Day_Error:    MsgBox "Nhap ngay khong hop le.", vbOKOnly, "Thong bao loi": [B11:J11].ClearContents: Exit Sub
End Sub
- Bạn có ý tưởng mới thì nêu ra thử xem sao!
 
Lần chỉnh sửa cuối:
"...Trong cách không gộp ô, dữ liệu thu được là từ công thức, nghĩa là khi dữ liệu nguồn thay đổi thì dữ liệu ở file tổng hợp cũng tự động cập nhật theo, còn với file của bạn (có gộp ô) thì dữ liệu thu được không phải là từ công thức mà là copy dữ liệu ở file nguồn rồi dán giá trị sang file tổng hợp, do đó nó sẽ không thể tự động cập nhật giá trị được. ..." Có phải ý anh nói là khi các file XLS thay đổi dữ liệu thì file XLS tổng hợp (KLT.xls) sẽ ko thể tự động cập nhật phải ko , em thấy với cách anh làm thì nó tự động đấy !

Ví dụ : anh mở file KLT.xls và nhập vào ngày 01/11/2009 thì sẽ thấy dữ liệu file 09 11 01.xls hiện ra , bây giờ anh đóng 2 file này lại ,chỉ ở file 09 11 01.xls và sửa lại nội dung (VD:kê thêm số lượng tiền chẳng hạn) ,sau đó anh lưu và đóng file này lại , tiếp đó anh mở file KLT.xls xem sẽ thấy nó tự động

" . .Nếu chọn ngày có file tương ứng (10/11/2009) thì không thấy ngày đã chọn trên Calendar . ." Có phải ý anh là nếu ta nhập dữ liệu vào ô ngày bằng cách đánh máy trực tiếp vào thì trên calender ko thấy có sự thay đổi tương ứng có phải vậy ko ? hay là ý nào em chưa hiểu ,mong anh giải thích rõ hơn

Còn vấn đề số 2 , em hiểu ý anh rồi , anh quả là một người cẩn thận ,nếu làm chuyện lớn thì không chê vào đâu được !
 
"...Trong cách không gộp ô, dữ liệu thu được là từ công thức, nghĩa là khi dữ liệu nguồn thay đổi thì dữ liệu ở file tổng hợp cũng tự động cập nhật theo, còn với file của bạn (có gộp ô) thì dữ liệu thu được không phải là từ công thức mà là copy dữ liệu ở file nguồn rồi dán giá trị sang file tổng hợp, do đó nó sẽ không thể tự động cập nhật giá trị được. ..." Có phải ý anh nói là khi các file XLS thay đổi dữ liệu thì file XLS tổng hợp (KLT.xls) sẽ ko thể tự động cập nhật phải ko , em thấy với cách anh làm thì nó tự động đấy !

Ví dụ : anh mở file KLT.xls và nhập vào ngày 01/11/2009 thì sẽ thấy dữ liệu file 09 11 01.xls hiện ra , bây giờ anh đóng 2 file này lại ,chỉ ở file 09 11 01.xls và sửa lại nội dung (VD:kê thêm số lượng tiền chẳng hạn) ,sau đó anh lưu và đóng file này lại , tiếp đó anh mở file KLT.xls xem sẽ thấy nó tự động
Thực ra với cách copy-dán thì dữ liệu không cập nhật đâu bạn. Bạn thử mở file 09 11 10.xls ra => Sửa nội dung tại Sheet BC và BC1 => Lưu lại => Mở file KLT.xls => Chọn Update tại hộp thoại thông báo => Xem kết quả tại 2 Sheet Báo cáo TC và Báo cáo TC 1, bạn sẽ thấy điều này (tất nhiên là ngày tại 2 Sheet này phải là ngày 10/11/2009 để tương ứng với file 09 11 10.xls).
" . .Nếu chọn ngày có file tương ứng (10/11/2009) thì không thấy ngày đã chọn trên Calendar . ." Có phải ý anh là nếu ta nhập dữ liệu vào ô ngày bằng cách đánh máy trực tiếp vào thì trên calender ko thấy có sự thay đổi tương ứng có phải vậy ko ? hay là ý nào em chưa hiểu ,mong anh giải thích rõ hơn
Bạn thử chọn ô B11 trên Sheet Báo cáo TC 1 và chọn một số ngày trên Calendar xem sao.

-0-/. Trong Sub Copy_Data_TC1 ở bài trên, bạn có thể bỏ câu
PHP:
: Exit Sub
cuối cùng, bởi vì ngay sau đó là End Sub => Không cần Exit Sub cũng được.
//**/ Còn ý tưởng mới của bạn thì sao nhỉ?
 
Lần chỉnh sửa cuối:
Em vừa nghĩ ra i ý tưởng để giải quyết vấn đề này (ko sợ ô đơn hay ô gộp nữa) .Em sẽ mô phỏng ứng dụng này thành 1 hàm gọi là Hàm Look cell . Em đã thể hiện ý tưởng rất chi tiết .Em xin trình bày sơ lượt như sau :
Trong file đình kèm có 4 sheet
- Sheet 1 : Phân tích chi tiết các trường hợp trong hàm Lookcell
- Sheet 2 : Giao diện và cấu trúc hàm (nhờ anh giúp ở phần này)
- Sheet 3 : Ứng dụng hàm để giải quyết các T/h ở sheet 1
- Sheet 4 : Kết luận

Em quên xin bổ sung thêm ,hàm này có thể xử lý với các sheet có tên tiếng viết và có khoảng cách (VD:Kê tiền) và ko phù thuộc vào tên sheet (tức tên sheet là Kê tiền khi thay đổi tên khác thì công thức tự động thay đổi theo)

Do còn nhiều hạn chế về kiến thức nếu có gì ko đúng mong anh chỉ bảo thêm ,xin cám ơn +-+-+-+
 
Chỉnh sửa lần cuối bởi điều hành viên:
- Trước hết, phải công nhận rằng bạn là người cực kỳ cẩn thận và có khiếu thẩm mỹ, nhìn các file của bạn là biết.
- Thứ 2, góp ý 1 xíu về hàm Lookcell: Sao truy cập tới 1 ô trong Workbook mà không thấy tên Worksheet đâu cả? Theo mình thì cần thiết phải có thêm tham số Sheet nữa, tức là cú pháp của hàm là:
=Lookcell(Path,Name,Sheet,Cell)
- Cuối cùng, cái hàm này có vẻ còn hơi khó khăn vì vấn đề:
hàm này có thể xử lý với các sheet có tên tiếng viết và có khoảng cách (VD:Kê tiền) và ko phù thuộc vào tên sheet (tức tên sheet là Kê tiền khi thay đổi tên khác thì công thức tự động thay đổi theo)
Để nghiên cứu thêm đã. Mình thấy ý tưởng của bạn cũng khá hay. Hy vọng sớm có lời giải cho bạn.
Thân!
 
Lần chỉnh sửa cuối:
Xin cám ơn sự quan tâm và giúp đỡ của anh trong thời gian qua . Em nghĩ sự góp ý của anh là rất hợp lý . Hy vọng sớm nhận được hồi âm của anh , xin cám ơn
 
Anh Nghiaphuc ơi ,chắc anh bận lắm có khi nào quên luôn em ko ?
Thực ra thì mình đang... bí với hàm LookCell vì vấn đề: nếu thêm tham số Sheet vào thì nó không thể tự động thay đổi khi tên Sheet Kê tiền thay đổi, còn nếu không thêm tham số này vào thì không được, mà nếu thêm vào nhưng không tự động cập nhật thì có khi dùng cách lúc trước hay hơn.
Khó quá... khó quá... +-+-+-++-+-+-++-+-+-++-+-+-++-+-+-+
 
Vậy mà em tưởng anh quên rồi chứ , xin anh ráng giúp dùm ,nghe anh nhắn thế am mừng lắm . Xin cám ơn anh ,
Hôm rồi ,em xem trên diễn đàn GPE có bán sách "Lập Trình VBA Trong Excel" của thầy Phan Tự Hướng
Link : http://www.giaiphapexcel.com/forum/showthread.php?t=22105
Em ko biết sách này có thể dùng cho những người chưa biết gì được ko ,nếu anh biết xin chỉ giúp ,xin cám ơn
 
mình có các file chứa dữ liệu muốn tổng hợp lại thành 1 file có số liệu là tổng số liệu của các file đó. mình làm mãi không được nhờ các bạn giúp
View attachment 44598
 
mình gửi lại file các bạn giúp mình nhé
Cái này mà bấm nút làm chi mệt, cấu trúc các file như nhau mà. Đặt tất cả các file vào 1 thư mục, sau đó thực hiện các phép tính theo yêu cầu của bạn, giống như thao tác qua lại giữa các sheet mà. Khi dữ liệu các file L6 L7.. thay đổi thì chỉ cần update file Toan truong là được thôi.
 
Cái này mà bấm nút làm chi mệt, cấu trúc các file như nhau mà. Đặt tất cả các file vào 1 thư mục, sau đó thực hiện các phép tính theo yêu cầu của bạn, giống như thao tác qua lại giữa các sheet mà. Khi dữ liệu các file L6 L7.. thay đổi thì chỉ cần update file Toan truong là được thôi.
Bạn ấy đưa ra ý tưởng là dùng nút cũng đúng vì nếu không phải là mấy file L6 L7 thôi trong trường hợp nhiều file mà làm như bạn thì tốn thời gian hơn.
 
Bạn ấy đưa ra ý tưởng là dùng nút cũng đúng vì nếu không phải là mấy file L6 L7 thôi trong trường hợp nhiều file mà làm như bạn thì tốn thời gian hơn.
Cấu trúc các file như nhau nên chẳng có gì là tốn thời gian, nếu có tốn thì cũng chỉ 1 lần, khi có thay đổi mình tự thay đổi được. Nếu nhờ viết code thì phải post lên cho người khác sửa code lại cũng bất tiện không kém. Nếu muốn bấm nút thì trong quá trình làm record macro rồi gán vào nút mà bấm thôi.
 
Cấu trúc các file như nhau nên chẳng có gì là tốn thời gian, nếu có tốn thì cũng chỉ 1 lần, khi có thay đổi mình tự thay đổi được. Nếu nhờ viết code thì phải post lên cho người khác sửa code lại cũng bất tiện không kém. Nếu muốn bấm nút thì trong quá trình làm record macro rồi gán vào nút mà bấm thôi.
mặc dù các file như nhau nhưng nếu nhiều file làm thủ công thì ít nhất cũng phải làm công thức tính tổng gộp tất cả các file lại. Theo mình là mất thời gian.
 
Cảm ơn các bạn đã quan tâm

mặc dù các file như nhau nhưng nếu nhiều file làm thủ công thì ít nhất cũng phải làm công thức tính tổng gộp tất cả các file lại. Theo mình là mất thời gian.
Ý mình là dùng code vì các file L6,L7... chỉ là ví vụ. Bởi vì các file có cấu trúc y hệt nhưng số lượng file là không cố định. Mình muốn khi giao cho mỗi Giáo viên 1 file (*.xls) có cấu trúc như nhau, GV nhập số liệu của mình và nộp lại, mình sẽ copy vào một thư mục sau đó bấm nút là dữ liệu tự động tổng hợp cho file cần tổng hợp là xong. Từ đó sẽ áp dụng cho cả các công việc khác tương tự vậy.
 
Bạn download file đính kèm, đây là kết quả mình thu được từ macro thôi chứ code thì chịu thua thôi.
 

File đính kèm

Bạn download file đính kèm, đây là kết quả mình thu được từ macro thôi chứ code thì chịu thua thôi.
Tại sao bạn không dùng Consolidate nhỉ? Record macro quá trình tổng hợp bằng Consolidate từ 4 file con xem thế nào nhé
Bào đảm code sẽ cực ngắn đấy! Nếu biết chỉnh sửa code thì lại càng ngắn hơn (không thì cứ để nguyên cũng chẳng sao)
Consolidate này có 1 điểm độc đáo là không cần mở file vẫn tổng hợp được
Bạn thử xem!
(chưa biết PivotTable thì thế nào)
 
Cảm ơn các bạn. Mình thấy như vậy là rất tốt rồi. Mình muốn đoạn mã tự động find trong thư mục đó có bao nhiêu file để từ đấy tự động điền công thức:
"=[L6.xls]CL1!RC+[L7.xls]CL1!RC+[L8.xls]CL1!RC+[L9.xls]CL1!RC+....+[file_Ln]" có được không.
Dùng thì:
Range("B4").Select
Selection.Consolidate Sources:= _
Array("'E:\LAP TRINH EXCEL 2010\QL\L9.xls'!R4C2:R15C12" _
, "'E:\LAP TRINH EXCEL 2010\QL\L8.xls'!R4C2:R15C12",....), Function:=xlSum, TopRow _
:=False, LeftColumn:=False, CreateLinks:=False
Range("B4").Select
Nhưng vẫn bị cố định bởi 4 file
 
Lần chỉnh sửa cuối:

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

Back
Top Bottom