如何导出(而不是另存为)为另一种格式?


5

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

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

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

这是一场灾难,等待发生。用户回到工作状态,沉迷于认为一切正常,很快就忘记了当前格式不支持任何魔术,然后继续进行重要工作(tm)。午饭时间到了,他们关闭Excel,对是讨厌的对话框(因为他们一直在看,因为他们一直看到它们)打了两次“是”,然后走了出去。……午餐后,用户返回并意识到最初的“另存为”和“退出”之间的所有工作均已消失。

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

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

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

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


尝试在这里看看,好像他们创建了一个按钮并使用VBA导出数据。linkedin.com/pulse/…–
史蒂夫(Steve)

Answers:


2

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

CSV_tools.xla

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

是什么

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

安装

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

    在此处输入图片说明

VBA代码

Function ExportCSV()

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")

    On Error Resume Next
    ChDrive (ActiveWorkbook.Path)
    ChDir (ActiveWorkbook.Path)
    strName = fso.GetBaseName(ActiveWorkbook.Name)
    On Error GoTo 0

    strFilename = Application.GetSaveAsFilename(strName, "CSV Files,*.csv", 1)
    delimiter = Application.International(xlListSeparator)
    If Not strFilename = False Then

        Open strFilename For Append As #1

        For Each rngRow In ActiveSheet.UsedRange.Rows
            arr2D = rngRow
            arr1D = Application.Index(arr2D, 1, 0)
            strRow = Join(arr1D, delimiter)
            Print #1, strRow
        Next

        Close #1
    End If

End Function

针对不同用户的自动更新

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


对于VBA爱好者来说,最有趣的部分是

arr2D = rngRow
arr1D = Application.Index(arr2D, 1, 0)
strRow = Join(arr1D, delimiter)

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


这次真是万分感谢。它可以按照我所拥有的大多数图纸上的描述进行工作,但是在一张图纸上会产生“运行时错误'13':类型不匹配”,然后按[debug]使我一行arr1D = Application.Index(arr2D, 1, 0)。对不起,我不能分享这个问题。我将尝试生成lorem-ipsum版本进行测试。
马特·威尔基,2015年

@mattwilkie可能是工作表为空吗?请注意该特定工作表上的数据结构。排成一排?多行?在一列中?多列?
nixda

没有不为空。675行,至V列。...与内容有关:其中一列嵌入了HTML片段作为文本,例如<div class="WordSection1"><p class="MsoNormal"><span style="color:#1F497D;mso-fareast-language:EN-US">Review proposal...。删除该列后,CSV工具导出将起作用。常规的另存为csv的csv菜单路径在html列中没有问题。
马特·威尔基

这是因为他们很懒惰,不想使用ftp(以及对tinyupload.com的打击)。请尝试以下操作:files.environmentyukon.ca/matt/CSV_Tools
马特·威尔基


0

教用户打开该数据的副本。

选择Office文档时,可以右键单击该图标,然后单击“新建”。这将基于原始文档创建一个新的文档/表格/演示文稿。用户只需执行“另存为”即可从中导出

我希望您也有良好的备份,如果您担心的话...


1
这实际上不起作用,因为导出将捕获分析的各个阶段,如果可以的话,还可以捕获快照。Bob做X,Y,Z ...然后导出为CSV,然后执行A,B,C ...然后导出。冲洗,泡沫。重复。如果使用“按原样复制”,则中间的所有“操作”都将被丢弃(不保存在xls文件中)。
马特·威尔基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.