Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在所有图纸VBA中的相同位置获取某些列标题_Excel_Vba - Fatal编程技术网

Excel 在所有图纸VBA中的相同位置获取某些列标题

Excel 在所有图纸VBA中的相同位置获取某些列标题,excel,vba,Excel,Vba,我有一本工作簿,里面有很多包含不同列数的工作表。每张图纸中都有一列标题为“TOTAL.x”,其中x是图纸编号。我试图在每个工作表中找到总计列,并将其移动到相同的位置,这样当工作表合并到一个工作表中时,所有总计列都位于同一列中 下面是一个简单的表格示例,可以更好地解释我试图获得的内容: 表1: 第2张: 第3张: 在上面的示例中,目标是将所有图纸中的“总计”列移动到“G”列。这相当于在每张图纸的总列之前插入不同数量的空列,分别为1、4和0 它可以分为以下两个任务: 查找每个工作表中的总列,并

我有一本工作簿,里面有很多包含不同列数的工作表。每张图纸中都有一列标题为“TOTAL.x”,其中x是图纸编号。我试图在每个工作表中找到总计列,并将其移动到相同的位置,这样当工作表合并到一个工作表中时,所有总计列都位于同一列中

下面是一个简单的表格示例,可以更好地解释我试图获得的内容:

表1:

第2张:

第3张:

在上面的示例中,目标是将所有图纸中的“总计”列移动到“G”列。这相当于在每张图纸的总列之前插入不同数量的空列,分别为1、4和0

它可以分为以下两个任务:

  • 查找每个工作表中的总列,并将其移动到最大数据范围右侧的列。(在上例中,G列右边的任何列)
  • 在每个工作表中,检查A列是否为空,如果A列在所有工作表中为空,则在所有工作表中删除A列,如果不移动到下一列,则继续到为task1选择的列
  • 我几乎完成了任务1:

    Sub Task1()
    Application.ScreenUpdating = False
    Dim ws As Worksheet
    Dim starting_ws As Worksheet
    Set starting_ws = ActiveSheet
    For Each ws In ThisWorkbook.Worksheets
        ws.Activate
        Dim search As Range
        Set search = Rows("1:1").Find("TOTAL", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)
        If Not search Is Nothing Then
            Application.CutCopyMode = False
            search.EntireColumn.Cut
            Columns("J").Select
            Selection.Insert Shift:=xlToRight
            Application.CutCopyMode = False
        End If
    Next
    starting_ws.Activate
    End Sub
    
    问题1:(已解决)

    只有当TOTAL列的标题是“TOTAL”时,我才能让它工作,而当TOTAL只是实际标题名“TOTAL.1”、“TOTAL.2”和“TOTAL.3”的前缀时,它就不能工作。解决方案可以是让它使用前缀TOTAL,或者将“TOTAL.x”替换为“TOTAL”

    问题2:

    我不知道如何检查某一列在所有工作表中是否为空,如果为真,则删除所有工作表中的该列

    我已经尝试解决我的问题很长时间了,我期待着看到一些想法,并在任务中得到一些帮助。任何使代码更优雅或更快的想法都是受欢迎的

    更新


    任务1现在已解决。

    关于任务1,我必须做一些修复,使其在我自己的计算机上工作。在这里,它是完美的工作。我正在处理任务2,并将发布更新

    Sub Task1()
    Application.ScreenUpdating = False
    Dim ws As Worksheet
    Dim starting_ws As Worksheet
    Set starting_ws = ActiveSheet
    
    For Each ws In Worksheets
    
        MsgBox "This is fun" & ws.Name
    
        ws.Activate
        Dim search As Range
        Set search = ws.Rows("1:1").Find("TOTAL", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False)
        If Not search Is Nothing Then
            Application.CutCopyMode = False
            search.EntireColumn.Cut
            ws.Columns("J").Select
            Selection.Insert Shift:=xlToRight
            Application.CutCopyMode = False
        End If
        
        MsgBox "END-This is fun" & ws.Name
    Next
    starting_ws.Activate
    End Sub
    
    更新 对于任务2,我使用CountA并进行概念验证。 在这里,它似乎在我的电脑上工作:

    Sub Task2()
    
    Dim ws As Worksheet
    Dim starting_ws As Worksheet
    Set starting_ws = ActiveSheet
    
    Dim deleteColumn As Boolean
    
    Dim totalColumnsToCheck
    Dim currentIterations
    
    totalColumnsToCheck = 20
    currentIterations = 0
    
    For c = 1 To totalColumnsToCheck
    
        deleteColumn = True
    
        For Each ws In Worksheets
        
             ws.Activate
            
            If WorksheetFunction.CountA(ws.Columns(c)) > 0 Then
                deleteColumn = False
            Else
                
            End If
    
        Next
    
        If deleteColumn Then
         For Each ws In Worksheets
                 ws.Activate
                 ws.Columns(c).EntireColumn.Delete
            Next
            totalColumnsToCheck = totalColumnsToCheck - 1
            
            If c > 0 Then
                c = c - 1
            End If
            
        End If
        
        currentIterations = currentIterations + 1
        
        If currentIterations > totalColumnsToCheck Then
            Exit For
        End If
    
    Next c
    
    
    starting_ws.Activate
    
    
    End Sub
    

    更改为
    LookAt:=xlpart
    @SJR非常感谢,解决了我第二季度的第一个任务可能使用COUNTA公式?@User123456789我认为任务1和任务2都可以:)