Hola!
Me atrevo a deducir que los campos tipocomprobante, comprobante, sucursal, perfil, usuario, listado y auditoria son de tipo booleano (tipo "Si/No" en Access)... si ese es el caso, fíjate que les estás asignando 0 (cero) o 1, cuando siendo booleanos el dato que aceptan es únicamente True o False.
Prueba a utilizar esta concatenación en lugar de la tuya, a ver si te funciona:
Código:
SQL = "UPDATE perfiles SET codperfil= '" & TxtCodigo.Text & _
"',nombre= '" & TxtNombre.Text & _
"',tipocomprobante= " & Iif(ChkTC.Value=1, "True", "False") & _
",comprobante= " & Iif(ChkC.Value=1, "True", "False") & _
" ,sucursal= " & Iif(ChkS.Value=1, "True", "False") & _
" ,perfil=" & Iif(ChkP.Value=1, "True", "False") & _
" ,usuario=" & Iif(ChkU.Value=1, "True", "False") & _
" ,listado= " & Iif(ChKl.Value=1, "True", "False") & _
" ,auditoria=" & Iif(chkA.Value=1, "True", "False") & _
" WHERE codperfil= " & TxtCodigo.Text
(fíjate en que no se concatena directamente el valor del checkbox, que siempre es uno o cero).
La función IIf lo que hace es evaluar el primer parámetro, igual que un If normal, y devolver el segundo parámetro si la condición es cierta, o el segundo si es falsa; eso significa que "IIf(ChkA.Value=1, "True", "False")" devuelve la cadena "True" si ChkA.Value es 1 y la cadena "False" si ChkA.Value no es uno, porque recuerda que también puede admitir el valor 2.