另存为文件并将其在桌面上的图标移动到原始文件的相同旧位置

2024-03-05

我已将以下代码用于工作簿(另存为),然后删除原始文件。
Windows 操作系统将新创建的文件放在“我的桌面”上第一个左侧的空闲空间上。
使用后我需要什么SaveAs,是将其图标移动到桌面上原始文件的相同旧位置。
意思是,如果我的文件最初放置在桌面的右上角,我想在使用“另存为”后将其保留在该位置。
预先感谢您抽出时间提供帮助。

Sub Rename_Me_Automatic()
 
    Application.DisplayAlerts = False
 
    Dim FilePath As String, wb As Workbook, FolderPath As String
    Dim oldName As String, newName As String
 
    Set wb = ThisWorkbook
     FilePath = wb.FullName
      FolderPath = wb.Path & Application.PathSeparator
       oldName = wb.Name
 
     newName = Left(oldName, Len(oldName) - 5) & WorksheetFunction.RandBetween(1, 20)
 
     wb.SaveAs FolderPath & newName
 
     Kill FilePath   'delete orginal file
 
     Application.DisplayAlerts = True
 
End Sub

请也尝试一下这个代码。它使用经典的 Windows 行为。 VBA 编写 VBScript、创建文件并运行它。该脚本找到打开的 Excel 会话、正在讨论的工作簿、保存、关闭它、在某些情况下退出 Excel 应用程序,然后仅在此之后更改工作簿名称(保持相同的文件图标位置)。最后,脚本自杀了:

Sub SaveAndChangeActiveWorkbookName_VBScript()
     Dim vbsStr As String, fso As Object, vbsObj As Object, strVBSPath As String
     Dim newName As String, wb As Workbook, ext As String, searchName As String
     
     Set wb = ThisWorkbook
     With wb
        ext = Split(.Name, ".")(UBound(Split(.Name, ".")))
        searchName = Left(.Name, Len(.Name) - (Len(ext) + 1))
     End With
     
     newName = searchName & WorksheetFunction.RandBetween(5, 20) & "." & ext
     
     strVBSPath = ThisWorkbook.Path & "\Rename.vbs" 'the fullname of the VBScript to be created and run
     
     vbsStr = "Dim objExcel, wb, objFile, FSO, fullName" & vbCrLf & _
            "Set objExcel = GetObject(, ""Excel.Application"")" & vbCrLf & _
            "Set FSO = CreateObject(""Scripting.FileSystemObject"")" & vbCrLf & _
            " Set wb = objExcel.Workbooks(""" & ThisWorkbook.Name & """)" & vbCrLf & _
            "fullName = wb.FullName" & vbCrLf & _
            "wb.Close True" & vbCrLf & _
            "If objExcel.Workbooks.Count = 0 Then" & vbCrLf & _
            "   objExcel.Quit" & vbCrLf & _
            "ElseIf objExcel.Workbooks.Count = 1 Then" & vbCrLf & _
            "    If not UCase(Workbooks(1).Name) = ""PERSONAL.XLSB"" Then" & vbCrLf & _
            "         objExcel.Quit" & vbCrLf & _
            "    End If" & vbCrLf & _
            "End If" & vbCrLf & _
            "Set objFile = FSO.GetFile(fullName)" & vbCrLf & _
            "objFile.Name = """ & newName & """" & vbCrLf & _
            "FSO.DeleteFile Wscript.ScriptFullName, True" 'kill itself...
                        
     Set fso = CreateObject("Scripting.FileSystemObject")
     Set vbsObj = fso.OpenTextFile(strVBSPath, 2, True)
            vbsObj.Write vbsStr 'write the above string in the VBScript file
     vbsObj.Close
      
      Shell "cmd.exe /c """ & strVBSPath & """", 0  'execute/run the VBScript
End Sub

下一个版本尝试简化您的代码,不需要任何 API:

Sub SaveAndChangeActiveWorkbookName_ShellAppl()
   Dim sh32 As Object, oFolder As Object, oFolderItem As Object, wb As Workbook
   Dim newName As String, ext As String, searchName As String
   
   Set sh32 = CreateObject("Shell.Application")
   Set wb = ThisWorkbook
   
   With wb
     ext = Split(.Name, ".")(UBound(Split(.Name, ".")))            'extract extension
     searchName = Left(.Name, Len(.Name) - (Len(ext) + 1)) 'extract the rest of its name
     
     newName = searchName & WorksheetFunction.RandBetween(5, 20) & _
                                                                        IIf(showExtension, "." & ext, "") 'it sets correct new name...

     .Save
     .ChangeFileAccess xlReadOnly '!
     
     Set oFolder = sh32.Namespace(.Path & "\")
     Set oFolderItem = oFolder.ParseName(.Name)
     oFolderItem.Name = newName
     
     If (UCase(Workbooks(1).Name) = "PERSONAL.XLSB" _
            And Workbooks.Count = 2) Or Workbooks.Count = 1 Then
         Application.Quit
     Else
        .Close False 'no need to save it again and it closes faster in this way...
     End If
   End With
End Sub

'Function to check how 'Hide extension for known file type' is set:
Function showExtension() As Boolean
   Dim fileExt As String, Shl As Object, hideExt As Long
   
   fileExt = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\HideFileExt"
   Set Shl = CreateObject("WScript.Shell")
   hideExt = Shl.RegRead(fileExt)
   If hideExt = 0 Then showExtension = True
End Function

我了解到 Windows 不允许更改打开的工作簿的名称。确实如此,您无法手动执行此操作。 Windows不让你这样做,这是它避免数据丢失的哲学。

但设置ReadOnlyfile 属性会暂时从 Windows 文件分配表中删除文件全名。如果你试试Debug.Print wb.FullFileName在更改其属性之前和之后,它将显示相同的(旧的)属性。但看起来有办法做到这一点,让打开的工作簿在分配表之外,您可以更改其名称。我什至没有想到这是可能的,我认为这是我今天学到的最重要的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

另存为文件并将其在桌面上的图标移动到原始文件的相同旧位置 的相关文章

  • 防止 Excel 公式中的单元格数量增加

    我在 Excel 中有一个公式 需要根据该行中的数字除以一个常数对该列的几行运行 当我复制该公式并将其应用于范围中的每个单元格时 所有单元格编号都会随行增加 包括常量 所以 B1 127 C4 IF B4 lt gt B4 B1 如果我复制
  • 具有桌面应用程序安全性的 OAuth2

    我有一个 Electron 应用程序 它基本上是一个 Google Drive 客户端 我打算使用 OAuth 2 但是 Google API 要求我在生成 client secret 的地方注册我的应用程序 由于这是一个桌面应用程序 因此
  • 在 Objective-C (iPhone) 中从 Excel 文件读取数据 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在 google 中搜索过 但似乎没有找到从 Objective C 读取 Excel 文件的方法 我找到的唯一答案是首先转换为 CSV
  • 使用 SAS 导出到 Excel

    假设我有 2 个 SAS 数据集 test1 sas 和 Test2 sas 现在我想将这2个数据集导出到Excel中 其中Excel文件Sheet1中将有test1 sas数据 Sheet2中将有test2 sas数据 怎么做 从 开始这
  • 将Excel数据转换为特定的JSON格式

    我收到一个 Excel 文件 xlsx 如下所示 行和列的数量可以变化 例如 它也可以如下所示 对于第一张图片中的 Excel 工作表 JSON 应如下所示 value Prename Nik Age 17 Country Switzerl
  • 设计 GUI [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 作为一个几乎没有 或没有 艺术倾向的开发人员 您将如何为应用程序设计 GUI 特别是 我正在考虑桌面应用程序 但任何与网络应用程序相关
  • 在 C# 中更改 Excel 单元格格式

    如何使用 C 中的 Microsoft Excel 12 0 库更改 Excel 中单元格的格式 更具体地说 我想将给定单元格更改为文本格式 我读过了 net c 改变Excel单元格格式 https stackoverflow com q
  • 带有 For 循环的多维数组 VBA

    尝试检查第一列中的值 即多维数组中的列 如果它匹配 则对另一列中与该行匹配的值进行排序 我认为我做错了 但这是我第一次搞乱多维数组 我是否需要在每个 for 循环中使用 UBound 和 LBound 来告诉它要查看哪一列 除了当前问题的答
  • 使用 VBA 清除 Excel 单元格格式而不清除 NumberFormat

    是否可以在不改变 的情况下清除Excel单元格格式和内容 使用VBA NumberFormat 给定的单元格 我尝试过 ClearContents ClearFormats 但 ClearFormats 删除了数字格式细胞也 请建议 你可以
  • 在 Excel 2010 中添加基本功能区的 VBA 代码?

    我已经使用产品在 C addin express 中为 Excel 编写功能区 但我需要知道如何使用 vba 生成功能区 有人能为我提供一些代码来为此在工具栏中插入一个额外的功能区吗 我所说的功能区是指上面写着 公式 数据 评论 等的地方
  • 连接两列之间的排列

    我需要有关 Excel 作业的帮助 Name City John London Maxx NY Ashley DC Paris 解决这个问题的方法必须是 John london John NY John DC John Paris Maxx
  • 如何删除Excel 2010单元格中的某些字符

    在 A 列中 我有很多类似这样的名称 约翰 史密斯 我仍然希望它们在 A 中 但 被删除了 If John Smith 位于单元格 A1 中 然后使用以下公式执行您想要的操作 SUBSTITUTE SUBSTITUTE A1 内部 SUBS
  • Excel VBA 选择.替换,如果替换,则将文本放在替换行的 a 列中

    我有一些宏 例如 Columns F M Select Selection Replace What Replacement LookAt xlPart SearchOrder xlByRows MatchCase True SearchF
  • 任务执行期间在任务窗格上滚动时工作表冻结

    我们正在使用office js API 开发一个office Addin 反复出现的问题损害了我们在店里的声誉 此问题是 Excel 插件 office js 中的工作表在滚动后被冻结 我编写了一个简单的脚本实验室片段代码 它重现了工作表冻
  • 更改使用 ClosedXML 显示的工作表

    我正在使用 ClosedXML 动态创建包含多个工作表的 Excel 工作簿 生成内容后 我正在努力将所选工作表更改回工作簿中的第一个工作表 并且在文档中找不到有关如何更改显示的工作表的任何内容 我努力了 wb Worksheet 1 Se
  • VBA:访问 JSON

    我正在处理 VBA 投影 但不确定如何访问此 JSON 中的 id 应该将 players 设置为什么才能在循环中获取 id 我已经用更多代码更新了问题 JSON event games players id 182759 Code Pri
  • 在函数上使用子例程的目的

    我已经使用 Access 一段时间了 尽管我了解 Function 相对于 Sub 的明显好处是它可以返回值 但我不确定为什么我应该使用 Sub 而不是一个函数 毕竟 除非我弄错了 函数可以做所有 Subs 可以做的事情吗 注意 我完全知道
  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • 在 vba 上将值粘贴到另一个工作簿工作表上时出现问题

    我有以下代码 以便从工作簿复制工作表并将其粘贴到另一个名为 Control de precios 的工作簿的工作表 1 上 Sub createSpreadSheet Set NewBook Workbooks Add With NewBo
  • InvalidArgumentException:消息:无效参数:“using”必须是字符串

    我对 python 很陌生 试图创建可重用的代码 当我尝试通过传递 Login 类下使用的所有参数来调用 test main py 中的 Login 类和函数 login user 时 我收到错误 InvalidArgumentExcept

随机推荐