32 bit cho cái gì nhỉ?
thế cấu hình của mình đang ko tương thích hở bác?
Có office 32 bit và office 64 bit. Bạn có 64 bit còn code viết cho 32 bit.
vậy có cách nào cắt ảnh của pdf được bác nhỉ?
Làm chơi tí.
Tôi đính kèm tập tin để test. Chạy cả trong Excel
2007 (tôi không có 2007 nhưng tin là sẽ chạy).
Ít ra thì những người dùng Excel < 2010 có công cụ để dùng.
Vài chú ý:
1. Vấn đề xác định vùng trên màn hình cần copy là vấn đề "khó". Ý tưởng hiện tại của tôi là hook chuột. Khi bạn click ở đâu đó và giữ chuột trái không thả thì code ghi nhớ điểm đó trên màn hình. Sau đó vẫn không thả chuột mà kéo tới điểm kết thúc (kéo sang phải và xuống dưới) thì trong quá trình kéo sẽ nhìn thấy (code vẽ hình chữ nhật trên màn hình) vùng hiện hành đang được chọn. Khi tới điểm kết thúc vừa ý thì mới thả chuột trái. Lúc này code sẽ ghi nhớ điểm kết thúc và dựa vào điểm đầu và kết thúc để xác định vùng cần copy rồi copy vùng đó trên màn hình vào sheet. Đây là cách thực hiện trong tập tin
copy desktop to sheet with drawing.xlsm.
Tuy nhiên trong quá trình kéo chuột trên vd. cửa sổ PDF thì đôi khi ta thấy cửa sổ bị xê dịch - cái này là do chương trình soạn thảo PDF chứ không phải là lỗi code. Thậm chí nếu thao tác trong cửa sổ notepad thì đoạn văn bản trong vùng chọn được bôi đen. Đó là do notepad xử lý, chả phải do Excel với code của nó. Chả mở Excel mà mở notepad thì khi nhấn giữ chuột rồi kéo thì notepad sẽ bôi đen vùng chọn. Hậu quả là các hình chữ nhật trung gian không được xóa chuẩn. Và nếu văn bản được bôi đen (vd. trong notepad) thì ảnh đen đó sẽ hiển thị trong Excel, vì code copy những gì mắt nhìn thấy.
Thực ra để xác định điểm đầu và cuối không cần vẽ hình chữ nhật. Vẽ chẳng qua để người dùng nhìn thấy vùng mình chọn. Để không vẽ thì dùng tập tin copy desktop to sheet without drawing.xlsm. Nhưng lúc này thao tác là: đưa chuột vào điểm đầu, nhớ là căn chính xác, và click. Tiếp theo đưa chuột vào điểm kết thúc ở dưới và bên phải so với điểm đầu rồi click lần thứ 2.
Cả 2 code, vẽ và không vẽ, sau khi copy vùng vào sheet thì đều gỡ bỏ hook chuột. Tức muốn copy nữa thì lại phải thao tác lại.
Tất nhiên để tránh bôi đen, xê dịch (cuộn cửa sổ) thì ta có thể tạo 1 cửa sổ của Windows lớp "STATIC" và cho nó trong suốt và nằm trên cửa sổ cần copy (PDF, word, VBA ...). Lúc đó thao tác sẽ được thực hiện trên cửa sổ STATIC nên không có chuyện xê dịch, bôi đen. Code để tạo window (CreateWindowEx), làm trong suốt thì ngay trên GPE cũng từng có. Tôi lười viết thêm, nhưng việc tạo STATIC là không hề khó. Lúc đó thì có thể bỏ hook chuột vì việc phát hiện click sẽ được thực hiện trong hàm cửa sổ (WindowProc) của cửa sổ STATIC. Hàm WindowProc sẽ được thay, đánh tráo cho hàm cửa sổ mặc định của STATIC - dùng SetWindowLong + GWL_WNDPROC. Tất nhiên khi xong việc thì trả lại hàm cửa sổ mặc định cho STATIC. Những trò này tôi chơi hơn 20 năm trước nhưng bây giờ lười viết quá.
2. Do code được khởi động khi Excel hoạt động và nó hook chuột để bắt sự kiện về chuột (nhấn, di chuyển, thả) nên tiếp theo không thể chuyển sang ứng dụng khác (notepad, word, PDF, cửa sổ VBA ...) bằng chuột được. Vì sao? Vd. sau khi nhấn Button1 mà ta nhấn icon của PDF trên taskbar bằng chuột thì có nghĩa là lúc đó đã sảy ra sự kiện chuột nhấn và chuột thả, mà chuột thả thì là copy vùng chữ nhật có 2 chiều = 0 (vì 2 điểm nhấn thả trùng nhau) rồi gở bỏ hook chuột. Do vậy khi PDF hiển thị thì không còn hook chuột để theo dõi nhấn thả nữa.
Vì lý do trên sau khi nhấn Button1 thì phải dùng bàn phím để hiển thị PDF. Thao tác như sau: Nhấn Button1 -> nhấn Alt trái và giữ -> nhấn lần lượt TAB tới khi tới icon của PDF -> thả Alt -> click điểm đầu rồi giữ (trường hợp
copy desktop to sheet with drawing.xlsm), hoặc click điểm đầu (
copy desktop to sheet without drawing.xlsm) -> kéo chuột tới điểm cuối rồi thả (trường hợp
copy desktop to sheet with drawing.xlsm), hoặc click điểm cuối (trường hợp
copy desktop to sheet without drawing.xlsm).
3. Trong cả 2 tập tin thì giữa 2 thời điểm click điểm đầu và cuối không được phép cuộn cửa sổ - hoặc ứng dụng tự cuộn hoặc ta tự cuộn thì đều không được. Vì sao? Vd. khi click điểm đầu và nó có tọa độ là (x1, y1) trên màn hình. Khi click điểm cuối nó có tọa độ (x2, y2). Nhưng do cửa sổ được cuộn nên cái điểm (x1, y1) trên màn hình kia bây giờ nó lại nằm ở nội dung khác trong cửa sổ ứng dụng (notepad, word, PDF, VBA ...). Thậm chí do cuộn thì điểm click (x2, y2) tuy nằm trên màn hình nhưng có thể rơi vào đoạn nội dung mà khi click điểm đầu nó không được nhìn thấy do nằm ngoài màn hình. Hậu quả là vẽ cũng không đúng mà hình chữ nhật được xác định từ các tọa độ đầu và cuối cũng không chính xác, tiếp theo là vùng không mong muốn sẽ được copy vào sheet.
4. Cách tốt nhất là dùng
copy desktop to sheet without drawing.xlsm và click 2 lần để chọn điểm đầu (góc trên bên trái) và điểm cuối (gọc dưới bên phải). Cần di chuyển chuột thật chính xác tới điểm đầu và cuối rồi click.