Colocar números en negativo o positivo en columna saldo

Estoy haciendo una macro, que copia datos desde una hoja a otra.

La hoja1 tiene el origen de los datos, la misma posee las columnas debe y haber.

La segunda hoja que es la hoja destino, posee las columnas debe haber y saldo.

Ahora, yo copio las columnas debe y haber tal cual como están, el problema surge, es cuando quiero colocar en saldo los valores. Cabe destacar que por otras fórmulas. Si hay datos en el debe en el saldo debe colocarse este mismo dato pero en negativo, y si hay datos en el haber, en el saldo debe colocarse el mismo dato pero en positivo. Cabe destacar que siempre habrá datos o en debe o en haber, nunca en ambos casos.

Hasta ahora tengo lo siguiente.

Dim uFila1 As Long
Dim uFila2 As Long
Dim Col As Long
Dim wbLibroActual1 As Workbook
Dim wsHojaActual1 As Worksheet
Dim wsHojaActual2 As Worksheet
Set wbLibroActual1 = Workbooks(ThisWorkbook.Name) 'nombre del libro
Set wsHojaActual1 = wbLibroActual1.ActiveSheet 'hoja actual activa desde la que se copiaran los datos
Sheets("Gter").Activate  'hoja destino de los datos copiados
Set wsHojaActual2 = wbLibroActual1.ActiveSheet
uFila1 = wsHojaActual1.Range("A" & Rows.Count).End(xlUp).Row
uFila2 = wsHojaActual2.Range("G" & Rows.Count).End(xlUp).Row
 y = uFila2 + 1
wsHojaActual1.Range("A2:A" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 9) 'copia el nombre
wsHojaActual1.Range("B2:B" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 8) 'copia la UN
wsHojaActual1.Range("C2:C" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 7) 'copia la cuenta
wsHojaActual1.Range("D2:D" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 10) 'COPIA LA FECHA
wsHojaActual1.Range("E2:E" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 11) 'factura
wsHojaActual1.Range("G2:F" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 14) 'GLOSA
wsHojaActual1.Range("H2:H" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 15) 'DEBE
wsHojaActual1.Range("I2:I" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 16) 'HABER

Pero no logro realizar alguna funcion para poder colocar en la casilla saldo el numero en negaativo o positivo segun corresponda.

2 respuestas

Respuesta
3

Puedes poner una imagen de la hoja2 con datos y el resultado que quieres para el saldo.

Hola adjunto imagenes, en la primera la columna debe tiene valor y en saldo se coloca el mismo valor pero en negativo. y en la segunda imagen la columna haber tiene valor, y en saldo se coloca este mismo valor pero como positivo.

y como dije antes, si hay datos en haber, no hay datos en debe y viceversa.

Simplifiqué un poco el código:

Sub test()
  Dim ws1 As Worksheet, ws2 As Worksheet
  Dim uFila1 As Long
  Dim uFila2 As Long
  '
  Set ws1 = ActiveSheet  'hoja actual activa desde la que se copiaran los datos
  Set ws2 = Sheets("Gter")  'hoja destino
  uFila1 = ws1.Range("A" & Rows.Count).End(xlUp).Row
  uFila2 = ws2.Range("G" & Rows.Count).End(xlUp).Row + 1
  ws1.Range("A2:A" & uFila1).Copy ws2.Cells(uFila2, 9) 'copia el nombre
  ws1.Range("B2:B" & uFila1).Copy ws2.Cells(uFila2, 8) 'copia la UN
  ws1.Range("C2:C" & uFila1).Copy ws2.Cells(uFila2, 7) 'copia la cuenta
  ws1.Range("D2:D" & uFila1).Copy ws2.Cells(uFila2, 10) 'COPIA LA FECHA
  ws1.Range("E2:E" & uFila1).Copy ws2.Cells(uFila2, 11) 'factura
  ws1.Range("G2:F" & uFila1).Copy ws2.Cells(uFila2, 14) 'GLOSA
  ws1.Range("H2:H" & uFila1).Copy ws2.Cells(uFila2, 15) 'DEBE
  ws1.Range("I2:I" & uFila1).Copy ws2.Cells(uFila2, 16) 'HABER
  '
  With ws2.Range("Q" & uFila2).Resize(uFila1 - 1)
    .Formula = "=IF(" & .Offset(, -1).Cells(1).Address(0, 0) & "=""""," & _
    .Offset(, -2).Cells(1).Address(0, 0) & "*-1," & .Offset(, -1).Cells(1).Address(0, 0) & ")"
  End With
End Sub

Nota: Revisa tu operación en el saldo, los DEBE deberían ser positivos y los HABER negativos. Pero la fórmula está como tu lo pediste.

Respuesta
1

No se comprende bien el tema del saldo. Mencionas:

'... Si hay datos en el debe en el saldo debe colocarse este mismo dato pero en negativo, y si hay datos en el haber, en el saldo debe colocarse el mismo dato pero en positivo...'

Si el enunciado es correcto, y necesitas colocar una fórmula, copia las líneas que agregué al final de tu macro. Sino aclarame un poco el tema del saldo.

wsHojaActual1.Range("G2:G" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 14) 'GLOSA
wsHojaActual1.Range("H2:H" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 15) 'DEBE
wsHojaActual1.Range("I2:I" & uFila1).Copy Destination:=wsHojaActual2.Cells(y, 16) 'HABER
'se coloca la fórmula en la primer fila destino, o sea 'y'
wsHojaActual2.Cells(y, 17).FormulaR1C1 = "=IF(RC[-2]<>"""",-RC[-2],IF(RC[-1]<>"""",RC[-1],""""))"
'se evalúa cuál es la última ocupada para arrastrar la fórmula
finx = wsHojaActual2.Range("N" & Rows.Count).End(xlUp).Row      'N si hay datos en col Glosa,
'sino reemplaza por otra letra que ocupe todas las filas
'se la arrastra hasta la última fila ocupada col Q de saldo
 wsHojaActual2.Cells(y, 17).AutoFill _
        Destination:=wsHojaActual2.Range("Q" & y & ":Q" & finx), Type:=xlFillDefault
End Sub

Hay varios modos de encontrar la última fila ocupada en Hoja2 (UsedRange, CurrentRegion) pero al no ver el modelo de tu hoja mejor selecciona la letra de la col con datos completos.

NOTA; Revisa la instrucción del pase de GLOSA, el rango se ve como G2:F & uFila1; creo que corresponde la letra G.

Sdos y no olvides valorar mi respuesta.

Elsa

http://aplicaexel.com

Efectivamente es como el enunciado, si en la columna debe hay valores deben pasar el mismo valor a saldo pero en negativo y si en la columna haber hay algún valor, debe pasar a la columna saldo en positivo.

La macro que enviaste la añadí tal cual y pasa todos los valores ubicados en debe a saldo en negativo, sin embargo no los del haber.

Esta es la estructura de la hoja destino (hoja2)

y esta de la hoja de donde vienen los datos

Ahora la idea como menciono es cada fila tiene debe o haber, y solo puede tener lleno uno de esos campos, si esta lleno el debe, en saldo se coloca el mismo valor del debe pero en negativo.

Y si en el haber tenemos algún dato, se coloca en saldo el mismo valor pero positivo.

Y como ves, si hay un dato en debe, no hay dato en haber. Y viceversa.

PD: Gracias por la observación de los rangos, efectivamente fue un error mio durante la programación.

Esto es porque al leer '... si hay datos en el debe...' supuse que en ese caso, el haber quedaba vacío, no con 0.

Solo tenés que reemplazar los """" por 0 en la fórmula, quedándote así:

'se coloca la fórmula en la primer fila destino, o sea 'y'
wsHojaActual2.Cells(y, 17).FormulaR1C1 = "=IF(RC[-2]<>0,-RC[-2],IF(RC[-1]<>0,RC[-1],0))"

Y así se verá el resultado:

Sdos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas