I have excel where about 156 columns and 2000 rows. Here, 36 tasks are checked, where each taks is described by four columns - for example, “Name Task1”, “Launch date Task1”, “Completion date Task1”, “Total time spent on task 1.” Several times each of these 4 columns can have values for all, and sometimes all four columns have no meaning for it.Now the goal is to find a set of 4 tuples, where at least data with one column, but if there is no data, it will be said as unwanted set, so I need unwanted columns so that they move with one . Second hand and partially or completely filled with submitted data on one side but not the null set of data will move from right to left, if it immediately precedes has 4 empty columns, or whether or not I See the table below.:



EDIT:
Sub DataShiftFromLeftToRight(Ob6) Dim count Dim dataArray Dim height Dim width Dim rWidth Dim packArray Dim i Dim j dim rowArray dim ColumnInGroup dim k dim b With Ob6 .activate ColumnInGroup= 4 height = .Cells(.Rows.count, 1).End(-4162).Row ' assume 1st line is header ' start from 2nd line If height > 1 Then For i = 2 To height'Number of rows width = .Cells(i, .Columns.count).End(-4159).Column 'round width 'MsgBox(width) if (width -1 )mod columnInGroup <> 0 then width = (((width -1)\columnInGroup )+1)* columnInGroup + 1 end if if width > 1 then 'need to change to the column number 'finding the last unit originally packed redim rowArray(0,width-1) rowArray = .range(.cells(i,1), .cells(i,width)).value'here 1 need to change 'default value rWidth = width for j = 2 to width step ColumnInGroup'here j need to change if j+ColumnInGroup -1 <= width then b = false for k = 0 to ColumnInGroup - 1 if rowArray(1,j+k) <> "" then b = true exit for end if next if not b then rWidth = j - 1 exit for end if else rWidth = width end if next If width > rWidth Then ReDim dataArray(1 ,(width - rWidth)) dataArray = .Range(.Cells(i, rWidth + 1), .Cells(i, width)).Value count = 0 For j = LBound(dataArray, 2) To UBound(dataArray, 2) Step ColumnInGroup if j+ColumnInGroup - 1<= ubound(dataArray,2) then b = false for k = 0 to ColumnInGroup - 1 if dataArray(1,j+k) <> "" then b = true exit for end if next if b then count = count + 1 end if else exit for end if Next ReDim packArray(0, count * columnInGroup - 1) count = 0 For j = LBound(dataArray, 2) To UBound(dataArray, 2) Step columnInGroup ' we found a "T" Unit if j+columnInGroup -1<= ubound(dataArray,2) then b = false for k = 0 to ColumnInGroup - 1 if dataArray(1,j+k) <> "" then b = true exit for end if next if b then count = count + 1 for k = 0 to columnInGroup - 1 If j + k <= UBound(dataArray, 2) Then packArray(0, (count - 1) * columnInGroup + k ) = dataArray(1, j + k) end if next end if else exit for end if Next 'clear original data .Range(.Cells(i, rWidth + 1), .Cells(i, width)).ClearContents 'for j = 1 to ubound(packArray,2) ' .cells(i,rWidth+j).value = packArray(1,j) ' next .Range(.Cells(i, rWidth + 1), .Cells(i, rWidth + count * columnInGroup)).Value = packArray End If end if Next End If End With End Sub
But this is code that does not provide the correct data output. Please help me here