求能批量删除多个工作簿中工作表的指定单元格,指定行,指定列,指定表(如果有多个工作表)的动作!

动作需求 · 1629 次浏览
希晨 创建于 2023-07-12 11:08

平时导出的多个数据工作簿,列和行的标题都是一样的,只是内容不相同;

【工作需求】:有很多的列和行不需要,需要删掉,保存下来

我的做法:

①、以前很傻,一个一个打开去删,费时费力。

②、后来在百度搜,只能搜到在一个工作簿里,批量删除多个工作表的指定列和指定行;

我就将所有工作簿合并到一个工作簿里,打开合并的工作簿,全选工作表,批量删除指定行和列,然后再拆分成多个工作簿,保存。

这两个方法虽说可以实现,但是文件一多就挺耗费时间的,后期还可能需要删除指定的表。

我在Quicker里搜了一圈没搜到这种批量删的动作,只搜到了删除指定列的动作。

求各位大佬看能不能实现制作这种动作,感激不尽!

 

举例截图:

举例了2个工作簿,提供给大佬下载,测试动作:

https://wwud.lanzouw.com/b0c03kehc 密码:8s0u

 

如下是百度搜到的vba视频,大佬看要不要参考一下,不会vba,看不太懂。

批量删除多个工作簿中工作表的指定单元格,指定行和指定列—【Excel VBA 编程 应用实例】
https://www.bilibili.com/video/BV1GV411277y/

希晨 最后更新于 2023/7/12

CL 2023-07-12 11:16 :

建议举个详细的例子,什么样的文档,删除什么样的单元格,一个还是多个。。。。 按实际需求写。

希晨 回复 CL 2023-07-12 11:18 :

好的,一会重新编辑一下

回复内容
CL 2023-07-12 15:22
#1

尝试了一下,有点复杂了,暂时没有时间继续深入。

如果导出数据的原始系统里可以直接设置,或者可以直接访问原始系统的数据库,是最理想的方法。

否则的话需要使用c#或vba代码。

另外还需要根据要保留或删除数据的多少,优化算法一下。

还有一个思路是提取必要的数据出来,写入新的文件里,而不是直接修改原始文件,或许更简单一些。



下面是chatgpt的一些代码可以参考,里面目前没有删除工作表的功能。


----


使用Excel的Interop库,你可以这样实现:


注意,删除操作会导致索引的改变,所以我建议你先对行和列的索引数组进行排序,然后从最大的索引开始删除,以避免出错。


```csharp

using Excel = Microsoft.Office.Interop.Excel;
using System;
using System.Linq;
public void CleanExcelSheetWithInterop(string excelPath, string[] sheetNameList, string[] cells, string[] deleteColumns, int[] deleteRows)
{
    // Create Excel application object
    Excel.Application excelApp = new Excel.Application();
    if (excelApp == null)
    {
        // Excel is not installed.
        Console.WriteLine("Excel is not properly installed!");
        return;
    }
    // Open Excel workbook
    Excel.Workbook workbook = excelApp.Workbooks.Open(excelPath);
    foreach (var sheetName in sheetNameList)
    {
        var worksheet = workbook.Sheets[sheetName] as Excel.Worksheet;
        if (worksheet == null) continue;
        // Clear specified cells
        foreach (var cell in cells)
        {
            var excelCell = worksheet.Range[cell];
            if (excelCell != null)
            {
                excelCell.Value = null;
            }
        }
        // Delete specified columns
        foreach (var column in deleteColumns.OrderByDescending(x => x)) // Sort descending to avoid index shifting issues
        {
            int columnNumber = ConvertColumnNameToNumber(column);
            if (columnNumber != 0)
            {
                Excel.Range range = (Excel.Range)worksheet.Columns[columnNumber];
                range.Delete(Excel.XlDeleteShiftDirection.xlShiftToLeft);
            }
        }
        // Delete specified rows
        foreach (var row in deleteRows.OrderByDescending(x => x)) // Sort descending to avoid index shifting issues
        {
            Excel.Range range = (Excel.Range)worksheet.Rows[row];
            range.Delete(Excel.XlDeleteShiftDirection.xlShiftUp);
        }
    }
    workbook.Save();
    workbook.Close();
    excelApp.Quit();
    ReleaseObject(workbook);
    ReleaseObject(excelApp);
}
// Convert column name to number
private int ConvertColumnNameToNumber(string columnName)
{
    int number = 0, pow = 1;
    for (int i = columnName.Length - 1; i >= 0; i--)
    {
        number += (columnName[i] - 'A' + 1) * pow;
        pow *= 26;
    }
    return number;
}
// Properly release COM object
private void ReleaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        obj = null;
        Console.WriteLine("Exception occurred while releasing object " + ex.ToString());
    }
    finally
    {
        GC.Collect();
    }
}

```


注意,Interop库不是一个最佳实践,因为它可能会产生性能问题和版本兼容性问题。它需要Excel程序在服务器或者客户端运行,这在某些环境中可能不被允许。另一个问题是Excel进程可能在任务结束后不会正确关闭,这可能会导致内存泄漏。

CL 最后更新于 2023-07-12 15:23
希晨 回复 CL 2023-07-12 15:27 :

先谢谢大佬的解决方案,不过这个对我来说,知识面有点超纲了,目前我还是用老办法,先合并批量删除再拆分,更好的解决方案只能静待有缘人了,再次感谢!

湘喑 2023-07-13 09:45
#2

没人出手吗,加我V:522452254

希晨 回复 湘喑 2023-07-13 10:04 :

大佬,已加你了

洛阳白菜 2023-07-13 14:11
#3
  1. 固定列和固定工作表的删除,用Excel的录制宏可以直接实现。
  2. 标颜色的删除,需要录制宏以后再改写一下VBA代码。
  3. 工作上如果经常使用,可以先实现第1步简化操作,然后学习一下第2步。
林青雀 2023-07-13 15:00
#4

感觉python比较好实现

洛阳白菜 2023-07-13 15:24
#5

嗯,python也可以,不过这种简单的,明显是Excel自带的VBA处理起来最方便。

动作已分享:

https://getquicker.net/Sharedaction?code=79e4295d-597a-4af2-5933-08db837051fc

希晨 回复 洛阳白菜 2023-07-13 15:42 :

哇,感谢大佬,刚刚测试了可以的;
但是能否修改一下?我截图上面的颜色,只是示意标注一下我要操作的行和列,导出来的原表是没有颜色的;
如果我想成功实现删除,我还得一个一个表格标记颜色,就有点费时费力了、
再次感谢大佬的解答!

洛阳白菜 回复 希晨 2023-07-13 15:57 :

列是固定的,不标注也不影响删除。

可是要删除的行,不标注就无法确定哪些要删,还是有什么判断标准?

洛阳白菜 最后更新于 2023-07-13 15:58
希晨 回复 洛阳白菜 2023-07-13 16:18 :

受教了,我通过大佬提供的vba代码,我做了下修改,实现了我刚说的的需求了,操作成功;
有个问题咨询下,动作运行只能作用于当前打开的工作簿么?我有20几个这样的工作簿,我需要依次打开工作簿,运行此动作么?可不可以批量呢?

希晨 最后更新于 2023-07-13 16:18
洛阳白菜 回复 希晨 2023-07-13 16:38 :

百度一下,批量执行VBA是现成的,复制代码,把调用的函数名称改成自己的就可以了。

参考:

https://blog.csdn.net/weixin_40112836/article/details/127942894

希晨 回复 洛阳白菜 2023-07-13 16:39 :

好的,谢谢了

洛阳白菜 回复 希晨 2023-07-13 16:49 :

哦,对了,我刚用Quicker不太熟悉,批量处理文件Quicker应该就可以实现。

把VBA复制到组合动作的打开和关闭保存文件之间,或者动作调用一下,更简单一些。

回复主贴