Reemplazar el primer dígito de un número de Serie con la condición que empiece con la letra S

Tengo un listado de Números de Series de los cuales muchos de ellos comienzan con la letra “S”. Intento crear una macro que elimine el primer dígito pero solo si es “S”.

Intente con Reemplazar, pero la S puede estar también dentro de cualquier parte de la serie y no debo eliminarla. También intente con Texto e columnas, partiendo el texto en el primer dígito y saltando la primera columna pero algunas series no comienzan con S y elimina todos los primeros dígitos y con ellos los que no comienzan por S.

Les consulto: ¿Hay alguna manera por VB de hacer un reemplazo del primer dígito con la condición que sea “S”?

1 respuesta

Respuesta
1

Estoy apurado y me tengo que, pero puedo ponerte la macro que usaría en tu caso, pero sin explicación alguna, espero que te sirva.
For i = 1 To 100

    If Mid(Cells( i, "A").Value, 1,1) = "S" Then

         Largo = Len(Cells(i, "A").Value)

         Cells(i, "A").Value = Mid(Cells(i,"A").Value, 2, largo - 1)

    End If

Next i

Rapidamente te explico, que la función mid tiene 3 parámetros, el primero es el string, la línea de caracteres a trabajar, que puede ser una variable, una celda, etc... el segundo es la posición donde comienza a leer, y el tercero es la cantidad de caracteres que va a leer.

Ejemplo:

A1: "Me encanta excel"

Mid(Range("A1"), 5, 3) = "nca"

Esepro te sirva, nos vemos!

Cesar: En verdad funciona excelente. Muchas gracias. Si selecciono la columna A y ejecuto el código, realiza la acción muy bien, pero el inconveniente es que la columna no siempre es A.

¿Como hago para que ejecute el código en el rango que yo elija?

Saludos y desde ya muchísimas gracias.

Si vos buscar trabajar con macros y el motor de visual basic de excel, tenés dos maneras de hacer referencia a una celda. Una es especificar de manera estricta como ser: Range("A1") o Range("A1:A10"). De ésta manera no hay forma de modificar nada, simplemente se hace referencia a A1 o el rango A1:A10.

Pero, podes usar otra forma que es: Cells(1,1) por ejemplo. La anterior forma, hace referencia a una celda o rango en particular, la segunda (utilizando cells), hace referencia a una celda o rango que sea indicado pero que puede variar mediante valores o variables, ya que esos valores pueden ser una variable o un número fijo. Es decir, Cells(1,1).Select selecciona la celda A1 de la hoja que se encuentre activa en el momento. Si ponemos Cells(1, columna).Value , estamos hablando de que esta acción, va a tomar el valor de la fila 1, pero hace referencia a la columna que en este caso, valga la variable columna, es decir, que si la variable columna vale 3, hace referencia a la celda C1.
Digamos que Cells está compuesta primero de la fila, y luego de la coma, el valor de la columna. Ambos son números enteros, las filas siempre se manejan en números, pero en columnas, la A = 1, B=2, C=3, 4=5, etc...
De cualquier forma, ambos valores, pueden ser variables que se modifican según un criterio, así podes establecer mediante macros, el criterio que vos quieras. Te dí el ejemplo de Cells(1, columna). Value, porque yo siempre llamo: "columna" a las variables que contienen el valor de la columna, y "fila" le llamo a las variables que van a indicar a una instrucción que ésa es la fila.
También puede especificarse la columna como en el ejemplo anterior, donde especifiqué Cells(i,"A"). Value, pero esto sirve para tratar solamente la columna "A".

Voy a darte un par de sintaxis correctas para que comprendas mejor y para que compares entre ambas formas:
Range("A1").Value

Range("A1").Select

Cells(1,1).Value

Cells(1,1).Select

Dim columna As Integer

Columna = 5

valor = Cells(1, columna).Value

Esta última, cargaría en la variable "valor", el valor que tiene en ese momento la celda E1

Cesar buenos días: Muchas gracias por la excelente explicación que me ayudo mucho a entender.

De acuerdo a lo que interprete (si interprete bien), hice lo siguiente:

Declare la variable "columna" y reemplace "A" por "columna". pero me tiro el siguiente error: "Error definido por aplicación o el objeto"

El código quedo así:

Sub prueba()

Dim columna As Integer

For i = 1 To 100
If Mid(Cells(i, columna).Value, 1, 1) = "S" Then
largo = Len(Cells(i, columna).Value)
Cells(i, columna).Value = Mid(Cells(i, columna).Value, 2, largo - 1)
End If
Next i

End Sub

¿Me indicarías por favor que hice mal?

Desde ya, agradezco tu ayuda y buena predisposición. 

Saludos Jorge.

Has creado la variable columna como un entero, pero no le diste ningún valor, así que no puede ejecutarse nada con el código. Si por ejemplo, hubieses colocado: columna = 3, la macro trabajaría sobre la columna "C", pero en este caso, la variable no tiene valor, entonces el programa no entiende qué debe leer o modificar.

El valor de esa variable tiene que representar un número entero, y podes establecerlo como vos quieras, pero algo tiene que valer. Por ejemplo:

columna = 3
columna = TextBox1 * 1                             // (*)Nota

columna = Range("A1")

(*) Nota: Si vas a utilizar los valores que se encuentran en un textbox, siempre multiplicalos por 1 (* 1) ya que siempre serán tomados como texto, y no podrás utilizarlos para realizar un cálculo. En cambio, si los multiplicas por 1, entonces sí serán interpretados como un valor numérico operable, es como cambiar el formato de texto a número, pero siempre y cuando no haya otro caracter que impida tal multiplicación como ser un símbolo o una letra. También tené en cuenta, que si el textbox está vació, te arrojará un error ya que no puede multiplicar nada por 1. Suelo utilizar:
If TextBox1 <> "" Then columna = TextBox1 * 1

Cesar: Muchas gracias por tu respuesta.

Si efectivamente omití darle el valor a la variable. El tema es que, como te comente anteriormente, la columna no siempre es la misma dado que utilizo varios reportes donde debo hacer estos cambios. En otras palabras la columna puede ser A, B, C o cualquier otra.

Lo que intento hacer es que la variable tome el valor de la columna que yo seleccione o pinte con el mouse, o un rango de la columna que elija seleccionádola de modo que me sirva para los distintos reportes con los que trabajo. (No se si eso se le llama columna activa o celda activa: ActiveCell o algo parecido)

Mi pregunta es: ¿Es posible hacer que la variable tome el valor desde una selección de celdas?

Desde ya, agradezco tu buena predisposición.

Jorge.

No sé en qué momento ni de qué manera ejecutas la macro. Porque podes hacer:

columna = Range ("A1")

Luego pones 1, 2, o el número que quieras representando una columna en la celda A1, y luego ejecutas la macro. Pero no sé cómo la ejecutas, su es un botón en la hoja, en un formulario, la llamas manualmente, etc.

También podes hacer que una macro se de cuenta cual es la columna, por eso no puedo darte más ayuda con esa info

¡Gracias! 

La macro la ejecuto desde un botón en la barra de herramientas.

La idea era seleccionar un rango de celdas y ejecutar la macro para que actúe sobre la selección.

Te agradezco tu dedicación y la información dada.

Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas