Nhờ giúp đỡ VBA - Tự động chèn hình từ sheet này sang sheet khác

Liên hệ QC

Phamvanchat

Thành viên mới
Tham gia
10/10/18
Bài viết
36
Được thích
9
Xin chào các anh chị em diễn đàn'

Mình có 1 ca này khó quá cần nhờ sự trợ giúp của mọi người

Mình không có hình ở folder mà lại có hình ở trong sheets tổng thì làm sao để nó tự chèn qua sheet con ạ , như file của em hình các ngày từ 1- 30 lấy hình ở sheet tổng hợp, Cột D ở sheet tổng hợp giống với cột D ở các sheets ngày. Xin giúp đỡ ạ, em rất cám ơn.
 

File đính kèm

  • teslayhinh.xlsm
    657.7 KB · Đọc: 13
Trong N(1) D16 = "Biển báo bị sút bu long. kiến nghị chỉnh sửa"

Trong HINHTONGHOP D3 = "Biển báo bị sút bu long. kiến nghị chỉnh sữa", D76 = "biển báo bị sút bu long. kiến nghị chỉnh sửa"

Do không có "chỉnh sữa" (trang tính chứ có phải vú mẹ trẻ nhỏ đâu mà chỉnh SỮA), vậy ta thống nhất là:
- D3 = "Biển báo bị sút bu long. kiến nghị chỉnh sửa"
- D76 = "biển báo bị sút bu long. kiến nghị chỉnh sửa"

Vậy Trong N(1)!B16 nhập ảnh từ B3 hay B76? Hay là lúc đó rút thăm, tung đồng xu? 2 mô tả như nhau trong cột D mà lại có 2 ảnh khác nhau trong cột B thì code chịu rồi. Con người cũng chịu nốt.
 
Upvote 0
Trong N(1) D16 = "Biển báo bị sút bu long. kiến nghị chỉnh sửa"

Trong HINHTONGHOP D3 = "Biển báo bị sút bu long. kiến nghị chỉnh sữa", D76 = "biển báo bị sút bu long. kiến nghị chỉnh sửa"

Do không có "chỉnh sữa" (trang tính chứ có phải vú mẹ trẻ nhỏ đâu mà chỉnh SỮA), vậy ta thống nhất là:
- D3 = "Biển báo bị sút bu long. kiến nghị chỉnh sửa"
- D76 = "biển báo bị sút bu long. kiến nghị chỉnh sửa"

Vậy Trong N(1)!B16 nhập ảnh từ B3 hay B76? Hay là lúc đó rút thăm, tung đồng xu? 2 mô tả như nhau trong cột D mà lại có 2 ảnh khác nhau trong cột B thì code chịu rồi. Con người cũng chịu nốt.

Thành thật xin lỗi khi chưa giải thích rõ đã up lên làm anh không hiểu a.

Chính xác là D76 của HINHTONGHOP = D16 của N(1)
D75 của HINHTONGHOP = D15 của N(1)
D74 của HINHTONGHOP = D14 của N(1)
D73 của HINHTONGHOP = D13 của N(1)

"Lý do là hình ở sheet HINHTONGHOP là ngày từ dưới lên (do phần mềm xuất ra nên em không can thiệp được) N(1) là ngày đầu tháng nên mình phải xem dưới cùng của sheet HINHTONGHOP" - nó ngược đời chút

Em có up lại file dưới ạ, và hình minh họa ạ

Cám ơn anh ạ.
 

File đính kèm

  • teslayhinh.xlsm
    647.6 KB · Đọc: 17
  • z2111508641188_c3552b70ca0d8a48a4344f01c82fd796.jpg
    z2111508641188_c3552b70ca0d8a48a4344f01c82fd796.jpg
    82.9 KB · Đọc: 15
  • z2111508650539_82925c1e6ba456600479f3deba6e35bd.jpg
    z2111508650539_82925c1e6ba456600479f3deba6e35bd.jpg
    67.8 KB · Đọc: 17
Lần chỉnh sửa cuối:
Upvote 0
Thành thật xin lỗi khi chưa giải thích rõ đã up lên làm anh không hiểu a.

Chính xác là D76 của HINHTONGHOP = D16 của N(1)
D75 của HINHTONGHOP = D15 của N(1)
D74 của HINHTONGHOP = D14 của N(1)
D73 của HINHTONGHOP = D13 của N(1)

"Lý do là hình ở sheet HINHTONGHOP là ngày từ dưới lên (do phần mềm xuất ra nên em không can thiệp được) N(1) là ngày đầu tháng nên mình phải xem dưới cùng của sheet HINHTONGHOP" - nó ngược đời chút
Tôi không dám chắn mình đã hiểu tất cả.
Việc của bạn là phải giải thích sao cho người khác hiểu. Nếu không thì giúp bằng cách nào?
Trước tôi tưởng là xét từng ô trong cột D của N(1) rồi tìm trong cột HINHTONGHOP!D. Nếu tìm thấy thì lấy hình tương ứng vào ô cùng dòng ở cột B. Bây giờ lấy theo thứ tự, vấy có câu hỏi: căn cứ vào đâu để biết dòng sẽ có ảnh trong cột N(1)!B? B13, B14, B15 và B16 sẽ có ảnh vì A13, ..., A16 không có số thứ tự? Đây là "tiêu chí"? Phải nói rõ ra, đừng bắt người khác phải đoán mò.

Bạn viết:
Chính xác là D76 của HINHTONGHOP = D16 của N(1)
D75 của HINHTONGHOP = D15 của N(1)
D74 của HINHTONGHOP = D14 của N(1)
D73 của HINHTONGHOP = D13 của N(1)


Đó là do 4 dòng đầu tiên rỗng ở cột A là 13, 14, 15 và 16? Giả sử trong N(1) chỉ có 3 dòng rỗng ở cột A là 13, 14 và 15, còn A16 = 8, thì:
Chính xác là D76 của HINHTONGHOP = D15 của N(1)
D75 của HINHTONGHOP = D14 của N(1)
D74 của HINHTONGHOP = D13 của N(1)


??? Đúng là như thế?

Thế nếu N(1) có 2 khoảng cần ảnh là B13-B16 và B19-B20 (giả sử A19-A20 rỗng) thì:
D76 của HINHTONGHOP = D16 của N(1)
D75 của HINHTONGHOP = D15 của N(1)
D74 của HINHTONGHOP = D14 của N(1)
D73 của HINHTONGHOP = D13 của N(1)

D72 của HINHTONGHOP = D20 của N(1)
D71 của HINHTONGHOP = D19 của N(1)


hay là

D76 của HINHTONGHOP = D20 của N(1)
D75 của HINHTONGHOP = D19 của N(1)
D74 của HINHTONGHOP = D16 của N(1)
D73 của HINHTONGHOP = D15 của N(1)
D72 của HINHTONGHOP = D14 của N(1)
D71 của HINHTONGHOP = D13 của N(1)


???

Tức trong mỗi sheet thì ta xét từng khoảng, từ trên xuống (hay xét từng khoảng nhưng từ dưới lên?), rồi trong từng khoảng xét từ dòng cuối lên trên (trường hợp 1), hay là trong mỗi sheet không xét khoảng mà chỉ xét các dòng từ cuối lên (trường hợp 2)?

Tốt nhất nên giải thích kỹ, vì trong mỗi sheet ngày có thể có nhiều khoảng không liên tục phải có ảnh. Vd. N(1) có 1 khoảng liên tục là B13-B16, nhưng N(3) có tận 3 khoảng B13, B16, B33. Vì thế ngoài mô tả thì nên liệt kê ảnh cho 3 sheet vd. N(1), N(2) và N(3).

Ảnh trong B76 của HINHTONGHOP -> B16 của N(1)
Ảnh trong B75 của HINHTONGHOP -> B15 của N(1)
Ảnh trong B74 của HINHTONGHOP -> B14 của N(1)
Ảnh trong B73 của HINHTONGHOP -> B13 của N(1)
??? -> B16 của N(2)
??? -> B15 của N(2)
??? -> B33 của N(3)
??? -> B16 của N(3)
??? -> B13 của N(3)
 
Upvote 0
Tôi không dám chắn mình đã hiểu tất cả.
Việc của bạn là phải giải thích sao cho người khác hiểu. Nếu không thì giúp bằng cách nào?
Trước tôi tưởng là xét từng ô trong cột D của N(1) rồi tìm trong cột HINHTONGHOP!D. Nếu tìm thấy thì lấy hình tương ứng vào ô cùng dòng ở cột B. Bây giờ lấy theo thứ tự, vấy có câu hỏi: căn cứ vào đâu để biết dòng sẽ có ảnh trong cột N(1)!B? B13, B14, B15 và B16 sẽ có ảnh vì A13, ..., A16 không có số thứ tự? Đây là "tiêu chí"? Phải nói rõ ra, đừng bắt người khác phải đoán mò.

Bạn viết:
Chính xác là D76 của HINHTONGHOP = D16 của N(1)
D75 của HINHTONGHOP = D15 của N(1)
D74 của HINHTONGHOP = D14 của N(1)
D73 của HINHTONGHOP = D13 của N(1)


Đó là do 4 dòng đầu tiên rỗng ở cột A là 13, 14, 15 và 16? Giả sử trong N(1) chỉ có 3 dòng rỗng ở cột A là 13, 14 và 15, còn A16 = 8, thì:
Chính xác là D76 của HINHTONGHOP = D15 của N(1)
D75 của HINHTONGHOP = D14 của N(1)
D74 của HINHTONGHOP = D13 của N(1)


??? Đúng là như thế?

Thế nếu N(1) có 2 khoảng cần ảnh là B13-B16 và B19-B20 (giả sử A19-A20 rỗng) thì:
D76 của HINHTONGHOP = D16 của N(1)
D75 của HINHTONGHOP = D15 của N(1)
D74 của HINHTONGHOP = D14 của N(1)
D73 của HINHTONGHOP = D13 của N(1)

D72 của HINHTONGHOP = D20 của N(1)
D71 của HINHTONGHOP = D19 của N(1)


hay là

D76 của HINHTONGHOP = D20 của N(1)
D75 của HINHTONGHOP = D19 của N(1)
D74 của HINHTONGHOP = D16 của N(1)
D73 của HINHTONGHOP = D15 của N(1)
D72 của HINHTONGHOP = D14 của N(1)
D71 của HINHTONGHOP = D13 của N(1)


???

Tức trong mỗi sheet thì ta xét từng khoảng, từ trên xuống (hay xét từng khoảng nhưng từ dưới lên?), rồi trong từng khoảng xét từ dòng cuối lên trên (trường hợp 1), hay là trong mỗi sheet không xét khoảng mà chỉ xét các dòng từ cuối lên (trường hợp 2)?

Tốt nhất nên giải thích kỹ, vì trong mỗi sheet ngày có thể có nhiều khoảng không liên tục phải có ảnh. Vd. N(1) có 1 khoảng liên tục là B13-B16, nhưng N(3) có tận 3 khoảng B13, B16, B33. Vì thế ngoài mô tả thì nên liệt kê ảnh cho 3 sheet vd. N(1), N(2) và N(3).

Ảnh trong B76 của HINHTONGHOP -> B16 của N(1)
Ảnh trong B75 của HINHTONGHOP -> B15 của N(1)
Ảnh trong B74 của HINHTONGHOP -> B14 của N(1)
Ảnh trong B73 của HINHTONGHOP -> B13 của N(1)
??? -> B16 của N(2)
??? -> B15 của N(2)
??? -> B33 của N(3)
??? -> B16 của N(3)
??? -> B13 của N(3)

Trước tiên em cảm ơn sự nhiệt tình của anh batman1

Khi xuất từ phần mềm ra thì nó ra 2 phần
1 là HINHTONGHOP (nó là hình toàn bộ từ ngày 1 - 30 hàng tháng)
2 là các sheet N(1) - N(30) nó tương ứng với ngày 1 đến ngày 30 của tháng

Tổng cộng có 76 hình của sheet HINHTONGHOP là tổng của 30 ngày của các sheet N(1) - N(30) - có thể có ngày không có hình

Như file thì :
N(1) có 4 hình tương ứng với 4 hình từ HINHTONGHOP
N(2) có 2 hình tương ứng với 2 hình từ HINHTONGHOP
N(3) có 3 hình tương ứng với 3 hình từ HINHTONGHOP
N(4) có 3 hình tương ứng với 3 hình từ HINHTONGHOP
N(5) có 3 hình tương ứng với 3 hình từ HINHTONGHOP
N(6) có 1 hình tương ứng với 3 hình từ HINHTONGHOP
N(7) có 0 hình tương ứng với 0 hình từ HINHTONGHOP

Như em nói thì nó lấy từ dưới lấy lên, nếu lấy từ trên tức là từ số 1 từ HINHTONHOP thì sheet tương ứng với hình phải là
N(30) - N(29) - N(28) .... N(1)

HIện tại em đang làm thủ công như thế này ạ.

Từ sheet N(1) em sẽ đọc ở cột D và so với cột D ở sheet HINHTONGHOP rồi copy hình ở ô B của HINHTONGHOP dán vào ô B của N(1) - nếu có 4 hình em sẽ dán đủ 4 hình rồi xóa row và hình ở HINHTONGHOP đi (vì đã copy sang sheet N(1) rồi để lại khó tìm) , tiếp tục đến sheet N(2) ....N(30) em cũng làm như thế ạ. Rất mất thời gian vì có vài địa bàn nó lên tới 20 hình 1 ngày nên em với lên đây nhờ sự giúp đỡ

Vì không rành code nên em không biết có phải viết cho từng sheet từ N(1) đến N(30)
 
Upvote 0
Tôi dừng ở đây. Những gì tôi chưa hiểu thì tôi đã hỏi ở bài trước, nhưng tới giờ tôi vẫn không hiểu.
Như file thì :
N(1) có 4 hình tương ứng với 4 hình từ HINHTONGHOP
N(2) có 2 hình tương ứng với 2 hình từ HINHTONGHOP
N(3) có 3 hình tương ứng với 3 hình từ HINHTONGHOP
N(4) có 3 hình tương ứng với 3 hình từ HINHTONGHOP
N(5) có 3 hình tương ứng với 3 hình từ HINHTONGHOP
N(6) có 1 hình tương ứng với 3 hình từ HINHTONGHOP
N(7) có 0 hình tương ứng với 0 hình từ HINHTONGHOP
Cái này thì tôi hiểu rồi. Cái tôi hỏi là xác định tương ứng như thế nào để không râu ông nọ cắm cằm bà kia.
Như em nói thì nó lấy từ dưới lấy lên, nếu lấy từ trên tức là từ số 1 từ HINHTONHOP thì sheet tương ứng với hình phải là
N(30) - N(29) - N(28) .... N(1)
Cái này thì tôi cũng trình bầy rồi. Cũng là lấy từ dưới lên nhưng có 2 kiểu lấy từ dưới lên mà tôi đã trình bầy ở bài trước. Và tôi vẫn không biết là lấy theo cách 1 hay cách 2.
HIện tại em đang làm thủ công như thế này ạ.
Từ sheet N(1) em sẽ đọc ở cột D và so với cột D ở sheet HINHTONGHOP rồi copy hình ở ô B của HINHTONGHOP dán vào ô B của N(1) - nếu có 4 hình em sẽ dán đủ 4 hình rồi xóa row và hình ở HINHTONGHOP đi (vì đã copy sang sheet N(1) rồi để lại khó tìm) , tiếp tục đến sheet N(2) ....N(30) em cũng làm như thế ạ. Rất mất thời gian vì có vài địa bàn nó lên tới 20 hình 1 ngày nên em với lên đây nhờ sự giúp đỡ
đọc gì? Khi mà trong cột D có dữ liệu hổ lốn, có cả những dữ liệu kiểu vd. "Bình thường", "//". Chính vì thế mà ở bài trước tôi đã nghĩ là phải xác định dòng CẦN ẢNH là dòng có ô trống ở cột A. Nhưng tôi không được ai khẳng đ̣ịnh là có đúng thế không. Một chữ đọc thì ai biết đọc cái gì, ở đâu, thế nào. so với gì?
Chỉ có 2 việc:
1. Xác định những dòng nào cần nhập ảnh, cụ thể là những ô nào của cột B.
2. Với mỗi ô cần ảnh ở cột B thì xác định ảnh tương ứng với ô đó trong sheet HINHTONGHOP.

Về điểm 1 tôi vẫn chưa biết phải dựa vào cái gì để xác định. Về điểm 2 tôi biết là lấy từ dưới lên nhưng có 2 kiểu lấy mà tôi đã trình bầy ở bài trước. N(1) có 4 ô liên tiếp thì dễ rồi - lấy từ ô cuối lên. Nhưng N(3) có 3 ô ảnh không liên tiếp, gọi là 3 khoảng nhỏ. Vậy lấy từ dưới lên là trong mỗi khoảng, còn trong mỗi sheet thì xét các khoảng từ trên xuống hay cũng từ dưới lên. Vì không hiểu nên tôi hỏi ở bài trước. Và tôi vẫn không hiểu.

Bạn nên chờ người hiểu được ý mình. Hoặc có thể và thích đoán mò. Tôi không hiểu và không thích đoán mò. Tôi mất công viết 3 bài nhưng vẫn không hiểu được. Tôi là người chậm hiểu, bạn chờ người khác nhé.
 
Upvote 0
Tôi dừng ở đây. Những gì tôi chưa hiểu thì tôi đã hỏi ở bài trước, nhưng tới giờ tôi vẫn không hiểu.

Cái này thì tôi hiểu rồi. Cái tôi hỏi là xác định tương ứng như thế nào để không râu ông nọ cắm cằm bà kia.

Cái này thì tôi cũng trình bầy rồi. Cũng là lấy từ dưới lên nhưng có 2 kiểu lấy từ dưới lên mà tôi đã trình bầy ở bài trước. Và tôi vẫn không biết là lấy theo cách 1 hay cách 2.

đọc gì? Khi mà trong cột D có dữ liệu hổ lốn, có cả những dữ liệu kiểu vd. "Bình thường", "//". Chính vì thế mà ở bài trước tôi đã nghĩ là phải xác định dòng CẦN ẢNH là dòng có ô trống ở cột A. Nhưng tôi không được ai khẳng đ̣ịnh là có đúng thế không. Một chữ đọc thì ai biết đọc cái gì, ở đâu, thế nào. so với gì?

Trong N(1) Thì có có các tuyến đường đánh số thứ tự từ 1-27 ạ. ngày này ở các tuyến đường không có sự cố gì thì em viết chữ "Bình thường", đường tiếp theo cũng không có sự cố thì em để "//" có nghĩa là giống phía trên' đều bình thường hết'

Ở đường có sự cố thì sẽ để rỗng những ô phía sau và thêm 1 số hàng ở phía sau nó tương ứng với số sự cố sảy ra trong ngày ạ

[/QUOTE]Chỉ có 2 việc:
1. Xác định những dòng nào cần nhập ảnh, cụ thể là những ô nào của cột B.[/QUOTE]

Những ô cần ảnh ở cột B là những ô insert thêm vào như hình em minh họa - lấy vị dụ như N(1) thì ở đường quốc lộ 1 sẽ phát sinh 4 sự cố trong ngày đó - hình ở cột B là để ở các ô vuông trong 4 ngày đó ạ.

Nếu đường nào không có sự cố thì sau đó em chỉ ghi bình thường - tuần tra theo dõi


[/QUOTE]
2. Với mỗi ô cần ảnh ở cột B thì xác định ảnh tương ứng với ô đó trong sheet HINHTONGHOP.[/QUOTE]

Như em làm thủ công thì em sẽ copy các sự cố ở cột D của N(1) rồi qua HINHTONGHOP em ctl + F tìm sẽ ra và copy paste vào N(1)



Về điểm 1 tôi vẫn chưa biết phải dựa vào cái gì để xác định. Về điểm 2 tôi biết là lấy từ dưới lên nhưng có 2 kiểu lấy mà tôi đã trình bầy ở bài trước. N(1) có 4 ô liên tiếp thì dễ rồi - lấy từ ô cuối lên. Nhưng N(3) có 3 ô ảnh không liên tiếp, gọi là 3 khoảng nhỏ. Vậy lấy từ dưới lên là trong mỗi khoảng, còn trong mỗi sheet thì xét các khoảng từ trên xuống hay cũng từ dưới lên. Vì không hiểu nên tôi hỏi ở bài trước. Và tôi vẫn không hiểu.

Bạn nên chờ người hiểu được ý mình. Hoặc có thể và thích đoán mò. Tôi không hiểu và không thích đoán mò. Tôi mất công viết 3 bài nhưng vẫn không hiểu được. Tôi là người chậm hiểu, bạn chờ người khác nhé.
[/QUOTE]

Như Ở một số ngày thì vài đường khác nhau phát sinh 1 hay 2 sự cố thì em phải thêm vài dòng ở phía sau các đường ấy tương ứng với các sự cố phát sinh trong ngày -

Dù được hay không em cũng chân thành cám ơn sự nhiệt tình của anh ạ. Chúc anh và gia đình sức khỏe. Tiếp tục cống hiến cho diễn đàn ạ.
 

File đính kèm

  • z2113926859987_2677a4a23b82dc50f949cd5c80fa6a96.jpg
    z2113926859987_2677a4a23b82dc50f949cd5c80fa6a96.jpg
    76.8 KB · Đọc: 7
Upvote 0
Trong N(1) Thì có có các tuyến đường đánh số thứ tự từ 1-27 ạ. ngày này ở các tuyến đường không có sự cố gì thì em viết chữ "Bình thường", đường tiếp theo cũng không có sự cố thì em để "//" có nghĩa là giống phía trên' đều bình thường hết'
Ở đường có sự cố thì sẽ để rỗng những ô phía sau và thêm 1 số hàng ở phía sau nó tương ứng với số sự cố sảy ra trong ngày ạ
Bạn ạ, người khác không làm công việc chuyên môn của bạn nên phải nói sao cho họ hiểu. Bây giờ mới lòi ra cái gọi là "sự cố". Nhưng tôi đâu biết sự cố nó là cái gì. Tôi chỉ cần biết là những dòng cần nhập ảnh nó có "dấu hiệu" gì, "tính chất" gì. Tôi không cần biết đó là "sự cố", "có vấn đề", "không thỏa mãn", "nhìn chướng mắt", "không đáng yêu" hay gì. Hãy nói cụ thể, vd. tại sao phải nhập ảnh vào B13? Tôi nhìn thì thấy B13 (và B14, B15, B16) có "tính chất" là ô A13 (và A14, A15, A16) TRỐNG. Tức các dòng cần nhập ảnh là các dòng có ô ở cột A TRỐNG. Đúng thế không? Chỉ có hoặc đúng hoặc không. Nếu đúng thì có câu hỏi tiếp: tại sao không khẳng định ngay sau bài #4 của tôi mà lại bịa những cái không cần thiết như "sự cố"?
Trong bài #4 tôi có câu hỏi
vấy có câu hỏi: căn cứ vào đâu để biết dòng sẽ có ảnh trong cột N(1)!B? B13, B14, B15 và B16 sẽ có ảnh vì A13, ..., A16 không có số thứ tự?
Sao bạn không trả lời?

Còn có câu hỏi
...
??? Đúng là như thế?
và
Thế nếu N(1) ...
...
hay là
...

???

và
Vì thế ngoài mô tả thì nên liệt kê ảnh cho 3 sheet vd. N(1), N(2) và N(3).

Ảnh trong B76 của HINHTONGHOP -> B16 của N(1)
Ảnh trong B75 của HINHTONGHOP -> B15 của N(1)
Ảnh trong B74 của HINHTONGHOP -> B14 của N(1)
Ảnh trong B73 của HINHTONGHOP -> B13 của N(1)
??? -> B16 của N(2)
??? -> B15 của N(2)
??? -> B33 của N(3)
??? -> B16 của N(3)
??? -> B13 của N(3)

Tổng cộng có 4 câu hỏi rất cụ thể. Đã là câu hỏi cụ thể thì phải có 4 câu trả lời cũng cụ thể. Cho tới thời điểm này tôi vẫn chưa nhận được câu trả lời.
----------
Ngoài những khúc mắc về cách nhập ảnh thì tôi thấy dữ liệu có vấn đề.
Theo tôi hiểu được tới giờ thì ảnh ở HINHTONGHOP!B1 ứng với HINHTONGHOP!D1 = "Phui cấp nước xuất hiện ổ gà sâu gây mất ATGT", và ở HINHTONGHOP!B2 ứng với HINHTONGHOP!D2 = "Nấp hầm thoát nước bị vênh có dấu hiệu sập. gây mất ATGT", sẽ được nhập vào N(30)!B15 ứng với N(30)!D15 = "Biển báo bị sút bu long. kiến nghị chỉnh sữa" và N(30)!B17 ứng với N(30)!D17 = "Nấp hầm thoát nước bị vênh có dấu hiệu sập. gây mất ATGT"

Nhìn bào ảnh HINHTONGHOP!B2 thì thấy mô tả ở HINHTONGHOP!D2 = "Nấp hầm thoát nước bị vênh có dấu hiệu sập. gây mất ATGT" khớp với hình. Vì vậy ảnh HINHTONGHOP!B2 nhập vào N(30)!B17 là ĐÚNG vì cũng có N(30)!D17 = "Nấp hầm thoát nước bị vênh có dấu hiệu sập. gây mất ATGT".

Nhìn bào ảnh HINHTONGHOP!B1 thì thấy mô tả ở HINHTONGHOP!D1 = "Phui cấp nước xuất hiện ổ gà sâu gây mất ATGT" khớp với hình. Nhưng ảnh HINHTONGHOP!B1 nhập vào N(30)!B15 là KHÔNG ĐÚNG vì N(30)!D15 = "Biển báo bị sút bu long. kiến nghị chỉnh sữa" chứ không phải là N(30)!D15 = "Phui cấp nước xuất hiện ổ gà sâu gây mất ATGT"
 
Upvote 0
Bạn ạ, người khác không làm công việc chuyên môn của bạn nên phải nói sao cho họ hiểu. Bây giờ mới lòi ra cái gọi là "sự cố". Nhưng tôi đâu biết sự cố nó là cái gì. Tôi chỉ cần biết là những dòng cần nhập ảnh nó có "dấu hiệu" gì, "tính chất" gì. Tôi không cần biết đó là "sự cố", "có vấn đề", "không thỏa mãn", "nhìn chướng mắt", "không đáng yêu" hay gì. Hãy nói cụ thể, vd. tại sao phải nhập ảnh vào B13? Tôi nhìn thì thấy B13 (và B14, B15, B16) có "tính chất" là ô A13 (và A14, A15, A16) TRỐNG. Tức các dòng cần nhập ảnh là các dòng có ô ở cột A TRỐNG. Đúng thế không? Chỉ có hoặc đúng hoặc không. Nếu đúng thì có câu hỏi tiếp: tại sao không khẳng định ngay sau bài #4 của tôi mà lại bịa những cái không cần thiết như "sự cố"?

Câu này thì em trả lời là chỉ nhập ảnh vào ô B thôi ạ, ô A để trống ko cần nhập gì cả ạ

có câu hỏi: căn cứ vào đâu để biết dòng sẽ có ảnh trong cột N(1)!B? B13, B14, B15 và B16 sẽ có ảnh vì A13, ..., A16 không có số thứ tự?

Đúng là A13 ....A16 để trống nên sẽ không có căn cứ gì ở đây em chỉ có căn cứ là D13 .....D16 giống với D 76 ....D73 ở HINHTONGHOP ạ. Vì em không rành cách viết code nên trả lời đôi khi không đúng ý anh


Vì thế ngoài mô tả thì nên liệt kê ảnh cho 3 sheet vd. N(1), N(2) và N(3).

Ảnh trong B76 của HINHTONGHOP -> B16 của N(1)
Ảnh trong B75 của HINHTONGHOP -> B15 của N(1)
Ảnh trong B74 của HINHTONGHOP -> B14 của N(1)
Ảnh trong B73 của HINHTONGHOP -> B13 của N(1)
??? -> B16 của N(2)
??? -> B15 của N(2)
??? -> B33 của N(3)
??? -> B16 của N(3)
??? -> B13 của N(3)

Nếu sang N(2) thì ảnh lại có thay đổi anh ạ vì là ngày khác, có thể sự cố nó lại nằm ở chỗ khác.
như trong file thì:
Ảnh trong B71 của HINHTONGHOP -> B15 của N(2)
Ảnh trong B72của HINHTONGHOP -> B16 của N(2)

đề kiểm tra em copy chữ của N(2)!D15 rồi qua HINHTONGHOP em ctr+f là sẽ thấy ngay hình nằm ở dòng 71 cụ thể ô B71 rồi copy dán qua N(2)



Theo tôi hiểu được tới giờ thì ảnh ở HINHTONGHOP!B1 ứng với HINHTONGHOP!D1 = "Phui cấp nước xuất hiện ổ gà sâu gây mất ATGT", và ở HINHTONGHOP!B2 ứng với HINHTONGHOP!D2 = "Nấp hầm thoát nước bị vênh có dấu hiệu sập. gây mất ATGT", sẽ được nhập vào N(30)!B15 ứng với N(30)!D15 = "Biển báo bị sút bu long. kiến nghị chỉnh sữa" và N(30)!B17 ứng với N(30)!D17 = "Nấp hầm thoát nước bị vênh có dấu hiệu sập. gây mất ATGT"


HINHTONGHOP!B1 ứng với HINHTONGHOP!D1 = "Phui cấp nước xuất hiện ổ gà sâu gây mất ATGT" sẽ được nhập vào N(30)!B25 ứng với N(30)!D25 "Phui cấp nước xuất hiện ổ gà sâu gây mất ATGT" vì ở D25 mới giống nhau ạ

HINHTONGHOP!B2 ứng với HINHTONGHOP!D2 = "Nấp hầm thoát nước bị vênh có dấu hiệu sập. gây mất ATGT", N(30)!B17 ứng với N(30)!D17 cái này chính xác ạ.

em hiện tại cứ vào N(30) copy ô D rồi vào HINHTONGHOP em Ctr + f rồi tìm thủ công như thế ạ



Nhìn bào ảnh HINHTONGHOP!B2 thì thấy mô tả ở HINHTONGHOP!D2 = "Nấp hầm thoát nước bị vênh có dấu hiệu sập. gây mất ATGT" khớp với hình. Vì vậy ảnh HINHTONGHOP!B2 nhập vào N(30)!B17 là ĐÚNG vì cũng có N(30)!D17 = "Nấp hầm thoát nước bị vênh có dấu hiệu sập. gây mất ATGT".

Em đồng ý

Nhìn bào ảnh HINHTONGHOP!B1 thì thấy mô tả ở HINHTONGHOP!D1 = "Phui cấp nước xuất hiện ổ gà sâu gây mất ATGT" khớp với hình. Nhưng ảnh HINHTONGHOP!B1 nhập vào N(30)!B15 là KHÔNG ĐÚNG vì N(30)!D15 = "Biển báo bị sút bu long. kiến nghị chỉnh sữa" chứ không phải là N(30)!D15 = "Phui cấp nước xuất hiện ổ gà sâu gây mất ATGT"

Cái này là N(30)!D25 như em giải thích ở trên ạ


Đó là do 4 dòng đầu tiên rỗng ở cột A là 13, 14, 15 và 16? Giả sử trong N(1) chỉ có 3 dòng rỗng ở cột A là 13, 14 và 15, còn A16 = 8, thì:
Chính xác là D76 của HINHTONGHOP = D15 của N(1)
D75 của HINHTONGHOP = D14 của N(1)
D74 của HINHTONGHOP = D13 của N(1)

??? Đúng là như thế?




Thế nếu N(1) có 2 khoảng cần ảnh là B13-B16 và B19-B20 (giả sử A19-A20 rỗng) thì:
D76 của HINHTONGHOP = D16 của N(1)
D75 của HINHTONGHOP = D15 của N(1)
D74 của HINHTONGHOP = D14 của N(1)
D73 của HINHTONGHOP = D13 của N(1)

D72 của HINHTONGHOP = D20 của N(1)
D71 của HINHTONGHOP = D19 của N(1)

hay là

D76 của HINHTONGHOP = D20 của N(1)
D75 của HINHTONGHOP = D19 của N(1)
D74 của HINHTONGHOP = D16 của N(1)
D73 của HINHTONGHOP = D15 của N(1)
D72 của HINHTONGHOP = D14 của N(1)
D71 của HINHTONGHOP = D13 của N(1)

???


Nếu là D71 D72 thì nó lại sang N(2)

Do cũng không rành code nên theo suy nghĩ cá nhân của em là chỉ làm code cho N(1) rồi theo cái ô D ở N(1) và HINHTONGHOP lọc ra hình vào Ô B rỗng chờ sắn

Nếu như chỉ cần thay đổi N() rồi chạy code thì chịu khó làm cho 30 code cũng nhẹ hơn tìm từng cái ạ.


Hoặc hàm em suy nghĩ trong đầu là nếu ô D của N(1)!D Giống với ô D của HINHTONGHOP thì stt ổ cột A của hình ở HINHTONGHOP = stt ở các trong cột B bên N(1)
 
Upvote 0
Câu này thì em trả lời là chỉ nhập ảnh vào ô B thôi ạ, ô A để trống ko cần nhập gì cả ạ
Có bài nào tôi viết là nhập ảnh vào cột A đâu. Hãy đọc kỹ.
Nếu sang N(2) thì ảnh lại có thay đổi anh ạ vì là ngày khác, có thể sự cố nó lại nằm ở chỗ khác.
như trong file thì:
Ảnh trong B71 của HINHTONGHOP -> B15 của N(2)
Ảnh trong B72của HINHTONGHOP -> B16 của N(2)
đề kiểm tra em copy chữ của N(2)!D15 rồi qua HINHTONGHOP em ctr+f là sẽ thấy ngay hình nằm ở dòng 71 cụ thể ô B71 rồi copy dán qua N(2)
Bạn ạ, chính là khúc mắc chỗ này đây. Có 2 kiểu "cắm ảnh vào đúng ô":

1. Đi từ ảnh ở B76 lên trên, đồng thời lấy các dòng "sự cố" (như bạn nói) cũng từ dưới lên trên ở N(1) để nhập ảnh. Khi sang N(2) thì lại đi tiếp ảnh lên trên và đi tiếp các dòng "sự cố" cũng từ dưới lên trên ở N(2) để nhập ảnh. Cứ thế tới ảnh ở B2, B1 và các dòng "sự cố" ở N(30). Theo cách này thì cứ đi từ dưới lên thôi: ảnh ở B76, B75, B74, B73 nhập vào B16, B15, B14, B13 (cũng là từ dưới lên)

2. Cách này là theo kiểu thao tác của bạn:
đề kiểm tra em copy chữ của N(2)!D15 rồi qua HINHTONGHOP em ctr+f là sẽ thấy ngay hình nằm ở dòng 71 cụ thể ô B71 rồi copy dán qua N(2)

Đã là cách tìm kiếm kiểu VLOOKUP thì kết quả nó có thể không theo thứ tự. Không nhất thiết là ảnh ở B76, B75, B74, B73 nhập vào B16, B15, B14, B13. Rất có thể do tìm kiếm mà lại có ảnh ở B76, B75, B74, B73 nhập vào B16, B13, B14, B15.

Ở những bài đầu bạn mô tả kiểu cách 1. Ít ra là bạn không chịu mô tả kỹ nên người khác hiểu thế. Bây giờ mới lòi ra là bạn làm theo cách 2.
---------
Thôi tôi không hỏi bạn nữa vì có khi đến Tết mới hiểu hết được ý bạn. Tôi sẽ tự mô tả như dưới đây. Nếu đúng ý thì bạn khẳng định là "Đúng rồi". Lúc đó tôi sẽ viết code cho bạn. Nếu mô tả chưa đúng thì thôi. Tôi không đủ kiên nhẫn chờ bạn mô tả đúng.

Cách thức dò và dán ảnh: Ta xét N(1). Đi từ dòng cuối cùng của N(1) lên trên cho tới khi gặp dòng mà ở cột A TRỐNG, giả sử đó là dòng xyz -> đọc mô tả MT ở cột D của dòng đó (MT = Dxyz) -> tìm MT trong cột D của HINHTONGHOP nhưng là tìm từ dòng cuối trở lên trên -> tìm thấy MT ở dòng nào thì lấy ảnh ở dòng đó cho vào Bxyz (kiểu VLOOKUP nhưng từ dưới lên) -> tìm tiếp dòng mà ở cột A TRỐNG -> tìm tiếp MT ở HINHTONGHOP!D nhưng bỏ qua những dòng đã được tìm thấy ở các bước trước -> ... -> cứ như thế cho hết các dòng mà ở cột A TRỐNG thì chuyển sang N(2) và cũng tìm tương tự -> cứ như thế cho tới N(30)
 
Lần chỉnh sửa cuối:
Upvote 0
Có bài nào tôi viết là nhập ảnh vào cột A đâu. Hãy đọc kỹ.

Bạn ạ, chính là khúc mắc chỗ này đây. Có 2 kiểu "cắm ảnh vào đúng ô":

1. Đi từ ảnh ở B76 lên trên, đồng thời lấy các dòng "sự cố" (như bạn nói) cũng từ dưới lên trên ở N(1) để nhập ảnh. Khi sang N(2) thì lại đi tiếp ảnh lên trên và đi tiếp các dòng "sự cố" cũng từ dưới lên trên ở N(2) để nhập ảnh. Cứ thế tới ảnh ở B2, B1 và các dòng "sự cố" ở N(30). Theo cách này thì cứ đi từ dưới lên thôi: ảnh ở B76, B75, B74, B73 nhập vào B16, B15, B14, B13 (cũng là từ dưới lên)

2. Cách này là theo kiểu thao tác của bạn:


Đã là cách tìm kiếm kiểu VLOOKUP thì kết quả nó có thể không theo thứ tự. Không nhất thiết là ảnh ở B76, B75, B74, B73 nhập vào B16, B15, B14, B13. Rất có thể do tìm kiếm mà lại có ảnh ở B76, B75, B74, B73 nhập vào B16, B13, B14, B15.

Ở những bài đầu bạn mô tả kiểu cách 1. Ít ra là bạn không chịu mô tả kỹ nên người khác hiểu thế. Bây giờ mới lòi ra là bạn làm theo cách 2.
---------
Thôi tôi không hỏi bạn nữa vì có khi đến Tết mới hiểu hết được ý bạn. Tôi sẽ tự mô tả như dưới đây. Nếu đúng ý thì bạn khẳng định là "Đúng rồi". Lúc đó tôi sẽ viết code cho bạn. Nếu mô tả chưa đúng thì thôi. Tôi không đủ kiên nhẫn chờ bạn mô tả đúng.

Cách thức dò và dán ảnh: Ta xét N(1). Đi từ dòng cuối cùng của N(1) lên trên cho tới khi gặp dòng mà ở cột A TRỐNG, giả sử đó là dòng xyz -> đọc mô tả MT ở cột D của dòng đó (MT = Dxyz) -> tìm MT trong cột D của HINHTONGHOP nhưng là tìm từ dòng cuối trở lên trên -> tìm thấy MT ở dòng nào thì lấy ảnh ở dòng đó cho vào Bxyz (kiểu VLOOKUP nhưng từ dưới lên) -> tìm tiếp dòng mà ở cột A TRỐNG -> tìm tiếp MT ở HINHTONGHOP!D nhưng bỏ qua những dòng đã được tìm thấy ở các bước trước -> ... -> cứ như thế cho hết các dòng mà ở cột A TRỐNG thì chuyển sang N(2) và cũng tìm tương tự -> cứ như thế cho tới N(30)

Đó chính xác là những gì em phải làm rồi:

Đo văn phòng kém nên em giải thích tệ mong bỏ qua.
 
Upvote 0
Đó chính xác là những gì em phải làm rồi:
Nếu đúng thế thì ...

1. Các lưu ý.
a. Bạn viết
do phần mềm xuất ra ...
Phầm mềm gì mà lúc viết hoa đầu câu lúc không? Phần mềm gì mà xuất ra có lúc có ký tự xuống dòng ngay ở đầu, và có lúc có thêm ký tự dấu trắng ở cuối, có lúc thêm ở đầu?

Với kiểu dữ liệu hổ lốn như thế thì thua.

b. Tại sao nhiều sheet Ngày có dữ liệu từ dòng 6 (dòng 4 và 5 là tiêu đề) trong khi vd. sheet N(2) lại có dữ liệu từ dòng 8 (dòng 6 và 7 là tiêu đề)

Hãy cho dữ liệu từ dòng 6 trong tất cả các sheet Ngày.

c. Trong các trường hợp sau không tìm thấy ảnh. Dữ liệu không chuẩn nên không thể dùng VLOOKUP, cũng không thể dùng cách so sánh kiểu If A = B Then ...:

HINHTONGHOP!D59 = "
Xe đầu kéo BKS:51D601.70 mất lái đụng Dpc mềm .làm mẻ bể 03dpc + bung sút bu long biển báo cấm 2 bánh và 3 bánh+ biển phụ."


Tức ngay ở đầu có ký tự xuống dòng, trong khi ở N(8)!D14 không có.

N(8)!D14 = "Xe đầu kéo BKS:51D601.70 mất lái đụng Dpc mềm .làm mẻ bể 03dpc + bung sút bu long biển báo cấm 2 bánh và 3 bánh+ biển phụ."

Các trường hợp sau là ở sheet HINHTONGHOP có ký tự SPACE ở cuối trong khi ở các sheet Ngày không có:

HINHTONGHOP!D48 = "Người dân cắt hàng rào để băng qua đường gây mất ATGT. "
N(11)!D15 = "Người dân cắt hàng rào để băng qua đường gây mất ATGT."


HINHTONGHOP!D32 = "Xe chạy va quẹt làm gãy trụ biển báo, bể mẻ cục dpc bê tông xi măng đầu xuồng. "
N(18)!D15 = "Xe chạy va quẹt làm gãy trụ biển báo, bể mẻ cục dpc bê tông xi măng đầu xuồng."


HINHTONGHOP!D24 = "Xe ben bs 60c25949 bị nổ lốp ngã qua làn xe hỗn hợp làm hư hỏng 4 cục dpc bê tông xi măng + đổ đất san lấp ra đường gây mất ATGT. csgt quận 12 đã có mặt xưt lý. "
N(21)!D15 = "Xe ben bs 60c25949 bị nổ lốp ngã qua làn xe hỗn hợp làm hư hỏng 4 cục dpc bê tông xi măng + đổ đất san lấp ra đường gây mất ATGT. csgt quận 12 đã có mặt xưt lý."


HINHTONGHOP!D17 = "Đơn vị thi công ( chưa rõ) lắp giá long môn để gắn cammera "
N(23)!D9 = "Đơn vị thi công ( chưa rõ) lắp giá long môn để gắn cammera"


sheet HINHTONGHOP có ký tự SPACE ở đầu trong khi ở sheet Ngày không có:

HINHTONGHOP!D21 = " Xe ben bs60c 259.49 lật . Gậy ùn tắc giao thông. đã đc xntn xừ lý đbgt. xe lưu thông bình thường"
N(21)!D13 = "Xe ben bs60c 259.49 lật . Gậy ùn tắc giao thông. đã đc xntn xừ lý đbgt. xe lưu thông bình thường"


d. Tôi đã khắc phục các trường hợp trong điểm c, tức thừa ký tự xuống dòng và SPACE.

e. Tôi thấy trong HINHTONGHOP có các ảnh từ trên xuống theo trình tự "Picture 1", "Picture 2", ..., "Picture 76". Tức các tên ảnh theo thứ tự liên tiếp. Nếu cái gọi là "phần mềm" không chèn ảnh theo trình tự từ trên xuống thì code sẽ hoạt động không chuẩn. Tức nếu "phần mềm" chèn ảnh lần lượt theo trình tự vào B1, B3, B7, B2, B4, B5, B6, B8, ..., B76 (đoạn B1, B3, B7, B2, B4, B5, B6, B8 không theo trình tự các ô liên tiếp) thì code tèo.

f. Trong code có đoạn
Mã:
t = Timer
Do While Timer - t < 0.4
    DoEvents
Loop
Trên máy tôi nếu bỏ đoạn trên thì sẽ có lỗi "Paste method of Worksheet class failed" ở dòng .Paste. Có vẻ cái gì đấy chưa hoàn thành (nội dung vừa copy vào Clipboard?) mà code đã muốn dán ảnh từ clipboard vào sheet Ngày. Tôi không biết chắc nguyên nhân, chỉ biết là code nên "nghỉ" một chút để "cái gì đấy" có thời gian hoàn thành.

2. Code.
Mở tập tin -> nhấn Alt + F11 để vào VBE -> menu Insert -> Module -> dán code ở dưới vào Module1 -> đặt trên sheet nào đó 1 Button rồi gán cho nó macro chen_anh (phải chuột trên Button -> Assign Macro -> chọn chen_anh)
Mã:
Sub chen_anh()
Dim lastRow As Long, curr_row As Long, k As Long, r As Long, msg As String, chiso(), shp As Shape, rng As Range, t
'    sheet HINHTONGHOP
    With ThisWorkbook.Worksheets("HINHTONGHOP")
        If .Shapes.count = 0 Then Exit Sub  ' neu HINHTONGHOP khong co Anh thi ket thuc
        k = .Shapes.count
'        mang chiso co 3 cot: cot 1 la noi dung cua cot D tren sheet, cot 2 la chi so dong cua Anh va noi dung, cot 3 la Ten Anh
        ReDim chiso(1 To .Shapes.count, 1 To 3)
        For Each shp In .Shapes
            r = r + 1
            chiso(k + 1 - r, 1) = Application.Trim(Application.Clean(.Cells(k + 1 - r, "D").Value)) ' noi dung cot D
            chiso(k + 1 - r, 2) = k + 1 - r ' chi so dong
            chiso(k + 1 - r, 3) = shp.Name  ' ten Anh
        Next shp
    End With
'    duyet tung sheet Ngay dang N(<chi so Ngay>)
    For k = 1 To 30
        With ThisWorkbook.Worksheets("N(" & k & ")")
            .Activate
            lastRow = .Cells(Rows.count, "D").End(xlUp).Row ' xac dinh dong cuoi cung co du lieu o cot D
            For r = lastRow To 6 Step -1    ' duyet tung dong di tu dong cuoi cung len phia tren
                If IsEmpty(.Range("A" & r).Value) Then  ' neu dong hien hanh TRONG o cot A thi thuc hien ...
                    Set rng = .Range("B" & r)   ' o ma o do se dan Anh
'                    xoa anh cu neu dang ton tai
                    On Error Resume Next
                    .Shapes(rng.Address).Delete
                    curr_row = 0
'                    tim noi dung hien hanh co o cot D cua sheet Ngay hien hanh trong cot HINHTONGHOP!D
                    curr_row = Application.VLookup(Application.Trim(Application.Clean(.Range("D" & r).Value)), chiso, 2, 0)
                    On Error GoTo 0
                    If curr_row Then    ' neu tim thay noi dung hien hanh co o cot D cua sheet Ngay hien hanh ...
'                        trong mang chiso thay gia tri vua tim duoc bang "x" de trong cac buoc sau khong tim o dong do nua
                        chiso(curr_row, 1) = "x"
'                        sao chep anh tu HINHTONGHOP vao bo nho
                        ThisWorkbook.Worksheets("HINHTONGHOP").Shapes(chiso(curr_row, 3)).Copy
                        rng.Select
'                        neu co loi "Paste method of Worksheet class failed" thi thu thay 0.4 bang gia tri lon hon, vd. 0.6
                        t = Timer
                        Do While Timer - t < 0.4
                            DoEvents
                        Loop
'                        dan anh tu bo nho vao o trong cot B cua sheet ngay hien hanh
                        .Paste
'                        dieu chinh kich thuoc anh va dat ten la dia chi cua o tai cot B
                        With Selection
                            .ShapeRange.LockAspectRatio = msoFalse
                            .Width = rng.Width
                            .Height = rng.Height
                            .Name = rng.Address ' dat ten cho Anh
                        End With
                    Else
                        msg = msg & "Gia tri tai D" & r & " trong sheet N(" & k & ") khong co trong sheet HINHTONGHOP" & vbCrLf
                    End If
                End If
            Next r
        End With
    Next k
   
    If Len(msg) Then MsgBox msg
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Trước tiên em rất cảm ơn anh vì đoạn code ạ.

1. Các lưu ý.
a. Bạn viết

Phầm mềm gì mà lúc viết hoa đầu câu lúc không? Phần mềm gì mà xuất ra có lúc có ký tự xuống dòng ngay ở đầu, và có lúc có thêm ký tự dấu trắng ở cuối, có lúc thêm ở đầu?

Với kiểu dữ liệu hổ lốn như thế thì thua.


Dạ chính xác như thế ạ, em phải dùng hàm clear để xóa hết định dạng xuống dòng này nọ ạ, cũng có ý kiến mà chưa thấy khắc phục


b. Tại sao nhiều sheet Ngày có dữ liệu từ dòng 6 (dòng 4 và 5 là tiêu đề) trong khi vd. sheet N(2) lại có dữ liệu từ dòng 8 (dòng 6 và 7 là tiêu đề)

Hãy cho dữ liệu từ dòng 6 trong tất cả các sheet Ngày.


Nếu em để hàng bất kì có được không ạ, vị dụ như từ dòng 10 vì trên đó có 1 số thông tin em ẩn đi khỏi rối ạ


c. Trong các trường hợp sau không tìm thấy ảnh. Dữ liệu không chuẩn nên không thể dùng VLOOKUP, cũng không thể dùng cách so sánh kiểu If A = B Then ...:

HINHTONGHOP!D59 = "
Xe đầu kéo BKS:51D601.70 mất lái đụng Dpc mềm .làm mẻ bể 03dpc + bung sút bu long biển báo cấm 2 bánh và 3 bánh+ biển phụ."


Tức ngay ở đầu có ký tự xuống dòng, trong khi ở N(8)!D14 không có.

N(8)!D14 = "Xe đầu kéo BKS:51D601.70 mất lái đụng Dpc mềm .làm mẻ bể 03dpc + bung sút bu long biển báo cấm 2 bánh và 3 bánh+ biển phụ."

Các trường hợp sau là ở sheet HINHTONGHOP có ký tự SPACE ở cuối trong khi ở các sheet Ngày không có:

HINHTONGHOP!D48 = "Người dân cắt hàng rào để băng qua đường gây mất ATGT. "
N(11)!D15 = "Người dân cắt hàng rào để băng qua đường gây mất ATGT."


HINHTONGHOP!D32 = "Xe chạy va quẹt làm gãy trụ biển báo, bể mẻ cục dpc bê tông xi măng đầu xuồng. "
N(18)!D15 = "Xe chạy va quẹt làm gãy trụ biển báo, bể mẻ cục dpc bê tông xi măng đầu xuồng."


HINHTONGHOP!D24 = "Xe ben bs 60c25949 bị nổ lốp ngã qua làn xe hỗn hợp làm hư hỏng 4 cục dpc bê tông xi măng + đổ đất san lấp ra đường gây mất ATGT. csgt quận 12 đã có mặt xưt lý. "
N(21)!D15 = "Xe ben bs 60c25949 bị nổ lốp ngã qua làn xe hỗn hợp làm hư hỏng 4 cục dpc bê tông xi măng + đổ đất san lấp ra đường gây mất ATGT. csgt quận 12 đã có mặt xưt lý."


HINHTONGHOP!D17 = "Đơn vị thi công ( chưa rõ) lắp giá long môn để gắn cammera "
N(23)!D9 = "Đơn vị thi công ( chưa rõ) lắp giá long môn để gắn cammera"


sheet HINHTONGHOP có ký tự SPACE ở đầu trong khi ở sheet Ngày không có:

HINHTONGHOP!D21 = " Xe ben bs60c 259.49 lật . Gậy ùn tắc giao thông. đã đc xntn xừ lý đbgt. xe lưu thông bình thường"
N(21)!D13 = "Xe ben bs60c 259.49 lật . Gậy ùn tắc giao thông. đã đc xntn xừ lý đbgt. xe lưu thông bình thường"


d. Tôi đã khắc phục các trường hợp trong điểm c, tức thừa ký tự xuống dòng và SPACE.

Vâng cái này đúng là lỗi bên phần mềm xuất ra ạ, em sẽ cố gắng nhờ họ sửa sớm nhất

e. Tôi thấy trong HINHTONGHOP có các ảnh từ trên xuống theo trình tự "Picture 1", "Picture 2", ..., "Picture 76". Tức các tên ảnh theo thứ tự liên tiếp. Nếu cái gọi là "phần mềm" không chèn ảnh theo trình tự từ trên xuống thì code sẽ hoạt động không chuẩn. Tức nếu "phần mềm" chèn ảnh lần lượt theo trình tự vào B1, B3, B7, B2, B4, B5, B6, B8, ..., B76 (đoạn B1, B3, B7, B2, B4, B5, B6, B8 không theo trình tự các ô liên tiếp) thì code tèo.

Kiểm tra hiện tại ở vài sheet ngày như sau ạ.

HINHTONGHOP!B1=N(30)!B25

HINHTONGHOP!B2=N(30)!B17
HINHTONGHOP!B3=N(30)!B15
HINHTONGHOP!B4=N(29)!B13
HINHTONGHOP!B5=N(29)!B14

HINHTONGHOP!B6=N(27)!B12

HINHTONGHOP!B7=N(27)!B18
HINHTONGHOP!B8=N(26)!B13
HINHTONGHOP!B9=N(26)!B21

HINHTONGHOP!B10=(N25)!B23

HINHTONGHOP!B11=(N25)!B10
HINHTONGHOP!B12=(N25)!B14

HINHTONGHOP!B13=(N25)!B33

Em có thử và code chạy ổn nhưng kiểm tra lại ảnh thì thấy sai, và như kiểm tra trên thì các row sự cố nó không liên tiếp, anh có cách nào khắc phục không ạ?

Nếu không có cách chắc em phải can thiệp bằng thủ công.



UPDATE: Sau khi chạy xong code em kiểm tra thì hình D76.D75.74 lại ở N(30) chứ không phải ở N(1), có khi nào code bị chạy ngược không ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu em để hàng bất kì có được không ạ, vị dụ như từ dòng 10 vì trên đó có 1 số thông tin em ẩn đi khỏi rối ạ
Nếu dữ liệu bắt đầ từ dòng 10 (dòng 8, 9 là tiêu đề) thì tất cả các sheet ngày đều thế và sửa
Mã:
For r = lastRow To 6 Step -1
thành
Mã:
For r = lastRow To 10 Step -1
UPDATE: Sau khi chạy xong code em kiểm tra thì hình D76.D75.74 lại ở N(30) chứ không phải ở N(1), có khi nào code bị chạy ngược không ạ?
Đúng là ngược thật. Bạn thay bằng code mới và thử kiểm tra xem
Mã:
Sub chen_anh()
Dim lastRow As Long, curr_row As Long, k As Long, r As Long, msg As String, chiso(), shp As Shape, rng As Range, t
'    sheet HINHTONGHOP
    With ThisWorkbook.Worksheets("HINHTONGHOP")
        If .Shapes.count = 0 Then Exit Sub  ' neu HINHTONGHOP khong co Anh thi ket thuc
        k = .Shapes.count
'        mang chiso co 3 cot: cot 1 la noi dung cua cot D tren sheet, cot 2 la chi so dong cua Anh va noi dung, cot 3 la Ten Anh
        ReDim chiso(1 To .Shapes.count, 1 To 3)
        For Each shp In .Shapes
            r = r + 1
            chiso(k + 1 - r, 1) = Application.Trim(Application.Clean(.Cells(r, "D").Value))
            chiso(k + 1 - r, 2) = k + 1 - r ' chi so dong
            chiso(k + 1 - r, 3) = shp.Name  ' ten Anh
        Next shp
    End With
'    duyet tung sheet Ngay dang N(<chi so Ngay>)
    For k = 1 To 30
        With ThisWorkbook.Worksheets("N(" & k & ")")
            .Activate
            lastRow = .Cells(Rows.count, "D").End(xlUp).Row ' xac dinh dong cuoi cung co du lieu o cot D
            For r = lastRow To 6 Step -1    ' duyet tung dong di tu dong cuoi cung len phia tren
                If IsEmpty(.Range("A" & r).Value) Then  ' neu dong hien hanh TRONG o cot A thi thuc hien ...
                    Set rng = .Range("B" & r)   ' o ma o do se dan Anh
'                    xoa anh cu neu dang ton tai
                    On Error Resume Next
                    .Shapes(rng.Address).Delete
                    curr_row = 0
'                    tim noi dung hien hanh co o cot D cua sheet Ngay hien hanh trong cot HINHTONGHOP!D
                    curr_row = Application.VLookup(Application.Trim(Application.Clean(.Range("D" & r).Value)), chiso, 2, 0)
                    On Error GoTo 0
                    If curr_row Then    ' neu tim thay noi dung hien hanh co o cot D cua sheet Ngay hien hanh ...
'                        trong mang chiso thay gia tri vua tim duoc bang "x" de trong cac buoc sau khong tim o dong do nua
                        chiso(curr_row, 1) = "x"
'                        sao chep anh tu HINHTONGHOP vao bo nho
                        ThisWorkbook.Worksheets("HINHTONGHOP").Shapes(chiso(curr_row, 3)).Copy
                        rng.Select
'                        neu co loi "Paste method of Worksheet class failed" thi thu thay 0.4 bang gia tri lon hon, vd. 0.6
                        t = Timer
                        Do While Timer - t < 0.4
                            DoEvents
                        Loop
'                        dan anh tu bo nho vao o trong cot B cua sheet ngay hien hanh
                        .Paste
'                        dieu chinh kich thuoc anh va dat ten la dia chi cua o tai cot B
                        With Selection
                            .ShapeRange.LockAspectRatio = msoFalse
                            .Width = rng.Width
                            .Height = rng.Height
                            .Name = rng.Address ' dat ten cho Anh
                        End With
                    Else
                        msg = msg & "Gia tri tai D" & r & " trong sheet N(" & k & ") khong co trong sheet HINHTONGHOP" & vbCrLf
                    End If
                End If
            Next r
        End With
    Next k
    
    If Len(msg) Then MsgBox msg
End Sub
 
Upvote 0
Nếu dữ liệu bắt đầ từ dòng 10 (dòng 8, 9 là tiêu đề) thì tất cả các sheet ngày đều thế và sửa
Mã:
For r = lastRow To 6 Step -1
thành
Mã:
For r = lastRow To 10 Step -1

Đúng là ngược thật. Bạn thay bằng code mới và thử kiểm tra xem
Mã:
Sub chen_anh()
Dim lastRow As Long, curr_row As Long, k As Long, r As Long, msg As String, chiso(), shp As Shape, rng As Range, t
'    sheet HINHTONGHOP
    With ThisWorkbook.Worksheets("HINHTONGHOP")
        If .Shapes.count = 0 Then Exit Sub  ' neu HINHTONGHOP khong co Anh thi ket thuc
        k = .Shapes.count
'        mang chiso co 3 cot: cot 1 la noi dung cua cot D tren sheet, cot 2 la chi so dong cua Anh va noi dung, cot 3 la Ten Anh
        ReDim chiso(1 To .Shapes.count, 1 To 3)
        For Each shp In .Shapes
            r = r + 1
            chiso(k + 1 - r, 1) = Application.Trim(Application.Clean(.Cells(r, "D").Value))
            chiso(k + 1 - r, 2) = k + 1 - r ' chi so dong
            chiso(k + 1 - r, 3) = shp.Name  ' ten Anh
        Next shp
    End With
'    duyet tung sheet Ngay dang N(<chi so Ngay>)
    For k = 1 To 30
        With ThisWorkbook.Worksheets("N(" & k & ")")
            .Activate
            lastRow = .Cells(Rows.count, "D").End(xlUp).Row ' xac dinh dong cuoi cung co du lieu o cot D
            For r = lastRow To 6 Step -1    ' duyet tung dong di tu dong cuoi cung len phia tren
                If IsEmpty(.Range("A" & r).Value) Then  ' neu dong hien hanh TRONG o cot A thi thuc hien ...
                    Set rng = .Range("B" & r)   ' o ma o do se dan Anh
'                    xoa anh cu neu dang ton tai
                    On Error Resume Next
                    .Shapes(rng.Address).Delete
                    curr_row = 0
'                    tim noi dung hien hanh co o cot D cua sheet Ngay hien hanh trong cot HINHTONGHOP!D
                    curr_row = Application.VLookup(Application.Trim(Application.Clean(.Range("D" & r).Value)), chiso, 2, 0)
                    On Error GoTo 0
                    If curr_row Then    ' neu tim thay noi dung hien hanh co o cot D cua sheet Ngay hien hanh ...
'                        trong mang chiso thay gia tri vua tim duoc bang "x" de trong cac buoc sau khong tim o dong do nua
                        chiso(curr_row, 1) = "x"
'                        sao chep anh tu HINHTONGHOP vao bo nho
                        ThisWorkbook.Worksheets("HINHTONGHOP").Shapes(chiso(curr_row, 3)).Copy
                        rng.Select
'                        neu co loi "Paste method of Worksheet class failed" thi thu thay 0.4 bang gia tri lon hon, vd. 0.6
                        t = Timer
                        Do While Timer - t < 0.4
                            DoEvents
                        Loop
'                        dan anh tu bo nho vao o trong cot B cua sheet ngay hien hanh
                        .Paste
'                        dieu chinh kich thuoc anh va dat ten la dia chi cua o tai cot B
                        With Selection
                            .ShapeRange.LockAspectRatio = msoFalse
                            .Width = rng.Width
                            .Height = rng.Height
                            .Name = rng.Address ' dat ten cho Anh
                        End With
                    Else
                        msg = msg & "Gia tri tai D" & r & " trong sheet N(" & k & ") khong co trong sheet HINHTONGHOP" & vbCrLf
                    End If
                End If
            Next r
        End With
    Next k
   
    If Len(msg) Then MsgBox msg
End Sub

Chân thành cám ơn anh, sau khi kiểm tra tầm 10 sheet thì toàn bộ trùng khớp hết. Code chạy rất nhanh và chính xác. Chúc anh và gia đình sức khỏe, mọi sự như ý.
 
Upvote 0
Web KT
Back
Top Bottom