我现在的土办法--EXCEL公式
- 增加辅助列,辅助列是我自己手动数出来的,空置了几行,填行数
- 下面输入
- 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