如何导出——而不是另存为——到另一种格式?

mat*_*kie 5 export microsoft-excel

如何在不更改当前活动文档的情况下将工作表或表格或选择导出为另一种文件格式?

我们主要的数据操作环境是在 Excel 中,大量使用格式和公式来获得我们想要的结果。然后将结果保存为.CSV与其他程序的互操作性。

当使用“文件 >>另存为>> 保存类型 >> CSV”时,将创建 .csv 文件并将活动文档更改为.csv 文件saved_file.csv。有一些关于使用这种新格式丢失功能和格式的警告,但除此之外用户界面没有改变。有粗体和斜体、不同的字体和大小、背景单元格填充、定义的表格范围等。单元格中的所有公式保持不变。

这是一场等待发生的灾难。用户重新开始工作,沉迷于认为一切正常,很快忘记了当前的格式不支持任何魔法,并继续做重要的东西(tm)。午餐时间到了,他们关闭 Excel,对那些没有被阅读的烦人的对话框敲了两次 Yes,因为他们一直都在看他们,然后走出门。...午餐后用户回来并意识到初始另存为和退出之间的所有工作都没有了。

不幸的是,“文件>>导出”只是“另存为”的另一个导航路线,还将活动文档更改为“some_file.csv”。

我们需要的是将一些数据导出到另一种文件类型并保留活动文档“our-real-data.xlsx”。

如何才能做到这一点?并添加到菜单或功能区以一键执行?

如何与组织中的每个人共享?(不要求个人用户打开 VBA 编辑器等)

nix*_*xda 3

\n

我们需要的是将一些数据导出到另一种文件类型并保留活动文档“our-real-data.xlsx”。

\n
\n\n

CSV_tools.xla

\n\n

自从你提到它以来,我已经整理了一个快速的 VBA 插件,它可以导出为 CSV。我尝试使用尽可能少的代码,以便新用户可以更轻松地理解它。

\n\n

它有什么作用

\n\n
    \n
  • 加载项询问在哪里保存 CSV。默认文件夹是保存 XLS 的文件夹
  • \n
  • 加载项会自动检测是否应根据您的区域系统设置使用逗号或分号作为分隔符
  • \n
  • 当前活动 Excel 工作表的所有值均导出到以 XLS 文件命名的新 CSV 文件
  • \n
  • 现有的 XLS 不会受到任何影响
  • \n
\n\n

安装

\n\n
    \n
  1. 下载插件并将其保存到下面C:\\Users\\%USERNAME%\\AppData\\Roaming\\Microsoft\\AddIns
  2. \n
  3. 打开 Excel 并在下面激活它\n\n
      \n
    • Excel 2003:菜单栏 \xe2\x86\x92 工具 \xe2\x86\x92 加载项
    • \n
    • Excel 2007:Excel 选项 \xe2\x86\x92 加载项 \xe2\x86\x92 转至
    • \n
    • Excel 2010-13:“文件”选项卡 \xe2\x86\x92 选项 \xe2\x86\x92 加载项 \xe2\x86\x92 转至
    • \n
  4. \n
  5. 重新启动 Excel 并查看菜单栏

    \n\n

    在此输入图像描述

  6. \n
\n\n

VBA代码

\n\n
Function ExportCSV()\n\n    Dim fso As Object\n    Set fso = CreateObject("Scripting.FileSystemObject")\n\n    On Error Resume Next\n    ChDrive (ActiveWorkbook.Path)\n    ChDir (ActiveWorkbook.Path)\n    strName = fso.GetBaseName(ActiveWorkbook.Name)\n    On Error GoTo 0\n\n    strFilename = Application.GetSaveAsFilename(strName, "CSV Files,*.csv", 1)\n    delimiter = Application.International(xlListSeparator)\n    If Not strFilename = False Then\n\n        Open strFilename For Append As #1\n\n        For Each rngRow In ActiveSheet.UsedRange.Rows\n            arr2D = rngRow\n            arr1D = Application.Index(arr2D, 1, 0)\n            strRow = Join(arr1D, delimiter)\n            Print #1, strRow\n        Next\n\n        Close #1\n    End If\n\nEnd Function\n
Run Code Online (Sandbox Code Playgroud)\n\n

针对不同用户自动更新

\n\n

一旦每个用户在其 Excel 中启用了加载项(无法自动化),您就可以.xla通过网络共享、Robocopy 或类似工具复制新文件版本。但这应该是一个单独的问题,因为有太多不同的方法来解决这个问题。

\n\n
\n\n

对于 VBA 极客来说,最有趣的部分是

\n\n
arr2D = rngRow\narr1D = Application.Index(arr2D, 1, 0)\nstrRow = Join(arr1D, delimiter)\n
Run Code Online (Sandbox Code Playgroud)\n\n

它使用 Join() 函数将范围(在我们的例子中为单行)转换为 2D 数组,然后转换为 1D 数组,最后转换为单个字符串

\n