Error 13 no coinciden los tipos Vba Excel

Tengo un macro que me manda error y no se como solucionarlo ya intente varias forma y hasta ahora nada, agradecería su ayuda

El error me lo marca en esta línea

Range("E" & A - 1) = Format((Range("D" & A - 1) / Range("D6")) * 100, "0.00%")

este es la macro completa

Private Sub CommandButton1_Click()
Dim VUELTAS, VMENSAJE, A, B, VDEBE, VHABER, VDEBEF, VHABERF As Single
VUELTAS = Sheets("RESULTADO").Cells(10000, 3).End(xlUp).Row
MsgBox ("Genere primero la balanza de comprobación")
Application.ScreenUpdating = False
VMENSAJE = MsgBox("¿Se genera el estado de resultados", vbYesNo + vbQuestion, "Resultados")
VDEBE = 0
VHABER = 0
VDEBEF = 0
VHABERF = 0
If VMENSAJE = 6 Then
Range("d6:l10000").ClearContents
For A = 6 To VUELTAS
If Range("A" & A) <> "" Then
Range("D" & A).FormulaArray = _
"=IFERROR(IF(RC[8]=""D"",SUM((LOWER(ERESULTADOS)=LOWER(RC[7]))*BALDEBE),SUM((LOWER(ERESULTADOS)=LOWER(RC[7]))*BALHABER)),0)"
Range("F" & A).FormulaArray = _
"=IFERROR(IF(RC[6]=""D"",SUM((LOWER(ERESULTADOS)=LOWER(RC[5]))*BSALDOF),(SUM((LOWER(ERESULTADOS)=LOWER(RC[5]))*BSALDOF))),0)"
Range("K" & A).Formula = _
"=IFERROR(VLOOKUP(" & Range("A" & A) & ",ORDENRE,2,FALSE),""Cuenta no encontrada"")"
Range("L" & A).Formula = _
"=IFERROR(VLOOKUP(" & Range("A" & A) & ",ORDENRE,3,FALSE),""Cuenta no encontrada"")"
End If
Next A
Range("D6", "L" & VUELTAS).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
For B = 6 To VUELTAS
If Range("L" & B) = "D" Then
VDEBE = VDEBE + Range("D" & B)
VDEBEF = VDEBEF + Range("F" & B)
ElseIf Range("L" & B) = "A" Then
VHABER = VHABER + Range("D" & B)
VHABERF = VHABERF + Range("F" & B)
Else
If Range("C" & B) <> "" And Range("D" & B) = "" And Range("G" & B) = "" Then
Range("D" & B) = VHABER - VDEBE
Range("F" & B) = VHABERF - VDEBEF
End If
End If
Next B
Range("K6:L10000").ClearContents
Range("D6").Select
For A = 6 To VUELTAS
If Range("A" & A) <> "" And Range("d" & A) > 0 Then
Range("E" & A) = Format((Range("D" & A) / Range("D6")) * 100, "0.00%")
Range("G" & A) = (Range("F" & A) / Range("F6")) * 100
End If
Next A
If Range("D" & A - 1) > 0 Then
Range("E" & A - 1) = Format((Range("D" & A - 1) / Range("D6")) * 100, "0.00%")
Range("G" & A - 1) = (Range("F" & A - 1) / Range("F6")) * 100
End If
MsgBox ("Proceso terminado")
Range("D6").Select
Application.ScreenUpdating = True
Else
MsgBox ("El estado de resultados no se genero")
End If
End Sub

2 Respuestas

Respuesta

¿Podrías indicar en que parte te da el error?

lo dije al inicio de la pregunta  

Range("E" & A - 1) = Format((Range("D" & A - 1) / Range("D6")) * 100, "0.00%")

gracias

Podrías intentar lo siguiente:

Range("E" & A - 1) = Format((Range("D" & A - 1).value / Range("D6").value) * 100, "0.00%")

o podrias probar lo que dice Elsa. Cualquier resultado que te de lo comentas

Respuesta
2

La macro no da error... por supuesto que con mis datos, tendrás que verificar qué datos se quedan en las variables antes de esa línea.

Colocá un pto de interrupción delante de la línea que indicas. Al detenerse el proceso allí pasa el mouse para verificar qué datos contienen las celdas D6 y D (A-1)

O podés colocar justo por encima de esta instrucción algún Msgbox que te muestre esos valores, x ej:

Msgbox Range("D6")     y así con la otra.

Sdos y no olvides valorar la respuesta cuando quede resuelta, sino comenta.

Gracias por su respuesta me gustaría me dijeta como quedaría con el punto de interrupción

Range("E" & A - 1) = Format((Range("D" & A - 1) / Range("D6")) * 100, "0.00%")
Range("G" & A - 1) = (Range("F" & A - 1) / Range("F6")) * 100
End If
MsgBox ("Proceso terminado")
Range("D6").Select
Application.ScreenUpdating = True
Else
MsgBox ("El estado de resultados no se genero")
End If
End Sub

Gracias

Digo como quedaría con el Msgbox ya le coloque el punto de interrupción

Adjunto imagen para una mejor comprensión:

Hacé clic delante de la instrucción que ahora se ve de amarillo.

Cuando vuelvas a ejecutar el proceso se detendrá allí y te permitirá observa el valor que tiene cada celda, pasando el mouse por encima.

La opción 'value' no es necesaria para realizar los cálculos porque Excel lo considera como predeterminado... solo aquí la agregué para observar su contenido.

OTRO MODO: es colocando por encima las instrucciones con MsgBox que ahora te incluí en la imagen.

Seguramente están tomando valores que no se pueden formatear. Lo correcto sería que quites la opción de Format y luego a la celda le des formato de este modo:

Range("E" & A - 1) = (Range("D" & A - 1).Value / Range("D6").Value) * 100
Range("E" & A - 1).NumberFormat = "%"

Sdos!

lo hice como le comenta y me salta error 

f Range("D" & A - 1) > 0 Then
'colocar mensajes para concer valores
MsgBox Range("D6")
MsgBox Range("D" & A - 1)
'----
Range("E" & A - 1) = Format((Range("D" & A - 1).Value / Range("D6").Value) * 100, "0.00%")
Range("G" & A - 1) = (Range("F" & A - 1) / Range("F6")) * 100
End If

y sale del mes
adjunto imagen

Te puedo pasar el archivo para que lo revisé con la confianza de privacidad del mismo

Si claro, mis correos aparecen en la portada de mi sitio que dejó al pie.

De todos modos esta claro que tu celda tiene un texto en lugar de un valor por eso nopuedee realizar el cálculo.

Pero envíame el libro y te comento allí mismo.

¡Gracias! 

envidado y gracias por su apoyo

La clave enviada no abre ni la hoja ni el Editor.

Y no necesitas valorar la respuesta antes de recibirla ... luego te pediré que la modifiques ;)

Sdos!

Ya le envíe al correo las claves de hojas y editor espero comentario

Gracias

Acabo de enviarlo con el ajuste.

También debieras hacer un pequeño agregado al evento Open para que no se vea todo ese movimiento de hojas ... agrega las líneas que dejo en negrita:

Private Sub Workbook_Open()
Dim cHoja As Worksheet
Dim L As Long
Application.ScreenUpdating = False
For Each cHoja In Worksheets
If cHoja.Name <> Me.Name And cHoja.Name <> "PORTADA" And cHoja.Name <> "REGISTRO" Then
L = L + 1
Sheets(cHoja.Name).Visible = Excel.XlSheetVisibility.xlSheetVeryHidden
End If
Next cHoja
Sheets("PORTADA").Select
Application.ScreenUpdating = True
End Sub

Por favor modifica tu valoración que no se corresponde con lo recibido.

¡Gracias! 

La parte del error que mencionas en tu consulta se debe a que cuando no hay resultados o sea en D no hay datos, A-1 es la fila del título, por lo tanto no se puede realizar cálculos ni darle formato %.

Esto se resuelve con un condicional:

'EMM: cuando no hay datos A-1 es 5 y esa es la fila de títulos, por lo tanto es> 0
If A > 6 Then
    If Range("D" & A - 1) > 0 Then
        Range("E" & A - 1) = Format((Range("D" & A - 1) / Range("D6")) * 100, "0.00%")
        Range("G" & A - 1) = (Range("F" & A - 1) / Range("F6")) * 100
    End If
End If
  MsgBox ("Proceso terminado")

Ahora, porqué no hay datos??? eso ya lo tendrás que revisar en tu proceso. Si necesitas alguna ayuda con el resto deja una nueva consulta en el tablón indicando la sección de código que debe ser analizada.

Sdos!

gracias de antemano por su ayuda

pero no me toma datos de la balanza y me deja todo en cero podría revisar de nuevo el codigo de estado  el porque no toma datos dejo el codigo para analizar

Private Sub CommandButton1_Click()
 Dim VUELTAS, VMENSAJE, A, B, VDEBE, VHABER, VDEBEF, VHABERF As Single
 VUELTAS = Sheets("RESULTADO").Cells(10000, 3).End(xlUp).Row
 MsgBox ("Genere primero la balanza de comprobación")
 Application.ScreenUpdating = False
 VMENSAJE = MsgBox("¿Se genera el estado de resultados", vbYesNo + vbQuestion, "Resultados")
 VDEBE = 0
 VHABER = 0
 VDEBEF = 0
 VHABERF = 0
 If VMENSAJE = 6 Then
  Range("d6:l10000").ClearContents
  For A = 6 To VUELTAS
   If Range("A" & A) <> "" Then
    Range("D" & A).FormulaArray = _
        "=IFERROR(IF(RC[8]=""D"",SUM((LOWER(ERESULTADOS)=LOWER(RC[7]))*BALDEBE),SUM((LOWER(ERESULTADOS)=LOWER(RC[7]))*BALHABER)),0)"
    Range("F" & A).FormulaArray = _
        "=IFERROR(IF(RC[6]=""D"",SUM((LOWER(ERESULTADOS)=LOWER(RC[5]))*BSALDOF),(SUM((LOWER(ERESULTADOS)=LOWER(RC[5]))*BSALDOF))),0)"
    Range("K" & A).Formula = _
        "=IFERROR(VLOOKUP(" & Range("A" & A) & ",ORDENRE,2,FALSE),""Cuenta no encontrada"")"
    Range("L" & A).Formula = _
        "=IFERROR(VLOOKUP(" & Range("A" & A) & ",ORDENRE,3,FALSE),""Cuenta no encontrada"")"
   End If
  Next A
  Range("D6", "L" & VUELTAS).Select
  Selection.Copy
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
  Application.CutCopyMode = False
  For B = 6 To VUELTAS
   If Range("L" & B) = "D" Then
    VDEBE = VDEBE + Range("D" & B)
    VDEBEF = VDEBEF + Range("F" & B)
   ElseIf Range("L" & B) = "A" Then
    VHABER = VHABER + Range("D" & B)
    VHABERF = VHABERF + Range("F" & B)
   Else
    If Range("C" & B) <> "" And Range("D" & B) = "" And Range("G" & B) = "" Then
     Range("D" & B) = VHABER - VDEBE
     Range("F" & B) = VHABERF - VDEBEF
    End If
   End If
  Next B
  Range("K6:L10000").ClearContents
  Range("D6").Select
  For A = 6 To VUELTAS
   If Range("A" & A) <> "" And Range("d" & A) > 0 Then
    Range("E" & A) = Format((Range("D" & A) / Range("D6")) * 100, "0.00%")
    Range("G" & A) = (Range("F" & A) / Range("F6")) * 100
   End If
  Next A
  ''EMM: cuando no hay datos A-1 es 5 y esa es la fila de títulos, por lo tanto es> 0
If A > 6 Then
    If Range("D" & A - 1) > 0 Then
        Range("E" & A - 1) = Format((Range("D" & A - 1) / Range("D6")) * 100, "0.00%")
        Range("G" & A - 1) = (Range("F" & A - 1) / Range("F6")) * 100
    End If
End If
  MsgBox ("Proceso terminado")
  Range("D6").Select
  Application.ScreenUpdating = True
 Else
  MsgBox ("El estado de resultados no se genero")
 End If
End Sub

Ahora tendrás que ir colocanto puntos de interrupción en un par de líneas para ir viendo los valores que toman las variables.

Esto ya no tiene que ver con tu consulta original... de todos modos te respondo pero si esto seguirá tendrás que iniciar una nueva consulta en el tablón... indica que es para Elsa si te parece.

Lo que encontré tan solo iniciarlo:

VUELTAS = Sheets("RESULTADO").Cells(10000, 3).End(xlUp).Row

Y al colocar un pto de interrupción en el inicio del bucle verás que VUELTAS solo toma el valor 1. Por lo tanto no se ejecuta el bucle y nada se pasa.

Revisa si no te falta un título en la celda C5 o una celda donde le indiques la cantidad de vueltas... yo desconozco tu proceso por lo que solo te puedo indicar dónde está el problema.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas