EXCEL 如何倒置一列,变成顶对齐? 使用公式或VBA

版权声明:一起学习,一起成长,欢迎关注 奔跑的犀牛先生 https://blog.csdn.net/xuemanqianshan/article/details/88684833

我现在的土办法--EXCEL公式

  1.  增加辅助列,辅助列是我自己手动数出来的,空置了几行,填行数
  2. 下面输入
  3. IF(INDIRECT("r"&(ROW(F3)+F$28)&"c"&COLUMN(F3),FALSE)=0,"",INDIRECT("r"&(ROW(F3)+F$28)&"c"&COLUMN(F3),FALSE))

IF(INDIRECT("r"&(ROW(D3)+D$28)&"c"&COLUMN(D3),FALSE)=0,"",INDIRECT("r"&(ROW(D3)+D$28)&"c"&COLUMN(D3),FALSE))

左上角是a1

                 
      r1 r2 r3 r4 r5 r6
0 0 15 50 52        
1 1 29 53 55 56      
2 2 43 56 58 60 59    
3 3 51 60 62 64 63    
4 4 59 64 66 69 67    
5 5 67 69 71 75 73    
6 6 81 74 76 80 78 82  
7 7 89 79 82 86 84 88  
8 8 97 85 88 92 90 94  
9 9 111 92 95 99 98 100 91
10 10 119 99 102 107 106 108 98
11 11 127 107 110 116 115 117 106
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
                 
      0 0 1 2 6 9
      r1 r2 r3 r4 r5 r6
0 0 15 50 52 56 59 82 91
1 1 29 53 55 60 63 88 98
2 2 43 56 58 64 67 94 106
3 3 51 60 62 69 73 100  
4 4 59 64 66 75 78 108  
5 5 67 69 71 80 84 117  
6 6 81 74 76 86 90    
7 7 89 79 82 92 98    
8 8 97 85 88 99 106    
9 9 111 92 95 107 115    
10 10 119 99 102 116      
11 11 127 107 110        

应该还有更好的公式写法

VBA的方法1:实现一列

左上角a1

1    
2    
3    
4   1
5   2
6   3
7   4
    5
    6
    7
Sub 置顶()
    count_a = 10 - WorksheetFunction.CountA([a1:a10])
    For i = 1 To 10
        Sheet1.Cells(i + count_a, 3) = Sheet1.Cells(i, 1)
    Next i
End Sub

VBA方法,实现自动--面前能用

1        
2 1      
3 2   1  
4 3 1 2  
5 4 2 3  
6 5 3 4  
7 6 4 5  
8 7 5 6 1
9 8 6 7 2
10 9 7 8 3
0 1 3 2 7
         
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4  
5 5 5 5  
6 6 6 6  
7 7 7 7  
8 8   8  
9 9      
10        
Sub 置顶()
Rem 需要实现的是多列的转换而不只是1列的
    For j = 1 To 5
Rem        count_a = 10 - WorksheetFunction.CountA(Range("A1:A10"))
           count_a = 10 - WorksheetFunction.CountA(Range(Cells(1, j), Cells(10, j)))
Rem        count_a = 10 - WorksheetFunction.CountA([cells(1,j):cells(10,j)])
        Cells(11, j) = count_a
        For i = 1 To 10
            If (i + count_a) <= 10 Then
            Sheet1.Cells(12 + i, j) = Sheet1.Cells(i + count_a, j)
            ElseIf (i + count_a) > 10 Then
            Sheet1.Cells(12 + i, j) = ""
            End If
        Next i
    Next j
End Sub

但是数据变这样怎么处理?

1 之前的思路不太对

2 比较通用的思路,应该是这样

      先逐列

      再逐行

     判断是否超过了目标区域的范围

      判断目标列里的单元格,是否有内容,如果有内容则写入,否则读下一个数,并且保存变量

     等会有时间再写写

1        
2 1      
3 2   1  
4 3 1 2  
5 4 2 3  
6 5 3 4  
7 6 4 5  
  7 5 6 1
    6 7 2
    7   3
         
         
         
         
         
         
         
         
         
         
         
         

还不好用的代码

第2段

Sub 递归且置顶()
Rem 需要实现,对目标区域数据分布无要求,更有通用性

    For j = 1 To 1
Rem        blankCountSum = 10 - WorksheetFunction.CountA(Range(Cells(1, j), Cells(10, j)))
        For i = 1 To 10
            Call judge(i, j)
        Next i
    Next j
End Sub

Function judge(a, b)
    If a > 10 Then
       Cells(a, b) = ""
    Else
        If IsEmpty(Cells(a, b)) Then
            Sheet1.Cells(12 + a, b) = Sheet1.Cells(a + 1, b)
            Rem 需要处理下一行是否还是空的,递归?
            Call judge(a + 1, b)
        Else
            Sheet1.Cells(12 + a, b) = Sheet1.Cells(a, b)
            Rem 需要处理之前已经先下移的行数
        End If
        
    End If
End Function

第1段

Sub 草稿()
Rem 需要实现,对目标区域数据分布无要求,更有通用性

    For j = 1 To 1
        c = 0
Rem        blankCountSum = 10 - WorksheetFunction.CountA(Range(Cells(1, j), Cells(10, j)))
        For i = 1 To 10
            Call judge(i, j)
        Next i
    Next j
End Sub


Function judge(i, j)
    Cells(12, j) = blankCount
    a = i
    d = 0
    If a > 10 Then
       Cells(a, j) = ""
    Else
        If IsEmpty(Cells(a, j)) Then
            Sheet1.Cells(12 + i, j) = Sheet1.Cells(a + 1, j)
            a = i + 1
            d = d + 1
            judge = judge(a, j)
        Else
            Sheet1.Cells(12 + i, j) = Sheet1.Cells(i + d, j)
Rem            MsgBox " i=" & i & " a=" & a & " blankCount=" & d
        End If
        
    End If
End Function

删除方法也不好用

Sub 删空行且置顶()
Rem 需要实现,对目标区域数据分布无要求,更有通用性
    For j = 1 To 5
        For i = 1 To 10
            If IsEmpty(Cells(i, j)) Then
                Sheet1.Cells(i, j).Delete Shift:=xlShiftUp
            End If
        Next i
    Next j
End Sub

猜你喜欢

转载自blog.csdn.net/xuemanqianshan/article/details/88684833
今日推荐