diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp
index 5416243f1d45cec9e7c96696cb84c5da77e85580..0767979accc663fc8c1cf6f6c9f4c39c3be8b70c 100644
--- a/Marlin/Marlin_main.cpp
+++ b/Marlin/Marlin_main.cpp
@@ -5851,19 +5851,22 @@ inline void gcode_M410() { stepper.quick_stop(); }
     if ((hasY = code_seen('Y'))) y = code_value();
     if ((hasZ = code_seen('Z'))) z = code_value();
 
-    if (!hasX || !hasY || !hasZ) {
-      SERIAL_ERROR_START;
-      SERIAL_ERRORLNPGM(MSG_ERR_M421_REQUIRES_XYZ);
-      err = true;
-    }
+    if (hasX && hasY && hasZ) {
 
-    if (x >= MESH_NUM_X_POINTS || y >= MESH_NUM_Y_POINTS) {
+      int8_t ix = mbl.select_x_index(x),
+             iy = mbl.select_y_index(y);
+
+      if (ix >= 0 && iy >= 0)
+        mbl.set_z(ix, iy, z);
+      else {
+        SERIAL_ERROR_START;
+        SERIAL_ERRORLNPGM(MSG_ERR_MESH_XY);
+      }
+    }
+    else {
       SERIAL_ERROR_START;
-      SERIAL_ERRORLNPGM(MSG_ERR_MESH_INDEX_OOB);
-      err = true;
+      SERIAL_ERRORLNPGM(MSG_ERR_M421_REQUIRES_XYZ);
     }
-
-    if (!err) mbl.set_z(mbl.select_x_index(x), mbl.select_y_index(y), z);
   }
 
 #endif
diff --git a/Marlin/language.h b/Marlin/language.h
index 179b1f710952e639ffab5cf770f2b43954375d13..02f1772218fb6de88b9f5e76e4ed51e1acf5baaf 100644
--- a/Marlin/language.h
+++ b/Marlin/language.h
@@ -148,7 +148,7 @@
 #define MSG_Z_PROBE                         "z_probe: "
 #define MSG_ERR_MATERIAL_INDEX              "M145 S<index> out of range (0-1)"
 #define MSG_ERR_M421_REQUIRES_XYZ           "M421 requires XYZ parameters"
-#define MSG_ERR_MESH_INDEX_OOB              "Mesh XY index is out of bounds"
+#define MSG_ERR_MESH_XY                     "Mesh XY cannot be resolved"
 #define MSG_ERR_M428_TOO_FAR                "Too far from reference point"
 #define MSG_ERR_M303_DISABLED               "PIDTEMP disabled"
 #define MSG_M119_REPORT                     "Reporting endstop status"