excel行中的数据分区

excel行中的数据分区,excel,vbscript,vba,Excel,Vbscript,Vba,我有一个excel,其中大约有156列和2000行。这里有36项任务正在被审核,其中每个TAK由4列描述——比如“任务1名称”、“任务1开始日期”、“任务1完成日期”、“在任务1中花费的总时间”。现在,有时这4列中的每一列都有值,有时这4列中的所有列都没有值。现在的目标是找出这样一个4元组集,其中至少有一列数据。但如果数据不存在,那么它将被视为不需要的集。因此,我需要将这些不需要的列移到一侧,并将其部分移到另一侧已存档或完全存档的数据在一侧。但如果非空数据集的前一个数据集有4个空白列,则该数据集

我有一个excel,其中大约有156列和2000行。这里有36项任务正在被审核,其中每个TAK由4列描述——比如“任务1名称”、“任务1开始日期”、“任务1完成日期”、“在任务1中花费的总时间”。现在,有时这4列中的每一列都有值,有时这4列中的所有列都没有值。现在的目标是找出这样一个4元组集,其中至少有一列数据。但如果数据不存在,那么它将被视为不需要的集。因此,我需要将这些不需要的列移到一侧,并将其部分移到另一侧已存档或完全存档的数据在一侧。但如果非空数据集的前一个数据集有4个空白列,则该数据集将从右向左移动,否则。请在下面查找输入表:

编辑:

子数据从左移到右(Ob6)
模糊计数
Dim数据阵列
暗高
暗宽
暗宽度
暗箱
昏暗的我
Dim j
暗行阵列
暗列组
暗k
暗淡的b
带Ob6
.激活
ColumningGroup=4
高度=.Cells(.Rows.count,1).End(-4162).Row
'假设第一行是标题
'从第二行开始
如果高度>1,则
对于i=2到高度的行数
宽度=.Cells(i、.Columns.count).End(-4159).Column
“圆形宽度
'MsgBox(宽度)
如果(宽度-1)mod ColumningGroup为0,则
宽度=((宽度-1)\ColumningGroup)+1)*ColumningGroup+1
如果结束
如果宽度>1,则需要更改为列号
“找到最初包装的最后一个单元
redim行阵列(0,宽度-1)
rowArray=.range(.cells(i,1),.cells(i,width)).value'这里1需要更改
'默认值
rWidth=宽度
对于j=2到宽度步长ColumningGroup',此处j需要更改
如果j+列组-1 rWidth,则
ReDim数据阵列(1,(宽度-宽度))
数据数组=.Range(.Cells(i,rWidth+1),.Cells(i,width)).Value
计数=0
对于j=LBound(dataArray,2)到UBound(dataArray,2)的步骤列组

如果j+ColumningGroup-1此代码将所有“填充”任务向左移动:

Sub ShiftTasks()

    Dim wst As Excel.Worksheet
    Dim lRow As Long
    Dim lTask As Long
    Dim lCol As Long

    Const NUM_TASKS As Long = 36
    Const COL_FIRST As Long = 12

    Set wst = ActiveSheet

    With wst

        For lRow = 2 To .UsedRange.Rows.Count
            lTask = 1
            Do While lTask <= NUM_TASKS
                lCol = COL_FIRST + (lTask - 1) * 4
                If Len(.Cells(lRow, lCol).Value) = 0 And _
                   Len(.Cells(lRow, lCol + 1).Value) = 0 And _
                   Len(.Cells(lRow, lCol + 2).Value) = 0 And _
                   Len(.Cells(lRow, lCol + 3).Value) = 0 Then
                    ' make sure there is something to the right to shift over
                    If .Cells(lRow, lCol).End(xlToRight).Column < .Columns.Count Then
                        ' delete the empty cells and shift everything left``
                        .Range(.Cells(lRow, lCol), .Cells(lRow, lCol + 3)).Delete Shift:=xlToLeft
                    Else
                        ' force the loop to the next row
                        lTask = NUM_TASKS + 1
                    End If
                Else
                    lTask = lTask + 1
                End If
            Loop
        Next lRow
    End With

End Sub
子移位任务()
将wst设置为Excel.Worksheet
暗淡的光线和长的一样
时间越长越好
暗淡的lCol尽可能长
Const NUM_任务长度=36
Const COL_FIRST长=12
Set wst=ActiveSheet
与wst
对于lRow=2到.UsedRange.Rows.Count
lTask=1

执行lTask此代码将所有“填充”任务移到左侧:

Sub ShiftTasks()

    Dim wst As Excel.Worksheet
    Dim lRow As Long
    Dim lTask As Long
    Dim lCol As Long

    Const NUM_TASKS As Long = 36
    Const COL_FIRST As Long = 12

    Set wst = ActiveSheet

    With wst

        For lRow = 2 To .UsedRange.Rows.Count
            lTask = 1
            Do While lTask <= NUM_TASKS
                lCol = COL_FIRST + (lTask - 1) * 4
                If Len(.Cells(lRow, lCol).Value) = 0 And _
                   Len(.Cells(lRow, lCol + 1).Value) = 0 And _
                   Len(.Cells(lRow, lCol + 2).Value) = 0 And _
                   Len(.Cells(lRow, lCol + 3).Value) = 0 Then
                    ' make sure there is something to the right to shift over
                    If .Cells(lRow, lCol).End(xlToRight).Column < .Columns.Count Then
                        ' delete the empty cells and shift everything left``
                        .Range(.Cells(lRow, lCol), .Cells(lRow, lCol + 3)).Delete Shift:=xlToLeft
                    Else
                        ' force the loop to the next row
                        lTask = NUM_TASKS + 1
                    End If
                Else
                    lTask = lTask + 1
                End If
            Loop
        Next lRow
    End With

End Sub
子移位任务()
将wst设置为Excel.Worksheet
暗淡的光线和长的一样
时间越长越好
暗淡的lCol尽可能长
Const NUM_任务长度=36
Const COL_FIRST长=12
Set wst=ActiveSheet
与wst
对于lRow=2到.UsedRange.Rows.Count
lTask=1

Do While lTask这个问题的意图并不完全清楚,但更糟糕的是,它完全没有显示出编码的努力。如果您需要代码方面的帮助,请向我们展示您的尝试,我们可能会更容易地提供帮助。当然,我会。。。请查看我的EDT。如果所有任务(n)列都为空,是否要将4个任务(n)列移到任务(n-1)位置?例如,任务(4)列(4组列有数据)。但是任务(1)和任务(3)列(4组列为空),因此现在任务(4)列需要从右向左移动。如果您感到困惑,让我知道。有人能帮我离开这里吗?这个问题的意图并不完全清楚,但更糟糕的是,它显示出在编码方面完全没有努力。如果您需要代码方面的帮助,请向我们展示您的尝试,我们可能会更容易地提供帮助。当然,我会。。。请查看我的EDT。如果所有任务(n)列都为空,是否要将4个任务(n)列移到任务(n-1)位置?例如,任务(4)列(4组列有数据)。但是任务(1)和任务(3)列(4组列为空),因此现在任务(4)列需要从右向左移动。如果您感到困惑,让我知道。有人能帮我离开这里吗?你是在删除空列,但是说第二行没有该列的数据,但是其他行可以有该列的数据,所以这可能会导致数据丢失-我说的对吗?行正在这样做吗?“.Range(.Cells(lRow,lCol),.Cells(lRow,lCol+3)).Delete Shift:=xlToLeft”根据逻辑,所有的“和”条件都需要替换为“或”。正如我前面所说,如果一个4元组集合在最小值时有4列中的一个数据,则不能将其视为空白的4元组集合。1)只删除单元格,而不是删除整列。2) 是的,这是执行删除操作的行。3) And是正确的--只有当所有4个单元格都为空时,数据才会被删除。因此,delete意味着您将下一个填充的4元组集从右向左移动。我对吗?您是否删除空列,但假设第2行没有该列的数据,但其他行可以有该列的数据,因此可能导致数据丢失?我对吗?行是否这样做了?“.Range(.Cells(lRow,lCol),.Cells(lRow,lCol+3)).Delete Shift:=xlToLeft”根据逻辑,所有的“和”条件都需要替换为“或”。正如我前面所说,如果一个4元组集合在最小值时有4列中的一个数据,则不能将其视为空白的4元组集合。1)只删除单元格,而不是删除整列。2) 是的,这是执行删除操作的行。3) 和是正确的——只有当所有4个单元格都为空时,数据才会被删除。因此,删除意味着您将下一个填充的4元组集从右向左移动。我对吗?