excel - Cómo guardar en la ubicación actual del Usuario\Escritorio

CorePress2024-01-16  11

Así que estoy intentando guardar una hoja de cálculo de Excel como un archivo .PRN en el escritorio del usuario actual. Pensé que tal vez había un operador "comodín" estándar que podía usar, pero no lo veo por ninguna parte. Revisé el desbordamiento de pila y encontré información que probablemente sea lo que estoy buscando, pero como no soy programador y no soy muy bueno con Excel, no sé si es lo que quiero y si lo es, dónde ponerlo en mi código.

Esto es lo que estoy ejecutando actualmente y solo funciona en mi máquina:

Sub Save_PRN()
Dim fileName As String
fileName = "C:\Users\cameron\Desktop\PRN Test files\" & Range("'Customer_Info'!R2").Text & ".prn"
ActiveWorkbook.SaveAs fileName:=fileName, FileFormat:=xlTextPrinter, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False
End Sub

Si bien hace lo que quiero, cuando lo subo a nuestro recurso compartido, claramente otro usuario no podrá usarlo. Vi una pregunta que alguien respondió indicando usar esto:

MsgBox CreateObject("WScript.Shell").specialfolders("Desktop")

Pero no sé ni entiendo cómo incorporar eso en mi macro.arriba. Cualquier ayuda o consejo sería genial. ¿Estoy siquiera en el camino correcto?



------------------------------------

Si bien la solución de roryap está perfectamente bien y funciona, me gustaría agregar otra solución que funcione.

Dim strPath as String
strFileName = Environ("USERPROFILE") & "\Desktop\PRN Test files\" & Range("'Customer_Info'!R2").Text & ".prn"
ActiveWorkbook.SaveAs fileName:=strFileName, FileFormat:=xlTextPrinter, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False

2

Interesante. ¿Hay alguna diferencia en la funcionalidad? La sugerencia de @roryap funcionó bien como dijiste. ¿Es una forma mejor que la otra? Si puedo evitarErrores de identificación en el futuro, me gustaría hacerlo, ya que este es el último proyecto en el que estoy trabajando con esta empresa y no quiero que se arruinen.

- Cameron

17/06/2015 a las 15:56

1

Si tiene que almacenarse en el escritorio, entonces la solución de roryap es ligeramente mejor porque la carpeta del escritorio no siempre tiene que almacenarse dentro del perfil de usuario. En realidad, puede estar ubicado en otro lugar y/o estar disponible sin conexión y el servidor vinculado subyacente se convierte en la ruta. Dentro de un entorno Citrix y una granja de servidores, se vuelve aún un poco máscomplicado. Por lo tanto, normalmente prefiero las áreas designadas para almacenar cosas, que generalmente son Environ("TEMP") para archivos temporales o Environ("HOMESHARE") o Environ("HOMEPATH"). Pero para escritorio me quedaría con la solución de roryap.

- Ralph

17/06/2015 a las 16:27



------------------------------------

Puedes usarlo así:

Dim desktopFolderPath As String
desktopFolderPath = CreateObject("WScript.Shell").specialfolders("Desktop")
fileName = desktopFolderPath & "\PRN Test files\" & Range("'Customer_Info'!R2").Text & ".prn"



------------------------------------

La solución es 'tokenizar' estas carpetas estándars símbolos que pueden sustituir la ruta de la carpeta estándar cuando guarda los datos y expandirse a las carpetas especiales definidas localmente de la siguiente máquina cuando los datos se leen nuevamente.

No conozco ningún conjunto de símbolos universalmente aceptados (etiquetas, nombres, abreviaturas o imprecaciones vulgares) para esto: agradecería que alguien pudiera aclararme si los hay, porque se trata de una tarea muy común. y odio reinventar la rueda.

Las ruedas cuadradas bellamente talladas a continuación serán un tema de conversación interesante para su apartamento y una solución torpe a su problema: todo lo que tiene que hacer es guardar el camino hacia abajo a través de la función 'Sustituto' a continuación, cada vez que capture y guarde una ruta de carpeta a su almacén de datos...

...Y lea la ruta usando la función 'Expandir' evCada vez que recupera una ruta de carpeta de su almacén de datos y la utiliza para abrir una carpeta.

Clunk, clunk, clunk: es el sonido distintivo de la recién inventada 'Rueda' en movimiento. También tengo algunos diseños realmente interesantes para una trampa para ratones termonuclear en Excellerando Blogspot: busque el término 'Horrible Hack'.

Función pública sustitutaStandardFolders(ByVal strPath como cadena) como cadena ' Insertar abreviaturas para carpetas estándar Dim strUser como cadena Dim strDesk como cadena Dim strAppD como cadena Dim strDocs como cadena Dim strTemp como cadena strDesk = CreateObject("WScript.Shell").SpecialFolders("Escritorio") strDocs = CreateObject("WScript.Shell").SpecialFolders("Mis documentos") strAppD = CreateObject("WScript.Shell").SpecialFolders("AppData") strTemp =CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2) strUser = CreateObject("WScript.Network").Nombre de usuario strPath = Reemplazar(strPath, strDesk, "[Escritorio]", , , vbTextCompare) strPath = Reemplazar(strPath, strDocs, "[Mis documentos]", , , vbTextCompare) strPath = Reemplazar(strPath, strAppD, "[Datos de aplicación]", , , vbTextCompare) strPath = Reemplazar(strPath, strTemp, "[Temp]", , , vbTextCompare) strPath = Reemplazar(strPath, strUser, "[Usuario]", , , vbTextCompare) SubstituteStandardFolders = strPath Función final Función pública ExpandStandardFolders (ByVal strPath como cadena) como cadena ' Reemplazar abreviaturas de carpetas estándar con sus nombres completos Dim strUser como cadena Dim strDesk como cadena Dim strAppD como cadena Dim strDocs como cadena Dim strTemp como cadena strDesk = CreatObject("WScript.Shell").SpecialFolders("Escritorio") strDocs = CreateObject("WScript.Shell").SpecialFolders("Mis documentos") strAppD = CreateObject("WScript.Shell").SpecialFolders("AppData") strTemp = CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2) strUser = CreateObject("WScript.Network").Nombre de usuario strPath = Reemplazar(strPath, "[Escritorio]", strDesk, , , vbTextCompare) strPath = Reemplazar(strPath, "[Mis documentos]", strDocs, , , vbTextCompare) strPath = Reemplazar (strPath, "[Datos de aplicación]", strAppD,,, vbTextCompare) strPath = Reemplazar(strPath, "[Temp]", strTemp, , , vbTextCompare) strPath = Reemplazar(strPath, "[Usuario]", strUser, , , vbTextCompare) ExpandirCarpetasEstándar = strPath Función final

Tenga en cuenta la cláusula 'Ave María' al final: si todo lo demás falla, cambie el nombre de usuarioe para [Usuario] y espero que la ruta se construya de la misma manera en todas las demás máquinas.

Este código tiene limitaciones. Mira la lista de tokens:

 [Escritorio]           [Mis documentos]      [Datos de la solicitud]  [Temp]              [Usuario]           

Si enumeras la colección Shell SpecialFolders, verás que hay más que eso:

Subenumeración públicaCarpetas especiales() Dim objCollection como objeto Dim varX como variante Establecer objCollection = CreateObject("WScript.Shell").SpecialFolders Para cada varX en objCollection Depurar.Imprimir varX PróximovarX Subtítulo final

Sin embargo, no puedo sacar las claves de esa colección, solo los valores, y los ordinales variarán de un sistema a otro.

Si pudieras conseguir las claves, sería un conjunto razonable de tokens para uso universal. Suponiendo, por supuesto, que 'Mis documentos' no se recupere mediante la clave 'MiaDocumetari' o una cadena de Unicodes de dos y tres bytes en la mitad de las estaciones de trabajo de su empresa.

Además: bienvenido a Deep VBA. Son las tareas triviales las que requieren soluciones alternativas, y tengo la ligera sospecha de que nuestros colegas en lenguajes más respetados están protegidos de esto por trucos absurdamente complicados en sus bibliotecas de desarrolladores de SDK: estas soluciones se originan en malas decisiones de diseño en el A nivel del sistema operativo y nadie los está "resolviendo".

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare