排名不重复,即使是相同值,先出现的排名在前。输入的公式是:=RANK(A1,$A 1 : 1: 1:A$17)+COUNTIF(A 1 : A 1 , A 1 ) − 1 , 第 1 次 选 择 一 个 单 元 格 A 1 , 第 1 次 选 择 区 间 1:A1,A1)-1 , 第1次选择一个单元格A1, 第1次选择区间 1:A1,A1)−1,第1次选择一个单元格A1,第1次选择区间A 1 : 1: 1:A$17,第3次选择保存的一个单元格位置。
Sub 排名不重复()
MsgBox "排名不重复,即使是相同值,先出现的排名在前。输入的公式是:=RANK(A1,$A$1:$A$17)+COUNTIF(A$1:A1,A1)-1 , 第1次选择一个单元格A1, 第1次选择区间$A$1:$A$17,第3次选择保存的一个单元格位置。"
Set rng1 = Application.InputBox(prompt:="鼠标选择排名中的一个单元格,如A1。", Type:=8)
a_rc = rng1.Address ' $A$1,双重锁定 lock row and column
'a_k = rng1.Address(1, 1) '$A$1
a = rng1.Address(0, 0) 'A1, unlock row and column
a_r = rng1.Address(1, 0) 'A$1, rng1.Address(行, 列),锁定行就是锁定A1中的1.
a_c = rng1.Address(0, 1) '$A1
' Debug.Print a_rc
' Debug.Print a_k
' Debug.Print a
' Debug.Print a_r
' Debug.Print a_c
'Debug.Print a
' Debug.Print Split([b3].Address, "$")(1)
' Debug.Print Split([bc3].Address, "$")(1)
'Debug.Print Split(a, "$")(1) '列标字母
'Debug.Print Split(a, "$")(2) '行号
'Debug.Print ActiveCell.Row
'Debug.Print rng1.Row '行号
Set rng2 = Application.InputBox(prompt:="鼠标选择排名中的一列数个单元格,如$A$1:$A$17。", Type:=8)
' '有些是文本格式,但是也可以计算正确的剩余时间。此处只是作提醒。
b_rc = rng2.Address ' $A$1,双重锁定 lock row and column
b = rng2.Address(0, 0) 'A1, unlock row and column
b_r = rng2.Address(1, 0) 'A$1, rng1.Address(行, 列),锁定行就是锁定A1中的1.
b_c = rng2.Address(0, 1) '$A1
Set rng3 = Application.InputBox(prompt:="鼠标选择保存结果的一个单元格,如B1。", Type:=8)
'rng3.Formula = "RANK(" & a & "," & b_rc & ")" & "+COUNTIF(" & a_r & ":" & a & "," & a & ")-1" '少了等号,运行后可以查看公式
rng3.Formula = "=RANK(" & a & "," & b_rc & ")" & "+COUNTIF(" & a_r & ":" & a & "," & a & ")-1"
'=RANK(M4,$M$4:$M$20)+COUNTIF(M$4:M4,M4)-1
'cell = "$" & Split(a, "$")(1)
'Debug.Print cell
'Call lock_rc(a)
' Debug.Print lock_rc(a, 2)
End Sub
上述代码的参考说明:
'Address(0, 0) 相对引用
'Address绝对引用
'Address(1, 0) 混合引用 (相对列绝对行)
'Address(0,1) 混合引用 (相对行绝对列)
'Public Function lock_rc(cell, inte)
' Select Case inte
' Case 1
' lock_rc = "$" & Split(cell, "$")(1)
' 'Debug.Print cell
' Case 2
' lock_rc = "2" & Split(cell, "$")(1)
' Case 3
' lock_rc = "3" & Split(cell, "$")(1)
' End Select
'End Function
'Public Function lock_rc(cell)
' lock_rc = "$" & Split(cell, "$")(1)
' 'Debug.Print cell
'
'End Function
'Function 函数名(参数列表 ... )
' 函数体
' 函数名 = 返回值
'End Function
'
'Function lockRC(cell As String, str2 As String) 'lock row or column, inte is short for integer
' 'cell = "$" & Split(cell, "$")(1) & Split(a, "$")(2)
' cell = "123"
'' Select Case str2
'' Case r
'' cell = "$" & Split(cell, "$")(1) & Split(a, "$")(2)
''
'' End Select
'
'End Function
'列标 = VBA.Split(Cells(1, 9).Address, "$")(1) 中的红色部分表示什么意思 ?相当于什么 ?还有类似情况吗 ?
'Split()函数是将Cells(1,9).Address,也就是单元格地址:$I$1,依据"$"作为分隔符,分割成一个一维数组,也就是会得到{"","I","1"},
'而这个数组里有三个元素,分别是(0)、(1)和(2),(1)就是取数组里的第二个元素……
'
'如果一维数组里有四个元素,那就可以用(0)、(1)、(2)、(3)来代表其中的各个元素……
'以"$"为分隔符
'0→“$"前的值(空)
'1→第1个”$"后的数(第2个"$"之前)
'2→第2个"$"后的数(第3个"$"之前)
'‘.......
'如:
'列标 = VBA.Split(Cells(1, 256).Address, "$")(1) '→答案是“iv"
'列号 = VBA.Split(Cells(5, 256).Address, "$")(2) '→答案是“5"
'
'2 VBA过程,函数的返回,对比python等
'python的函数一定会返回,函数带return 不带默认会返回 return none
'VBA的function也是一定有返回值把,至少是none
'VBA的sub 没有返回值
'
'
'返回的方式不同
'python 的function 可以使用 return返回
'VBA的function 直接让 function_name = xxxx 这样返回
'并且VBA的sub不能返回值,sub_name=xxxx 会报错