excel怎么把两列互换(Excel VBA 遍历文件夹下所有文件/交换两列数据/AI高能对话写代码)

wufei123 发布于 2023-12-29 阅读(164)

本文于2023年5月26日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!☆本期内容概要☆VBA遍历文件夹下所有文件两种方法交换两列数据大家好,我是冷水泡茶,今天在EXCELHOME论坛上看到一个网友求助的贴子:

没有详细的需求说明,下载下来看看再说吧,他的需求写在文件里了:

文件内容是这样的:

不过,说实话,这个所谓二进制工作簿(.xlsb)还是第一次碰到,怎么弄尼?还是先来问一问AI吧:

然后,我把这个网友的需求描述给AI,要求它写代码:

它是二话不说,唰唰唰地写了一段代码,但显然它是没有能get到上下文,我们前面说的是.xlsb格式的二进制文件,它理解成.bin格式的文件:

于是,我说:

它又唰唰唰地写了一通代码,这会看样子是行了,它还把“当前目录”正确理解:获取当前目录路径folderPath = ThisWorkbook.Path完整代码是这样的:SubSwapColumnsInXLSBFiles()

DimfolderPath As StringDimfileSystem As ObjectDimfolder As ObjectDimfile As ObjectDimwb As WorkbookDim

ws As WorksheetDimlastRow As LongDimtemp As VariantDimi As Long获取当前目录路径folderPath = ThisWorkbook.Path

创建文件系统对象SetfileSystem = CreateObject("Scripting.FileSystemObject")Setfolder = fileSystem.GetFolder(folderPath)

遍历文件夹下的.xlsb文件ForEach file In folder.FilesIfLCase(Right(file.Name, 5)) = ".xlsb" Then 仅处理.xlsb文件打开文件

Setwb = Workbooks.Open(file.Path)遍历每个工作表ForEach ws In wb.Worksheets获取最后一行lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

对调A列和B列数据Fori = 1 To lastRowtemp = ws.Cells(i, "A").Valuews.Cells(i,"A").Value = ws.Cells(i, "B").Value

ws.Cells(i,"B").Value = tempNextiNextws保存并关闭文件wb.CloseSaveChanges:=TrueEndIfNextfileEnd Sub我一字未改,直接复制到工作簿中运行通过。

但我们分析代码发现,它是把两列单元格逐个交换,如果数据量大这样频繁读写可能效率上有问题于是我又问它:

它是这样回答的:处理90万行数据可能需要一些时间,但VBA在处理大量数据时通常还是相对高效的以下是一些优化建议,以提高代码的执行速度:1.禁用屏幕更新和自动计算:在代码执行期间,将屏幕更新和自动计算功能关闭可以显著提高处理速度。

在代码开始时添加以下行:Application.ScreenUpdating = FalseApplication.Calculation = xlCalculationManual在代码结束时,记得将这些设置还原:

Application.ScreenUpdating=TrueApplication.Calculation=xlCalculationAutomatic2.使用数组进行数据交换:在代码中,我们可以使用数组来处理数据交换,而不是逐个访问单元格。

这样可以减少访问单元格的次数,从而提高效率在示例代码中,我已经使用了数组来对调数据,这是一个较好的做法3.使用批处理操作:在处理大量数据时,尽量避免逐行或逐个单元格进行操作,而是考虑使用批处理操作例如,可以将整个数据范围读取到数组中,然后对整个数组进行处理,最后再将结果写回工作表。

4.关闭其他应用程序和事件处理程序:关闭其他正在运行的应用程序和禁用不必要的事件处理程序可以减少系统资源的使用,从而提高代码的执行速度这些优化措施可以帮助提高代码的执行速度,但请注意,具体的执行时间还取决于您的计算机硬件性能和Excel版本。

在处理大量数据时,最好先对一部分数据进行测试,以评估代码的性能并进行必要的优化其实,开始我就是想到用数组读取数据,然后循环交换两列数据的方法于是我又让它写一个数组的,代码如下:SubSwapColumnsInXLSBFiles_Array()。

DimfolderPath As StringDimfileSystem As ObjectDimfolder As ObjectDimfile As ObjectDimwb As WorkbookDim

ws As WorksheetDimdata As VariantDimlastRow As LongDimtemp As VariantDimi As Long获取当前目录路径folderPath =

ThisWorkbook.Path创建文件系统对象SetfileSystem = CreateObject("Scripting.FileSystemObject")Setfolder = fileSystem.GetFolder(folderPath)

遍历文件夹下的.xlsb文件ForEach file In folder.FilesIfLCase(Right(file.Name, 5)) = ".xlsb" Then 仅处理.xlsb文件打开文件

Setwb = Workbooks.Open(file.Path)遍历每个工作表ForEach ws In wb.Worksheets获取数据范围lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

data = ws.Range("A1:B" & lastRow).Value对调A列和B列数据Fori = 1 To lastRowtemp = data(i, 1)data(i,1) = data(i, 2)

data(i,2) = tempNexti将结果写回工作表ws.Range("A1:B" & lastRow).Value = dataNextws保存并关闭文件wb.CloseSaveChanges:=True

EndIfNextfileEnd Sub同样,是一字不改运行通过,你不禁要感叹AI实在是太厉害了其实吧,这样的代码可能是最简单的,对它来说真是小菜一碟不过,我没有测试90万行的数据,领会方法就行了吧好,今天就分享到这,欢迎点赞、留言、分享,谢谢大家,我们下期再会。

☆猜你喜欢☆【重磅】Excel VBA 应用分享/中医诊所收费系统/Excel+ListBox版Excel VBA 动态添加控件/学生成绩筛选Excel VBA 这样酷炫的日期控件,你不想要吗?Excel 公式函数/数据透视表/固定资产折旧计提表!

Excel VBA 自定义函数/数组字段定位/数组字段排序Excel 功能/公式函数/VBA/多种姿势处理重复值Excel VBA 最简单的收发存登记系统Excel 公式函数/查找函数之LOOKUPExcel VBA 文件批量改名

Excel 公式函数/数据验证/动态下拉列表Excel VBA 输入逐步提示/TextBox+ListBoxExcel 基础功能【数据验证】,你会怎么用?本文于2023年5月26日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!

亲爱的读者们,感谢您花时间阅读本文。如果您对本文有任何疑问或建议,请随时联系我。我非常乐意与您交流。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。