Vi hace un tiempo este post y quise ver si podía optimizar la expresión un poco. Aquí va.
Tomando un campo [RUT] (sea que se digite o no con guión) y calculando el DV correcto sin importar si tiene puntos o no:
SWITCH(
11-
MOD(
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 8, 1))*2+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 7, 1))*3+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 6, 1))*4+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 5, 1))*5+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 4, 1))*6+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 3, 1))*7+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 2, 1))*2+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([RUT]), "-"), 1), ".", "")), 8), 1, 1))*3,
11.0
),
1, "1",
2, "2",
3, "3",
4, "4",
5, "5",
6, "6",
7, "7",
8, "8",
9, "9",
10, "K",
11, "0",
"Sin información"
)
En caso de que el campo tenga el RUT completo (con DV) y utilice un Valid_If para ver si se digitó el RUT correctamente:
SWITCH(
11-
MOD(
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 8, 1))*2+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 7, 1))*3+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 6, 1))*4+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 5, 1))*5+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 4, 1))*6+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 3, 1))*7+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 2, 1))*2+
NUMBER(MID(RIGHT(CONCATENATE("00", SUBSTITUTE(INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 1), ".", "")), 8), 1, 1))*3,
11.0
),
1, "1"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
2, "2"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
3, "3"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
4, "4"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
5, "5"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
6, "6"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
7, "7"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
8, "8"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
9, "9"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
10, "K"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
11, "0"=INDEX(SPLIT(CONCATENATE([_THIS]), "-"), 2),
FALSE
)