使用 VBA 将 Excel 数据保存为 csv - 删除文件末尾的空白行以保存

2023-12-02

我正在 VBA 中创建一组 csv 文件。

我的脚本正在创建我需要的数据集,但行数在循环的多次迭代中有所不同。例如,对于 i=2,我有 100,000 行,但对于 i=3,我有 22,000 行。问题是,当 Excel 保存这些单独的 csv 文件时,它不会截断末尾的空格。这会在文件末尾留下 78,000 个空白行,这是一个问题,因为我需要生成大约 2,000 个文件,每个文件都有几兆字节大。 (我在 SQL 中有一些需要的数据,但无法在 SQL 本身中进行数学计算。说来话长。)

此问题通常在手动保存时发生 - 您需要在删除行后关闭文件,然后重新打开,在这种情况下这不是一个选项,因为它在 VBA 中自动发生。使用另一种语言的脚本保存后删除空白行并不是真正的选择,因为我实际上需要输出文件以适合可用的驱动器,而且它们现在不必要地巨大。

我努力了Sheets(1).Range("A2:F1000001").ClearContents,但这不会截断任何内容。在保存之前删除行应该不会产生类似的影响,因为 Excel 会保存所有行直到文件末尾,因为它存储的是所操作的最右下角的单元格。有没有办法让Excel只保存我需要的行?

这是我用来保存的代码:(截断发生在更早的时候,在调用这个的路由中)

Sub SaveCSV()
'Save the file as a CSV...
  Dim OutputFile As Variant
  Dim FilePath As Variant

  OutputPath = ActiveWorkbook.Worksheets("Macro").Range("B2").Value
  OutputFile = OutputPath & ActiveWorkbook.Worksheets("Macro").Range("B1").Value
  Application.DisplayAlerts = False 'DISABLE ALERT on Save - overwrite, etc.
  ActiveWorkbook.SaveAs Filename:=OutputFile, FileFormat:=xlCSV, CreateBackup:=False
  Application.DisplayAlerts = True 'DISPLAY ALERTS
End Sub

相关代码在这里:

'While looping through Al, inside of looping through A and B...
'Created output values needed in this case, in an array...

Sheets(1).Range("A2:E90001") = Output

ActiveWorkbook.Worksheets(1).Range("F2").Formula = "=(does not matter, some formula)"
ActiveWorkbook.Worksheets(1).Range("F2").AutoFill Destination:=Range("F2:F90001")

'Set Filename to save into...
ActiveWorkbook.Worksheets("Macro").Range("B1").Value = "Values_AP" & Format(A, "#") & "_BP" & Format(B, "#") & "_Al" & Format(Al, "#")

'Save Sheet and reset...
Call SaveCSV
Sheets(1).Range("A2:F90001").ClearContents
CurrRow = 1

Next Al

您可以获得UsedRange重新计算自身而不用简单的删除列和行

ActiveSheet.UsedRange

或者,您可以通过使用以下代码删除最后使用的单元格下方的区域来自动手动删除“错误”使用范围DRJ 的 VBAexpress 文章,或者通过使用插件,例如尽快公用事业

DRJ 文章中的函数是:

Option Explicit 

Sub ExcelDiet() 

Dim j               As Long 
Dim k               As Long 
Dim LastRow         As Long 
Dim LastCol         As Long 
Dim ColFormula      As Range 
Dim RowFormula      As Range 
Dim ColValue        As Range 
Dim RowValue        As Range 
Dim Shp             As Shape 
Dim ws              As Worksheet 

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

On Error Resume Next 

For Each ws In Worksheets 
    With ws 
         'Find the last used cell with a formula and value
         'Search by Columns and Rows
        On Error Resume Next 
        Set ColFormula = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlFormulas, _ 
        LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious) 
        Set ColValue = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, _ 
        LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious) 
        Set RowFormula = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlFormulas, _ 
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious) 
        Set RowValue = .Cells.Find(What:="*", After:=Range("A1"), LookIn:=xlValues, _ 
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious) 
        On Error GoTo 0 

         'Determine the last column
        If ColFormula Is Nothing Then 
            LastCol = 0 
        Else 
            LastCol = ColFormula.Column 
        End If 
        If Not ColValue Is Nothing Then 
            LastCol = Application.WorksheetFunction.Max(LastCol, ColValue.Column) 
        End If 

         'Determine the last row
        If RowFormula Is Nothing Then 
            LastRow = 0 
        Else 
            LastRow = RowFormula.Row 
        End If 
        If Not RowValue Is Nothing Then 
            LastRow = Application.WorksheetFunction.Max(LastRow, RowValue.Row) 
        End If 

         'Determine if any shapes are beyond the last row and last column
        For Each Shp In .Shapes 
            j = 0 
            k = 0 
            On Error Resume Next 
            j = Shp.TopLeftCell.Row 
            k = Shp.TopLeftCell.Column 
            On Error GoTo 0 
            If j > 0 And k > 0 Then 
                Do Until .Cells(j, k).Top > Shp.Top + Shp.Height 
                    j = j + 1 
                Loop 
                If j > LastRow Then 
                    LastRow = j 
                End If 
                Do Until .Cells(j, k).Left > Shp.Left + Shp.Width 
                    k = k + 1 
                Loop 
                If k > LastCol Then 
                    LastCol = k 
                End If 
            End If 
        Next 

        .Range(.Cells(1, LastCol + 1), .Cells(.Rows.Count, .Columns.Count)).EntireColumn.Delete 
        .Range("A" & LastRow + 1 & ":A" & .Rows.Count).EntireRow.Delete 
    End With 
Next 

Application.ScreenUpdating = True 
Application.DisplayAlerts = True 

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

使用 VBA 将 Excel 数据保存为 csv - 删除文件末尾的空白行以保存 的相关文章

  • 使用 Excel Interop 关闭 Excel 应用程序而不保存消息

    我正在使用 Excel Interop COM 对象 我正在编写一种方法 其中打开和关闭 Excel 应用程序 然后打开 Excel 工作簿和工作表 完成这些工作后 我将关闭应用程序和工作簿 我的问题是 此方法可以重复调用多次 当工作表和应
  • 减少每日状态表以仅包含状态更改

    我有一个包含 10 万以上用户的大型每日状态表 5 7 亿行 目前它位于 MySQL 或 CSV 中 该表包含三列 user id status 和 date 理想情况下 我希望将表缩减为一个新表 其中包含每个状态期间的 user id s
  • 如何在 R 中编写 csv 文件,其中我的输入作为行写入文件?

    这是一个非常简单的问题 令我惊讶的是网上没有例子 我有一个向量 vector lt c 1 1 1 1 1 我想将其写为 csv 作为一个简单的行 write csv vector file myfile csv row names FAL
  • 连续工作表切换循环

    我有一个 Excel 电子表格来显示 SQL 数据图表 这些图表将显示在我们机加工车间的显示器上 该电子表格有 45 个选项卡 我需要在选项卡之间切换 每个选项卡间隔 10 秒 然后返回到第一个选项卡并重复循环 I found 如何使用 V
  • 使用 py2neo 从 csv 文件创建 neo4j 图形数据库

    我目前正在攻读博士课程 并且对 Py2neo 很感兴趣 因此我使用它来使用社交图谱进行一些实验 然而我遇到了新手麻烦 抱歉问这些简单的问题 我得到了一个 xml 数据集 其中包含有关期刊出版物的数据 我已将其转换为 csv 表 大约有 70
  • Excel 的查找和查找下一个 VBA

    我一直在试图弄清楚如何处理这个问题 但基本上我想要一种方法来打印 B 列中的值 给定与 A 列匹配的特定值 例如 Column A Column B 1 ABC 2 DEF 3 GHI 1 JKL 我想在使用 find findnext 或
  • WebAPI 和 Angular JS Excel 文件下载 - 文件损坏

    我正在 WebAPI 中生成 Excel 文件 我将其 存储 在内存流中 然后放入响应 如下所示 var result new HttpResponseMessage HttpStatusCode OK Content new Stream
  • 尝试使用变量作为自动过滤器中的条件,并带有“不等于”<>,但无法使其工作

    我正在使用 Excel VBA 使用 不等于 表达式来过滤列表 如果我使用Criteria1 lt gt Bob 代码运行完美 但如果我将 Bob 更改为变量 代码将无法运行 这有效 ActiveSheet ListObjects Rpt
  • VBA C# DLL 未注册

    我制作了一个 C NET dll 我想从 VBA 运行它而不注册它 我找到了解决方案there https stackoverflow com a 13333819并且它可以完美工作 但前提是程序集是使用 Framework NET 3 5
  • 如何将多个 Excel 工作表转换为 csv python

    我想转换所有的excel文档 xls 将工作表转换为 csv 如果 excel 文档只有一张工作表 那么我将进行如下转换 wb open workbook path1 sh wb sheet by name Sheet1 csv file
  • 您可以调整用户窗体的这些代码吗:使其小而高效

    当 userfrom 按以下顺序激活时 我想在运行时添加动态用户表单控件 例如 标签 文本框 我想要类似以下的东西 当用户表单激活时 它需要询问用户字段的数量 他 她想要插入 如果用户回答7 则需要按以下顺序添加字段 3 列顺序 标签1 文
  • Papa Parse 在本地读取 CSV

    有人可以指出或向我展示 Papa Parse 读取 csv 文件的工作示例吗 当我尝试使用时 Papa parse file complete function results console log Finished results da
  • 无法使用 Excel JavaScript API 设置 NumberFormat

    我正在使用 Excel Javascript API 在搜索文档后 仍然找不到我想要实现的解决方案 因此 我想将所有内容设置为数字格式 文本 这样 Excel 的自动格式设置就不会与任何单元格的内容混淆 不会删除前导零或更改日期格式 文档建
  • ruby CSV重复行解析

    我有一些需要处理的 CSV 数据 但无法找到匹配重复项的方法 数据看起来有点像这样 line id name item 1 item 2 item 3 item 4 1 251 john foo foo foo foo 2 251 john
  • Tweepy StreamListener 到 CSV

    我是 python 新手 我正在尝试开发一个应用程序 使用 Tweepy 和 Streaming API 从 Twitter 检索数据并将数据转换为 CSV 文件 问题是此代码不会创建输出 CSV 文件 也许是因为我应该将代码设置为在实现例
  • 参考上一个问题:为什么 VBA 没有加载所有发票详细信息

    除了上一个问题之外 我们在销售发票上仍然存在相同的加载失败问题 下面的 VBA Json 仍然仅加载一行或第一个产品详细信息行 而不是与表中该销售发票合作的所有产品行详细信息 我们希望下面的 VBA 能够根据参数加载发票详细信息 例如 如果
  • 索引匹配不起作用

    对于下表 如果 A 列和 B 列都匹配 如何检索 C 列A 列 B 列 C 列城市 1 城市 10 本地城市 2 城市 21 远程城市 3 城市 1 远程城市 4 城市 2 本地 我尝试使用索引和匹配 但得到 N A Enter as an
  • 导入到 SQL Server 时忽略 Excel 文件中的列

    我有多个具有相同格式的 Excel 文件 我需要将它们导入 SQL Server 我当前遇到的问题是 有两个文本列我需要完全忽略 因为它们是自由文本 并且某些行的字符长度超出了服务器允许我导入的长度 这会导致截断错误 因为我的分析不需要这些
  • 根据其他列中的条件对列中的唯一值求和

    A B 1 Total 1 900 2 Product A 700 3 Product A 700 4 Product B 300
  • 如果一个数字写在方括号中,例如[5],这意味着什么

    我正在开发一个旧版 VBA Excel 应用程序 并偶然发现了一些代码行 其中长字符串 从文件中读取 被切成碎片 这些行看起来像这样 Range E16 Value Mid line 49 6 显然 写 6 意味着需要 6 个字符 但我从未

随机推荐

  • 启动一个完全独立于Python的进程

    我正在尝试从 python 启动一个完全独立的进程 我不能使用像这样简单的东西os startfile因为我需要传递参数 目前我正在使用subprocess popen这让我完成了 90 的任务 args some exe exe some
  • MPMovies PlayerViewController 进入背景时变黑

    我的 MPMoviePlayerViewController 有问题 当应用程序进入后台然后我再次启动它或转到另一个 viewControllers 时 电影变黑了 我有在菜单背景中播放的电影 这是我的代码 编辑代码 void viewDi
  • 页面刷新后保留下拉列表的选定值

    我有一个按钮可以根据多个下拉值中的选择来过滤列表 但是 我遇到了一个问题 一旦单击按钮 页面就会刷新 并且下拉值将重置为默认值 如何确保刷新后所选值保留在下拉列表中 div div
  • 隐含的路径归纳

    这是一个后续问题在 Agda 中进行路径归纳 我想知道什么时候这个结构可能更具表现力 在我看来 我们总是可以这样表达 f forall A gt x y A gt x y gt some type f refl instance of so
  • MySQL:获取父子结构的根节点

    我有一个与此类似的表 Id ParentId 1 0 2 1 3 0 4 3 5 3 6 0 7 6 8 7 给定一
  • 如何使用 C# Parallel.For 实现 OpenMP 多级代码

    如何使用 C Parallel For 在以下 OpenMP 代码中实现 OpenMP 代码 pragma omp parallel float data new float 1000 pragma omp for for int i 0
  • 即使未注册,也会在 WooCommerce 感谢页面上显示客户详细信息

    在 WooCommerce 中 对于登录用户 感谢 已收到订单 页面确实会显示客户详细信息 例如姓名 地址和电子邮件 但是当客户未注册时什么也没有 如何确保非注册用户在支付成功后 能像注册用户一样在Thankyou 已下单 页面看到自己的详
  • 如何使用HtmlAgilityPack进行异步调用?

    我正在尝试获取带有 id 的表table matches可用的here 问题是表是使用加载的ajax所以我没有得到完整的html下载页面时的代码 string url http www oddsportal com matches socc
  • 如何使用 Firestore 数据库快照填充表日历

    我正在尝试填充要在 TableCalendar 上显示的事件地图 使用表日历包 要填写事件 我需要一个 Map 所以一开始我创建了这个 Map
  • VB.net 到 MySql 存储过程错误

    我是存储过程的新手 所以我可能会错过一些简单的东西 但我研究了基础知识 并且一直试图从 vb net 代码集成它 我创建了一个简单的存储过程 我认为 它只运行今天结果的数据查询 例行DDL 注意 例程主体前后的注释不会被服务器存储 DELI
  • 显示最后一个非空单元格的地址(如果值不唯一)

    我有以下 Excel 电子表格 A B C D E F 1 Jan Feb March April May 2 Profit 100 200 200 3 Cell Reference last non empty cell In Row 2
  • 如果超过 78 个字符,则使用 TIMESTAMP 的 TO_CHAR 会引发 ORA-01877

    我面临一个奇怪的问题 我正在尝试将一些数字转换为 单词 只需这样做 TO CHAR TO TIMESTAMP LPAD nvl trunc 99999999 0 9 0 FF9 FFSP AS amt in words 效果很好 输出是 九
  • 在 webfaction 上隐藏安全 django 设置信息

    我试图隐藏 webfaction 上 django 应用程序的数据库密码等安全信息 但我找不到如何以及在哪里使用环境变量设置这些信息 我开发了一个可以用 pip 安装的包 pip install djangosecure 在你的 setti
  • 单元测试 Angular Observables

    我是测试领域的新手 刚刚开始为现有的 Angular 2 代码编写单元测试 我有一个函数confirmDelete返回Obserable
  • DataTables+Datepicker 按日期范围过滤表

    尝试使用两个有界日期选择器按日期范围实现数据表过滤器 我在 SO 上见过很少类似的问题 但没有一个答案对我有用 到目前为止 我设法实现了界面元素 但不知道如何将它们组合在一起以进一步进行 任何帮助表示赞赏 var myTableData i
  • 在 R 包中包含 TMB C++ 代码的指南

    我最近发现了 TMB 的神奇之处 并且正在开发一个包 最好在其中包含 TMB c 模板 以用于计算成本相当高的模型 我假设有可能 在软件包安装时自动编译 TMB 源代码 但我在 TMB 文档中找不到与此相关的任何明确指南 到目前为止 我的替
  • 如何在 C# 中创建 Trie [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有谁知道在哪里可以找到如何在 C 中构造 trie 的示例 我正在尝试使用字典 单词列表并用它创建一个字典树 这是我自己的代码 从我的答案中提取如何
  • 使用 Java 8 Streams 的收集器根据现有键/值对增加值

    假设有一个List然后Object包含两个方法 getUserId and getPoints 考虑一下List包含三个对象 它们包含以下数据 userId A 3 points userId A 5 points userId B 1 p
  • jqGrid 迭代子网格中的网格数据

    我想迭代网格对象中包含的所有数据 我的网格有一个包含子网格对象的定义 并以这种方式创建 var grid gridID var pager pagerID grid jqGrid url GetBaseWSUrl MyWs asmx MyM
  • 使用 VBA 将 Excel 数据保存为 csv - 删除文件末尾的空白行以保存

    我正在 VBA 中创建一组 csv 文件 我的脚本正在创建我需要的数据集 但行数在循环的多次迭代中有所不同 例如 对于 i 2 我有 100 000 行 但对于 i 3 我有 22 000 行 问题是 当 Excel 保存这些单独的 csv