Saltar al contenido

Seleccionar Rango y Copiar formula con VBA y R1C1


merlow

Recommended Posts

publicado

Estimados..

Buenas Tardes..

En esta oportunidad les pido ayuda para tratar de hacer lo siguiente:

En el modulo de VBA, hay formulas que evaluan valores y se copian en las celdas correspondientes; para lo cual utilizo el objeto FormulaLocal y este es justamente el problema... este archivo que va a ser abierto desde diferentes terminales, con diferentes versiones de Excel.. (ingles, español y frances). Por lo que este archivo solo funciona en la PC en la cual lo estoy armando y no en todas las versiones.

Estuve leyendo por ahi, y dicen que la notacion R1C1 es la ideal para este tipo de cosas, ya que es indistinto en que Pc se abra el archivo y el idioma que tenga la misma.

Hay algo que estoy haciendo mal al tratar de pasar las formulas que tengo a R1C1, ya que llegado el momento de copiar la formula en el rango seleccionado, me pega el texto de la formula y no la formula en si misma...

A ver si alguno de Uds, me puede dar una manito y me dice que es lo que estoy haciendo mal..

Tambien Acepto sugerencias para pulir el codigo.. Muchas Gracias

Base FORO.zip

publicado

Buenas, merlow

Me da que la "F" de tus fórmulas la tienes que cambiar por "R".........y debes tener en cuenta que lo que utilizas es una referencia relativa a la celda desde la que estás creando la fórmula....

Por ejemplo.........si estás en la celda "C4" y escribes ........"R-1C1"......le estás diciendo que haga algo con la casilla que está una fila hacia arriba (R-1) y con una columna a la derecha (C1)........por tanto, el valor que buscabas sería "D3"..........

Si necesitas indicarle que es la misma fila o la misma columna no incluyas número tras "R" ó "C".......así....."R-5C" (misma columna)......ó "RC3" (misma fila)....

No sé si te ha servido ó ha sido peor aún al liarte más.....jejeejeje

Un saludo,

Tese

publicado

Al usar "FormulaLocal", fuerzas a que la función introducida en la formula, sea en el idioma del Office en el cual se corre la instrucción, por lo que si esto:


Range("AE2:AE" & Qreg).FormulaLocal = "=SI(R2=""NO"";SI(AD2>0;0;AD2);(AB2-S2)/CONTAR.SI($B$2:$B$4905;$B2))"
[/CODE]

Lo corres en un Office en Ingles, Alemán u otro que no sea el Castellano/Español pues como bien comentas, dará error. Cuando usas 'FormulaR1C1' (que también tiene su opción 'local': 'FormulaR1C1Local') como bien estas haciendo hay que usar las funciones en Ingles, que es el idioma del VBA, claro que el gran problema es usar bien las referencias que como bien te dice Tese, resulta a veces algo complicado, ademas de tener en cuenta su observación sobre el uso de la 'F' que estabas aplicando.

¿Y como podemos para que en cualquier Office inserte la función con el idioma adecuado ademas de no loquearnos con las referencias 'RC'? Pues hay que usar el idioma del VBA (que ya dije que es el Ingles) y usar la propiedad "Formula":

[CODE]
Range("AE2:AE" & Qreg).Formula = "=IF(R2=""NO"";SI(AD2>0;0;AD2);(AB2-S2)/COUNT.IF($B$2:$B$4905;$B2))"
[/CODE]

De ese modo, sea cual sea el idioma del Office, esa linea de código, al insertarlo en la celda correspondiente cambiara la función al idioma correspondiente.

Abraham

publicado

Tese y Avalencia: Muchas Gracias por la explicacion. Me ha quedado mucho más claro el tema de R1C1. Tenía un error de concepto mio en cuanto a las referencias.

Avalencia: Probé con tu código cambiando todo al ingles y me arroja el error de tipo "#Nombre" al insertar las formulas.

Tambien probé una por una en cada celda y me sigue arrojando el mismo error.

Alguna sugerencia de donde podria estar la cuestion?

Muchas Gracias.

publicado

Abraham..

La modificación del codigo sirvió. Tuve que modificar tambien las ";", por ",".. como en VB.

Sin embargo hay dos columnas que me arrojan error 1004 en tiempo de ejecución. La columna S y la AB...

Alguna Idea?

publicado

Hola:

Normalmente cuando solo envió un par de lineas de código, nunca lo pruebo y solo lo escribo 'de memoria' o haciendo un copiar/pegar de lo que alguien envió. En este caso, hice lo mismo y deje los "puntos y comas", pero solo para que quede claro procedo a comentar algo de teoría:

- EL VBA esta en Ingles, por lo tanto se comporta acorde a dicho idioma, lo que en la practica significa que:

1- Cuando usamos propiedades como 'Formula', las funciones introducidas deben estar en Ingles y el Excel lo cambiara al idioma correspondiente en la hoja de Excel

2- En esos mismos casos, el separador de lista siempre sera la 'coma', y del mismo modo el Excel lo cambiara a 'punto y coma' si así lo usamos nosotros en la hoja de Excel

3- El separador de decimales en VBA siempre es el 'punto', y del mismo modo Excel lo cambiara si lo usamos en una hoja de Excel

Creo que así ahora todo quedara más claro. Sobre tu error actual, ¿ podrías enviar tu archivo con las modificaciones?

Abraham

publicado

Amigos:

Buenas Tardes.

Mi error estaba en justamente lo que menciona avalencia: El separador de decimales. Estaba poniendo la "coma" en vez del "punto".

Doy por finalizada la consulta, no sin antes agradecer a Avalencia y Tese, por la ayuda prestada y el tiempo empleado en ayudarme y evacuar mis dudas.

Nuevamente, muchas Gracias.

Tema Cerrado.!

  • 2 weeks later...

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      188
    • Comentarios
      98
    • Revisiones
      29

    Más información sobre "Cambios en el Control Horario"
    Última descarga
    Por pegones1

    4    1

  • Crear macros Excel

  • Mensajes

    • Buenos días  @LeandroA espero estes bien Tengo un caso idéntico al planteado en la siguiente pregunta: Sin embargo, a diferencia de quien planteo originalmente la pregunta al correr el código no obtengo ningún resultado podrían ayudarme a resolver este inconveniente y que al hacer click en el Botón Guardar (CommandButton3) del Formulario RCS (frmrcs) el archivo pdf quede configurado con orientación vertical, márgenes superior, inferior, derecho e izquierdo = 1 y en página tamaño carta. Si acaso influye uso Microsoft Excel LTSC MSO (versión 2209 Compilación16.0.1.15629.20200) de 64 bits Mucho le sabre agradecer la ayuda que me pueda dar  RCS PRUEBA - copia.xlsm
    • @JSDJSDCon gusto mi estimado Para la opción 1: Sub Surtirhastadondealcanse() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 4 Dim filaFin As Integer: filaFin = 7 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Else solicitudes(i) = 0 End If surtido(i) = "POR FALTA STOCK" Next i ' Surtir de acuerdo al inventario disponible For i = 1 To numClientes If solicitudes(i) > 0 Then If inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) ElseIf inventario > 0 Then surtido(i) = inventario totalSurtido = totalSurtido + inventario inventario = 0 Else surtido(i) = "POR FALTA STOCK" End If End If Next i ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = "POR FALTA STOCK" Then .Value = surtido(i) .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Para la opción 2:   Sub surtirenpartesiguales() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) Dim filaInicio As Integer: filaInicio = 13 Dim filaFin As Integer: filaFin = 16 Dim colInventario As Integer: colInventario = 2 Dim colSolicitudesInicio As Integer: colSolicitudesInicio = 4 ' Columna C Dim colResultadoInicio As Integer: colResultadoInicio = 9 ' Columna I Dim colTotalSurtido As Integer: colTotalSurtido = 12 ' Columna L Dim colFinalInventario As Integer: colFinalInventario = 13 ' Columna M Dim numClientes As Integer: numClientes = 3 Dim fila As Integer, i As Integer For fila = filaInicio To filaFin Dim inventario As Double inventario = Val(ws.Cells(fila, colInventario).Value) Dim solicitudes(1 To 3) As Double Dim surtido(1 To 3) As Variant Dim totalSurtido As Double: totalSurtido = 0 Dim totalPedido As Double: totalPedido = 0 ' Leer solicitudes For i = 1 To numClientes If IsNumeric(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) Then solicitudes(i) = CDbl(ws.Cells(fila, colSolicitudesInicio + i - 1).Value) totalPedido = totalPedido + solicitudes(i) Else solicitudes(i) = 0 End If surtido(i) = 0 Next i ' Si hay suficiente inventario, surtir lo que el cliente pide If inventario >= totalPedido Then For i = 1 To numClientes If solicitudes(i) > 0 And inventario >= solicitudes(i) Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) End If Next i Else ' Reparto base igualitario Dim baseSurtido As Long baseSurtido = Int(inventario / numClientes) For i = 1 To numClientes If solicitudes(i) > 0 Then If solicitudes(i) <= baseSurtido Then surtido(i) = solicitudes(i) inventario = inventario - solicitudes(i) totalSurtido = totalSurtido + solicitudes(i) Else surtido(i) = baseSurtido inventario = inventario - baseSurtido totalSurtido = totalSurtido + baseSurtido End If End If Next i ' Repartir sobrante restante uno por uno, respetando lo pedido Do While inventario > 0 For i = 1 To numClientes If surtido(i) < solicitudes(i) Then surtido(i) = surtido(i) + 1 totalSurtido = totalSurtido + 1 inventario = inventario - 1 If inventario = 0 Then Exit For End If Next i Loop End If ' Escribir resultados en las columnas correspondientes para cada cliente For i = 1 To numClientes With ws.Cells(fila, colResultadoInicio + i - 1) If surtido(i) = 0 Then .Value = "POR FALTA STOCK" .Font.Color = vbRed Else .Value = surtido(i) .Font.Color = vbBlack End If End With Next i ' Escribir total surtido y existencia final ws.Cells(fila, colTotalSurtido).Value = totalSurtido ws.Cells(fila, colFinalInventario).Value = inventario Next fila MsgBox "Resultado surtido cargado con éxito...", vbInformation End Sub Saludos, Diego
    • Buenos dias.  Estoy trabajando en una hoja para poder llevar un control de un pequeño almacén.  Tengo un pedido con varias líneas y "lotes" y necesito sacar las ubicaciones que coincidan con la referencia y lote que pone en el pedido. El problema viene cuando tengo la misma referencia y mismo lote en ubicaciones diferentes y necesito sacar la información en columnas diferentes. No se si  me he explicado bien, pero creo que con el ejemplo adjunto se entiende mejor. Agradecería mucho si me pudieran ayudar  Libro1.xlsx
    • Exelente solución mil gracias 
    • Podrías compartir tu solucion
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.