Por qué no me funciona esta macro? Me da error 70 en la línea Open.
Sub exportar()
Dim numero, xpunto, ypunto, zpunto As Integer
Dim codigo As String
Dim destino As Variant
destino = Application.GetSaveAsFilename("nombrepordefecto", "Text Files (*.txt), *.txt", 1, "título de la ventana, yo pondría ...como paco no hay ninguno")
If destino <> False Then 'cuando se pulsa cancelar, en destino se almacena el valor "Falso", porque es una variable tipo texto, esto no funcionará en todos los idiomas
MsgBox "Se grabará como.. " & destino
'ActiveWorkbook.SaveAs Filename:=destino, FileFormat:=xlText, CreateBackup:=False
End If
fil = 10
col = 1
Open destino For Output As #1
For i = 0 To numero
numero = ActiveSheet.Cells(fil + i, col + 1).Value
xpunto = ActiveSheet.Cells(fil + i, col + 6).Value
ypunto = ActiveSheet.Cells(fil + i, col + 7).Value
zpunto = ActiveSheet.Cells(fil + i, col + 8).Value
Print #1, numero & "," & xpunto & "," & ypunto& ","&zpunto
Next i
Close #1
End Sub
el error 70 es un error de permisos por no poder acceder al archivo
¿el archivo está en uso?¿lo tienes abierto con Excel?
Según el programa con el que lo tengas abierto, puede que lo bloquee para otros programas.
Por cierto, me gusta mucho el título que pones en tu ventana GetSaveAsFilename
------
Ya sé Excel, pero necesito más.
No, no lo tengo abierto con ningún programa, ni con el mismo. Al menos que yo sepa.
Lo primero que hace la macro es pedirme, en una ventana, el nombre del archivo. Puedo elegir el nombre que sea pero uqe siempre me devuelve el error 70.
¿tienes algún otro archivo de texto abierto?
en la instrucción Open le dices que abra el archivo como número 1 (#1)
prueba con FreeFile para saber cuál es el siguiente número de archivo libre.
NúmeroArchivo = FreeFile ' Obtiene el número de archivo libre
Open destino For Output As #NúmeroArchivo
------
Ya sé Excel, pero necesito más.
por cierto, tu código a mí me funciona sin problemas, crea el archivo y escribe en él.
------
Ya sé Excel, pero necesito más.
Con Freefile funciona perfectamente salvo...
me almacena npunto bien
me almacena xpunto bien pero con muchos decimales .¿cómo hago que redondee a 3 decimales?
me almacena ypunto igual que x punto
pero
sólo me almacena la parte entera de zpunto!!!
no tengo muy claro que sea por lo de freefile, pero si ya funciona no lo vamos a tocar más.
Respecto de los decimales:
utiliza la función Format para dar formato a tus números
Para el caso de zpunto, mira cómo has declarado la variable, la tienes como integer, así que la considera un entero y por eso no guarda la parte decimal.
lo de la x y la y, a mí me guarda el valor que hay en cada celda.
por cierto, ¿por qué lees la variable numero dentro del bucle? así no parece que sirva de nada ¿no?
------
Ya sé Excel, pero necesito más.
Es verdad. Sólo me interesa numero As Integer y el resto como como single.
Pero cuando declaro variables y quiero tres variables como single,una como string y otra como Integer, tengo que nombrar el tipo de variable al declarar la variable??
¿no vale decir
Dim numero As Integer
Dim xpunto, ypunto, zpunto As Single
Dim codigo As String
???
En el caso del código que es variable tipo Texto. ¿como debo hacer para leerla en el bucle?
pd. numero no tiene por que ser correlativo. Es la identificación del punto pero puede ser cualquier entero.
en vba, tienes que declarar el tipo de cada variable, si no indicas el tipo, la variable se interpreta como tipo Variant, que puede ser cualquier cosa, es decir, que está declarada sin más, pero no es de un tipo concreto:
en esta línea
Dim xpunto, ypunto, zpunto as Single
sólo estás declarando como Single zpunto (xpunto e ypunto son tipo variant)
si quieres declarar las tres como Single debes escribirlo así:
Dim xpunto as Single, ypunto as Single, zpunto as Single
la variable tipo string se lee igual que las numéricas, con la propiedad .value de la celda donde esté el dato en cuestión
------
Ya sé Excel, pero necesito más.
Ahora que me doy cuenta. El bucle es desde cero hasta la variable numero. Pero numero es el nombre del punto y no tiene ni que ser correlativo. ¿cómo controlo el fin del bucle si no sé cuando va a terminar? Bueno terminará cuando el numero sea vacio. ¿cómo es esta condición?
en vez de un bucle For utiliza un bucle Do
Do Until ...
...
Loop
la otra opción es poner un bucle For y salir de él con Exit For
For .... to ...
If ... Then Exit For
Next
------
Ya sé Excel, pero necesito más.
For .... to ...
If ... Then Exit For
Next
OK funciona perfectamente pero he tenido que hacer un for i=0 to 10000... es decir tengo un tope máximo de puntos a exportar.. es una ñapa pero....
En estos casos en que no sabes cuántas veces hay que hacer el bucle en mejor un Do ... Loop
por cierto, también hay un Exit Do por si quieres salir a la mitad
Do
...
Exit Do
Loop
------
Ya sé Excel, pero necesito más.
Como te dice Paco, lo mejor es un Do...Loop
A mí me gusta mucho cómo funciona el Do While ... Loop
Esto comprueba que se da una condición, y si no se da termina el bucle.
Si te da igual lo que haya en la variable, pero sabes con qué valor concreto (puede ser ninguno) salir, puedes probar con Do Until ... Loop
Saludos