分享

Excel VBA 遍历文件夹下所有文件/交换两列数据/AI全程高能对话写代码

 冷茶视界 2023-11-15 发布于江苏

☆本期内容概要☆

  • VBA遍历文件夹下所有文件

  • 两种方法交换两列数据

大家好,我是冷水泡茶,今天在EXCELHOME论坛上看到一个网友求助的贴子:

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

文件内容是这样的:

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

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

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

于是,我说:

它又唰唰唰地写了一通代码,这会看样子是行了,它还把“当前目录”正确理解:

' 获取当前目录路径    folderPath = ThisWorkbook.Path

完整代码是这样的:

Sub SwapColumnsInXLSBFiles()    Dim folderPath As String    Dim fileSystem As Object    Dim folder As Object    Dim file As Object    Dim wb As Workbook    Dim ws As Worksheet    Dim lastRow As Long    Dim temp As Variant    Dim i As Long
' 获取当前目录路径 folderPath = ThisWorkbook.Path
' 创建文件系统对象 Set fileSystem = CreateObject("Scripting.FileSystemObject") Set folder = fileSystem.GetFolder(folderPath)
' 遍历文件夹下的.xlsb文件 For Each file In folder.Files If LCase(Right(file.Name, 5)) = ".xlsb" Then ' 仅处理.xlsb文件 ' 打开文件 Set wb = Workbooks.Open(file.Path)
' 遍历每个工作表 For Each ws In wb.Worksheets ' 获取最后一行 lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 对调A列和B列数据 For i = 1 To lastRow temp = ws.Cells(i, "A").Value ws.Cells(i, "A").Value = ws.Cells(i, "B").Value ws.Cells(i, "B").Value = temp Next i Next ws
' 保存并关闭文件 wb.Close SaveChanges:=True End If Next fileEnd Sub

我一字未改,直接复制到工作簿中运行通过。但我们分析代码发现,它是把两列单元格逐个交换,如果数据量大这样频繁读写可能效率上有问题。于是我又问它:

它是这样回答的:

处理90万行数据可能需要一些时间,但VBA在处理大量数据时通常还是相对高效的。以下是一些优化建议,以提高代码的执行速度:

1.禁用屏幕更新和自动计算:在代码执行期间,将屏幕更新和自动计算功能关闭可以显著提高处理速度。在代码开始时添加以下行:

Application.ScreenUpdating = FalseApplication.Calculation = xlCalculationManual

在代码结束时,记得将这些设置还原:

 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic

2.使用数组进行数据交换:在代码中,我们可以使用数组来处理数据交换,而不是逐个访问单元格。这样可以减少访问单元格的次数,从而提高效率。在示例代码中,我已经使用了数组来对调数据,这是一个较好的做法。

3.使用批处理操作:在处理大量数据时,尽量避免逐行或逐个单元格进行操作,而是考虑使用批处理操作。例如,可以将整个数据范围读取到数组中,然后对整个数组进行处理,最后再将结果写回工作表。

4.关闭其他应用程序和事件处理程序:关闭其他正在运行的应用程序和禁用不必要的事件处理程序可以减少系统资源的使用,从而提高代码的执行速度。

这些优化措施可以帮助提高代码的执行速度,但请注意,具体的执行时间还取决于您的计算机硬件性能和Excel版本。在处理大量数据时,最好先对一部分数据进行测试,以评估代码的性能并进行必要的优化。

其实,开始我就是想到用数组读取数据,然后循环交换两列数据的方法。于是我又让它写一个数组的,代码如下:

Sub SwapColumnsInXLSBFiles_Array()    Dim folderPath As String    Dim fileSystem As Object    Dim folder As Object    Dim file As Object    Dim wb As Workbook    Dim ws As Worksheet    Dim data As Variant    Dim lastRow As Long    Dim temp As Variant    Dim i As Long        ' 获取当前目录路径    folderPath = ThisWorkbook.Path        ' 创建文件系统对象    Set fileSystem = CreateObject("Scripting.FileSystemObject")    Set folder = fileSystem.GetFolder(folderPath)        ' 遍历文件夹下的.xlsb文件    For Each file In folder.Files        If LCase(Right(file.Name, 5)) = ".xlsb" Then ' 仅处理.xlsb文件            ' 打开文件            Set wb = Workbooks.Open(file.Path)                        ' 遍历每个工作表            For Each ws In wb.Worksheets                ' 获取数据范围                lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row                data = ws.Range("A1:B" & lastRow).Value                                ' 对调A列和B列数据                For i = 1 To lastRow                    temp = data(i, 1)                    data(i, 1) = data(i, 2)                    data(i, 2) = temp                Next i                                ' 将结果写回工作表                ws.Range("A1:B" & lastRow).Value = data            Next ws                        ' 保存并关闭文件            wb.Close SaveChanges:=True        End If    Next fileEnd Sub

同样,是一字不改运行通过,你不禁要感叹AI实在是太厉害了。其实吧,这样的代码可能是最简单的,对它来说真是小菜一碟。

不过,我没有测试90万行的数据,领会方法就行了吧。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章