以下是电子表格示例
我想选择一个范围(例如:A2:E2
)并获取值1
。如果我选择A4:E4
,我将获得值1
;等等。有没有办法用宏来实现这个目标?
我需要的另一件事是相应列第一行的值。例如:
如果我选择A2:E2
我想获得n
(因为1在E列中),如果我选择A4:E4
我想获得v
(因为1是在C)栏中。
答案 0 :(得分:2)
以下代码应该做你想要的。注意:我没有选择任何东西,因为这会使事情变慢,没有任何优势。
Dim ColLast as Long
Dim ValueColLast as String
Dim HeadColLast as String
With Sheets(xxxxx)
ColLast = .Cells(2,Columns.Count).End(xlToLeft).Column
ValueColLast = .Cells(2, ColLast).Value
HeadColLast = .Cells(1,ColLast).Value
End With
Cells(Row, Column)
处理活动工作表中由行和列标识的单元格。行必须是数字。列可以是数字(例如1或104)或列标识符(例如“A”或“CZ”)
.Cells(Row, Column)
解决在With语句中标识的工作表中由行和列标识的单元格。注意前导点。
.Cells(2,Columns.Count)
解决了自Columns.Count
以来第2行中最后一个单元格给出当前版本Excel的每个工作表的列数。 `Rows.Count
对行执行相同的操作。
假设.Cells(2,Columns.Count)
为空,.Cells(2,Columns.Count).End(xlToLeft)
使用值查找指定方向的下一个单元格。这是VBA等同于Ctrl + LeftArrow。 xlToRight
,xlUp
和xlDown
允许您向其他方向移动。 .Cells(Rows.Count,"A").End(xlUp)
给出了A列中最后一次使用的行。
.Cells(2,Columns.Count).End(xlToLeft).Column
给出第2行中最后一次使用的列的编号。
ValueColLast = .Cells(2, ColLast).Value
将ValueColLast设置为第2行中最后一个单元格的值。我已将ValueColLast定义为String,因为如果我认为它是一个数字并将其定义为Long,那么我会得到一个错误不是。
HeadColLast = .Cells(1,ColLast).Value
将HeadColLast设置为第1行中的值。
希望这一切都有意义。
答案 1 :(得分:1)
好的,这是一个可以在工作簿中用作公式的函数。它还解决了两个您的问题。 :)
将以下代码粘贴到模块中。
<强>语法/ USAGE 强>
= MyFunc(细胞范围,Arg)
小区范围 :(必填)范围如A2:E2
Arg :(必填)可以取值“H”或“R”。 “H”将为您提供列标题,“R”将为您提供行值
示例强>
= MyFunc(A1:E2,“H”)会给你“n”AND
= MyFunc(A1:E2,“R”)会给你“1”
Option Explicit
Function MyFunc(rng As Range, stype As String) As Variant
Dim MyArray() As String
Dim sCol As Long
If stype = "" Or (UCase(stype) <> "H" And _
UCase(stype) <> "R") Then Exit Function
With rng
MyArray = Split(.Address, "$")
sCol = Cells(Val(MyArray(UBound(MyArray))), _
Columns.Count).End(xlToLeft).Column
If UCase(stype) = "H" Then
MyFunc = Cells(1, sCol)
ElseIf UCase(stype) = "R" Then
MyFunc = Range(MyArray(UBound(MyArray) - 1) & _
MyArray(UBound(MyArray))).Value
End If
End With
End Function
注意:这只是一个通用代码,向您展示它是如何工作的,目前它不处理任何错误。