Tại sao cùng FIle,cùng code VBA mà ở máy này chạy đúng,máy kia chạy sai. (3 người xem)

  • Thread starter Thread starter DMQ
  • Ngày gửi Ngày gửi

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

DMQ

Thành viên dốt
Tham gia
21/3/12
Bài viết
741
Được thích
63
Giới tính
Nam
Em có vấn đề hỏi anh chị, em có file có code VBA nhờ các anh chị làm ở máy nhà, thì chạy OK, nhưng đem file đó đưa lên máy Cty thì chạy sai. Không biết có ai bị vậy không??
 
]Gemini]
Lỗi code VBA chạy bình thường ở máy nhà nhưng bị sai hoặc lỗi (Error) khi mang lên máy công ty là một vấn đề rất phổ biến. Hiện tượng này thường do sự khác biệt về môi trường hệ thống, phiên bản phần mềm hoặc cài đặt bảo mật giữa hai máy.
Dưới đây là các nguyên nhân phổ biến nhất và cách xử lý nhanh:

1. Thiếu thư viện liên kết (Missing References)​

  • Nguyên nhân: Code ở nhà của bạn có sử dụng một số thư viện bổ sung (vídụ: Microsoft Outlook, Microsoft Scripting Runtime, Solver...) mà máy công ty chưa kích hoạt hoặc có phiên bản khác.
  • Cách khắc phục:
    1. Tại máy công ty, mở file Excel, nhấn Alt + F11 để vào cửa sổ VBA.
    2. Chọn Tools > References.
    3. Tìm xem có dòng nào hiển thị chữ "MISSING: ..." hay không. Nếu có, hãy bỏ tích chọn nó, tìm đúng thư viện đó ở phiên bản hiện tại của máy công ty và tích chọn lại.

2. Khác biệt phiên bản Office (32-bit và 64-bit)​

  • Nguyên nhân: Nếu code của bạn có sử dụng các hàm API hệ thống (khai báo bằng từ khóa Declare Sub...), nó sẽ bị lỗi nếu máy nhà dùng Office 32-bit còn máy công ty dùng Office 64-bit (hoặc ngược lại).
  • Cách khắc phục:Cập nhật lại đoạn khai báo API bằng cách sử dụng thuộc tính định hướng PtrSafe để tương thích với bản 64-bit.
    • Ví dụ: Chuyển Declare Sub ... thành Declare PtrSafe Sub ... (và đổi kiểu dữ liệu biến liên quan thành LongPtr).

3. Định dạng Ngày tháng (Regional Date Settings)​

  • Nguyên nhân: Máy nhà cấu hình ngày tháng kiểu Ngày/Tháng/Năm (DD/MM/YYYY), còn máy công ty cấu hình kiểu Tháng/Ngày/Năm (MM/DD/YYYY). Khi VBA xử lý chuỗi ngày tháng sẽ sinh ra kết quả sai hoặc lỗi.
  • Cách khắc phục:
    • Sử dụng hàm DateSerial(Year, Month, Day) trong VBA thay vì truyền chuỗi dạng "05/09/2026".
    • Hoặc kiểm tra lại Regional Settings trong Control Panel của cả 2 máy để đồng bộ.

4. Cài đặt bảo mật Macro ở Công ty bị chặn​

  • Nguyên nhân: Chính sách bảo mật (IT Policy) của công ty chặn không cho chạy Macro hoặc chặn các kết nối dữ liệu từ bên ngoài (nếu code có lấy dữ liệu từ Web/SQL).
  • Cách khắc phục:
    1. Vào File > Options > Trust Center > Trust Center Settings.
    2. Tại mục Macro Settings, chọn Disable VBA macros with notification (để Excel hiển thị nút "Enable Content" khi mở file).
    3. Tại mục Trusted Locations, thêm thư mục chứa file của bạn vào danh sách tin cậy.

5. Khác biệt về Tên Sheet hoặc Đường dẫn File (Path)​

  • Nguyên nhân: Nếu code VBA cố định (Hardcode) một đường dẫn thư mục (với tên User máy nhà) hoặc gọi tên một Sheet/File cụ thể mà máy công ty không có hoặc viết khác ký tự (Hoa/Thường/Dấu tiếng Việt).
  • Cách khắc phục: Sử dụng các đường dẫn động như ThisWorkbook.Path thay vì viết cố định C:\Users\Admin\Desktop\...

Để em có thể bắt bệnh chính xác nhất cho anh/chị, hãy chụp ảnh màn hình dòng code bị báo lỗi màu vàng (nếu có) hoặc gửi đoạn code VBA đang bị chạy sai lên đây kèm theo thông tin:
  • Máy báo lỗi gì (mã lỗi, thông báo lỗi)?
  • Nó chạy ra kết quả sai ở đoạn nào?
 
Thủ phạm là mục 3 anh @SA_DQ ,đúng là code có dính tới ngày tháng, anh có code nào convert ngày tháng chuẩn không ạ???
Bài đã được tự động gộp:

code chạy không lỗi, nhưng kết quả sai anh @SA_DQ .
 
Thủ phạm là mục 3; là code có dính tới ngày tháng, . . . . anh có code nào convert ngày tháng chuẩn không ạ???
Bạn thử chuyển từ dạng ngày-tháng đang dùng sang yyyy/MM/DD
Xem thử 2 hệ thống có chấp nhận chuyện kiểu dữ liệu mới này không!
E rằng viết code để chuyển sẽ không thực tế cho lắm
Chúc vui!
 
  • Yêu thích
Reactions: DMQ
Cái Cty gì mà Tạp Nham, cả Cty mấy chục cái máy, anh nào thích định dạng nào thì gõ, có cái thì dd/mm/yy, cái thì mm/dd/yy, lộn tùng phèo,bởi vậy có vụ cãi nhau mắc cười, anh thì nói tao nhập ngày 4 tháng 8 năm 2025,anh kia thì nói tao thấy mày nhập ngày 8 tháng 4 năm 2025 mà (đối với máy ảnh). :D:D:D:D:D
 
Hỏi: File Excel xài máy nhà có định dạng ngày-tháng là dd/mm/yyyy; Ở cơ quan thường ấn định xài kiểu mm/dd/yyyy
thì phải làm sao hở Gemini

Nếu không thể can thiệp vào cài đặt hệ thống (Control Panel) của máy cơ quan, bạn vẫn có thể giải quyết triệt để bằng 2 cách an toàn dưới đây. Cả hai cách này đều giúp file chạy mượt mà trên cả máy nhà và máy cơ quan mà không sợ bị đảo lộn ngày tháng.

Cách 1: Sử dụng Custom Format "Khóa vùng" (Khuyên dùng)​

Bạn dùng tính năng Định dạng ô (Format Cells) kết hợp mã ngôn ngữ. Cách này ép Excel hiển thị đúng định dạng dd/mm/yyyy trên mọi máy, bất kể máy đó đang dùng chuẩn mm/dd/yyyy hay yyyy/mm/dd, mà không làm mất thuộc tính Date (vẫn tính toán, lọc, sắp xếp bình thường).
  1. Quét chọn toàn bộ cột chứa ngày tháng.
  2. Nhấn tổ hợp phím Ctrl + 1 (hoặc chuột phải chọn Format Cells).
  3. Chọn thẻ Number > Chọn danh mục Custom.
  4. Tại ô Type, bạn copy và dán chính xác dòng mã sau:
    [$-vi-VN]dd/mm/yyyy hoặc [$-42A]dd/mm/yyyy
  5. Nhấn OK.
Mẹo: Mã [$-vi-VN] (hoặc [$-42A]) giúp khóa định dạng theo chuẩn Việt Nam, buộc Excel hiển thị Ngày trước Tháng sau cho dù máy cơ quan có cài đặt kiểu Mỹ.

Cách 2: Chuyển dữ liệu thành chuỗi văn bản (Chỉ dùng khi chỉ cần xem/in ấn)​

Nếu bạn không có nhu cầu cộng/trừ ngày tháng hay lập hàm thống kê theo mốc thời gian, mà chỉ cần mang lên cơ quan để xem, báo cáo hoặc in ấn đúng định dạng yyyy/mm/dd, bạn có thể tạo một cột phụ và dùng hàm TEXT để biến ngày tháng thành chuỗi chữ cố định:
=TEXT(A2, "yyyy/mm/dd")
. . . . . . .
 
Lần chỉnh sửa cuối:
AI tư vấn là có thể nhập bằng số nguyên , ví dụ ngày 02/09/2026 thì nhập là 46267 , tương đương 46267 ngày từ 01/01/1900 , sau đó format là dd/mm/yyyy hoặc mm/dd/yyyy hoặc yyyy-mm-dd đều hiểu ^^
hoặc tách ngày , tháng , năm thành 3 cột , rồi dùng hàm date ghép lại =DATE(năm, tháng, ngày)
 
AI tư vấn là có thể nhập bằng số nguyên , ví dụ ngày 02/09/2026 thì nhập là 46267 , tương đương 46267 ngày từ 01/01/1900 , sau đó format là dd/mm/yyyy hoặc mm/dd/yyyy hoặc yyyy-mm-dd đều hiểu ^^
Thế có hỏi nó khi nhập dữ liệu 5000 học sinh với cách nhập ngày tháng năm sinh bằng giá trị số như vậy thì lấy từng con số ở đâu ra không?
 
Mục số 3 ở bài 2:
AI nói rằng "Khi VBA xử lý chuỗi ngày tháng sẽ sinh ra kết quả sai hoặc lỗi."
Tức là nó đoán ngày tháng đang ở dạng text (thế mới có hành động "xử lý chuỗi"). Chỗ này AI cho giải pháp đúng ở chỗ tách chuỗi rồi dùng hàm DateSerial.
Nếu như dữ liệu chuẩn ngày tháng thì đem đi bất kỳ đâu cũng được hiểu là ngày tháng bất kể thiết lập hệ thống kiểu gì. Excel luôn xem ngày tháng (chuẩn) là giá trị số, nếu nhập kiểu text thì bị lỗi. Ai không tin thì thử gõ 13/08/2026 trên máy thiết lập dd/mm/yy. Sau đó thay đổi thiết lập ngay trên máy đó về mm/dd/yy xem Excel có hiểu không thì biết ngay. Cũng thử như vậy, nhưng gõ 13/08/2026 dạng text.

AI ở bài 6:
Thay vì khuyên người dùng nhập liệu cho đúng chuẩn ngày tháng thì hướng dẫn đi lòng vòng, phức tạp hóa vấn đề.
Ngoài ra, giả sử 500 dòng dữ liệu, một số dòng là ngày đúng chuẩn, một số ngày là text, thì định dạng (format cell) custom hoàn toàn vô nghĩa, vô tác dụng đối với ô là text.
 
Em có vấn đề hỏi anh chị, em có file có code VBA nhờ các anh chị làm ở máy nhà, thì chạy OK, nhưng đem file đó đưa lên máy Cty thì chạy sai. Không biết có ai bị vậy không??
thực sự mình chưa biết bạn viêt công thư gì kết cấu dữ liệu như thế nào. nếu trường hợp bạn viết về giờ, ngày tháng, năm ... bạn đinh dạng ở máy này sang định dạng ở máy khác sai là bình thường. đây là ý kiến của riêng tôi không biết các chuyên gia. à nhìn lại các các chuyên gia trên đã nói. Nhưng chưa thấy file của bạn chưa nói được gì thêm. ví dụ tôi có 1 phần mềm nhỏ tôi đặt, buộc các máy khác phải theo .... 1789395359606.png
 
Theo tôi thì ứng dụng không nên can thiệp hoặc bắt người dùng các máy tính khác phải vô sửa đổi Regional setting. Cái chính là cách nhập và lưu dữ liệu trong ứng dụng của mình.
Theo như bạn @anhtuanle123 có đề cập ở bài #7 là dùng dạng số nhưng có lẻ bạn chưa diễn tả đúng. Đó là nhập liệu dạng text "dd/mm/yyyy" sau đó xử lý như thế nào đó để Excel lưu xuống Cell thành dạng số (vd: 46267). Khi đó file này đem qua các máy nào cũng đảm bảo "hiển thị" đúng ngày tháng theo kiểu định dạng của máy đó.
- 08/04/2026 --> 46120
- 04/08/2026 --> 46238 ---> 2 số này khi Excel chuyển sang định dạng dd/mm hay mm/dd đều đảm bảo đúng.
Bài toán cần giải quyết là nhập và lưu dữ liệu xuống cell cho đúng. Xử lý trên userform thì dễ chứ trực tiếp trên Cell thì tôi thấy khá là rắc rối theo khả năng của tôi.
 
sau đó xử lý như thế nào đó để Excel lưu xuống Cell thành dạng số (vd: 46267).

thực ra em hỏi AI nó chỉ mình ah ^^, còn hệ thống xử lý như thế nào thì chịu thua , chỉ hiểu đại khái con số đó là số ngày tính từ ngày 1/1/1970
mà e nhận thấy thường nếu doanh nghiệp set up máy tính thường IT set mặc định các máy trong region là dd/mm/yyyy hoặc mm/dd/yyyy , hoặc chuyên nghiệp hơn là đồng bộ thời gian từ máy chủ !

Hỏi : kiểu ngày tháng bản chất là 1 số nguyên đúng không ? quy tắc chuyển đổi từ số nguyên này sang kiểu ngày tháng ?
AI :
Đúng vậy, bản chất của kiểu ngày tháng chính là một con số đếm thời gian trôi qua kể từ một cột mốc (ví dụ: Unix Timestamp đếm số giây kể từ 01/01/1970).

Để biến con số khổng lồ này thành một chuỗi ngày tháng dễ hiểu đối với con người (như 15/09/2026 08:21:10), hệ thống sẽ thực hiện một loạt các phép toán học cơ bản.

Dưới đây là quy tắc (thuật toán) cốt lõi để chuyển đổi từ số nguyên (giây) sang ngày giờ:

1. Điều chỉnh múi giờ (Timezone Offset)​

Con số gốc thường được lưu ở chuẩn giờ Quốc tế (UTC). Để hiển thị giờ địa phương, máy tính phải cộng/trừ số giây chênh lệch múi giờ.

  • Ví dụ ở Việt Nam (UTC+7): Timestamp_thực_tế = Timestamp_gốc + (7 * 3600) (vì 1 giờ có 3600 giây).

2. Tách phần "Ngày" và phần "Giờ"​

Một ngày có đúng 86.400 giây (24 giờ × 60 phút × 60 giây). Máy tính sẽ chia số nguyên để tìm ra hai phần:

  • Tổng số ngày trôi qua: Tổng_ngày = Timestamp_thực_tế / 86400 (Phép chia lấy phần nguyên).
  • Thời gian trong ngày hiện tại: Giây_lẻ = Timestamp_thực_tế % 86400 (Phép chia lấy phần dư).

3. Quy đổi Giờ - Phút - Giây​

Từ số Giây_lẻ ở trên, hệ thống tính ra thời gian trong ngày rất nhanh:

  • Giờ: Giây_lẻ / 3600
  • Phút: (Giây_lẻ % 3600) / 60
  • Giây: Giây_lẻ % 60

4. Tính Năm - Tháng - Ngày (Phần phức tạp nhất)​

Hệ thống sử dụng Tổng_ngày và tính tiến lên từ cột mốc 01/01/1970. Phần này phức tạp vì phải đối phó với Năm nhuận (tháng 2 có 29 thay vì 28 ngày) và Tháng thiếu/đủ (30 hoặc 31 ngày).

Máy tính sẽ giải bài toán này bằng cách trừ lùi:

  • Tìm Năm: Bắt đầu từ 1970, kiểm tra xem năm đó có nhuận không. Nếu không nhuận, trừ đi 365 ngày; nếu nhuận, trừ 366 ngày. Tiếp tục lặp lại quá trình này (1971, 1972...) cho đến khi số ngày còn lại nhỏ hơn một năm. Lúc này, ta xác định được Năm.
  • Tìm Tháng: Với số ngày ít ỏi còn lại, hệ thống tiếp tục trừ đi số ngày của từng tháng trong năm đó (tháng 1 trừ 31 ngày, tháng 2 trừ 28/29 ngày...). Khi số ngày còn lại nhỏ hơn số ngày của một tháng, ta xác định được Tháng.
  • Tìm Ngày: Số ngày dư cuối cùng cộng thêm 1 chính là Ngày trong tháng.
Bí mật đằng sau: Mặc dù thuật toán nghe có vẻ dài dòng, nhưng với tốc độ xử lý của CPU hiện đại, toàn bộ quá trình chia và trừ lùi này diễn ra trong chưa tới 1 phần triệu giây. Hơn nữa, các lập trình viên hiếm khi phải tự tính tay vì các ngôn ngữ lập trình đã có sẵn các thư viện (như DateTime) làm hộ việc này một cách tối ưu nhất.


Hỏi : Chuẩn dd/mm/yyyy và mm/dd/yyyy là của những nước nào dùng ?
AI :
Trên thế giới, sự phân bổ của hai định dạng ngày tháng này có sự chênh lệch rất lớn. Chuẩn dd/mm/yyyy chiếm đa số tuyệt đối, trong khi chuẩn mm/dd/yyyy chỉ được sử dụng ở một vài quốc gia.

Dưới đây là chi tiết phân bổ:

1. Chuẩn dd/mm/yyyy (Ngày / Tháng / Năm)​

Đây là định dạng phổ biến nhất thế giới, được sử dụng bởi phần lớn các quốc gia trên toàn cầu. Cách viết này đi theo logic từ đơn vị nhỏ nhất (ngày) đến đơn vị lớn nhất (năm).

  • Châu Á: Việt Nam, Ấn Độ, Thái Lan, Indonesia, Singapore...
  • Châu Âu: Hầu hết toàn bộ các nước Châu Âu (Anh, Pháp, Đức, Ý, Tây Ban Nha, Nga...).
  • Châu Úc: Úc, New Zealand.
  • Châu Mỹ: Đa số các nước Nam Mỹ và Trung Mỹ (Brazil, Argentina, Mexico...).
  • Châu Phi: Phần lớn các quốc gia tại lục địa này.

2. Chuẩn mm/dd/yyyy (Tháng / Ngày / Năm)​

Định dạng này đi ngược lại với đa số thế giới và gần như chỉ gắn liền với nước Mỹ. Nó xuất phát từ cách người Mỹ đọc ngày tháng trong giao tiếp hàng ngày (ví dụ: họ đọc là "September 15th, 2026" thay vì "15th of September").

  • Quốc gia sử dụng chính: Hợp chủng quốc Hoa Kỳ (Mỹ).
  • Các quốc gia/vùng lãnh thổ ảnh hưởng bởi Mỹ: Philippines, Quần đảo Marshall, Liên bang Micronesia.
Các trường hợp đặc biệt:

  • Canada: Là quốc gia sử dụng khá "hỗn loạn" vì chịu ảnh hưởng của cả Anh (dd/mm/yyyy) và Mỹ (mm/dd/yyyy), đồng thời chính phủ lại khuyến khích dùng yyyy/mm/dd.
  • Đông Á (Trung Quốc, Nhật Bản, Hàn Quốc): Không dùng hai chuẩn trên mà dùng chuẩn yyyy/mm/dd (Năm/Tháng/Ngày). Logic của họ là đi từ cái lớn nhất (bao quát nhất) rồi mới đi vào chi tiết, tương tự như cách họ viết địa chỉ (Quốc gia > Tỉnh/Thành > Quận/Huyện > Số nhà).
 

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

Back
Top Bottom