Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何获取行中最后一个非空单元格的值?_Vba_Excel_Excel 2010 - Fatal编程技术网

Vba 如何获取行中最后一个非空单元格的值?

Vba 如何获取行中最后一个非空单元格的值?,vba,excel,excel-2010,Vba,Excel,Excel 2010,这是一个示例电子表格 我想选择一个范围(例如:A2:E2)并获取值1。如果我选择A4:E4,我将得到值1;等等有没有办法用宏实现这一点 我需要的另一件事是对应列第一行中的值。例: 如果我选择A2:E2我想得到n(因为1在列E中),如果我选择A4:E4我想得到v(因为1在列C中)。下面的代码应该是你想要的。注意:我没有选择任何东西,因为这会减慢速度,没有任何优势 Dim ColLast as Long Dim ValueColLast as String Dim HeadColLast as S

这是一个示例电子表格

我想选择一个范围(例如:
A2:E2
)并获取值
1
。如果我选择
A4:E4
,我将得到值
1
;等等有没有办法用宏实现这一点

我需要的另一件事是对应列第一行中的值。例:


如果我选择
A2:E2
我想得到
n
(因为1在列E中),如果我选择
A4:E4
我想得到
v
(因为1在列C中)。

下面的代码应该是你想要的。注意:我没有选择任何东西,因为这会减慢速度,没有任何优势

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
单元格(行、列)
处理活动工作表中由行和列标识的单元格。行必须是数字。列可以是数字(如1或104)或列标识符(如“a”或“CZ”)

.Cells(行、列)
处理With语句中标识的工作表中由行和列标识的单元格。注意前导点

.Cells(2,Columns.Count)
根据当前版本Excel中每个工作表的列数,处理自
Columns.Count以来第2行中的最后一个单元格
`Rows.Count
对行执行相同的操作

假设
.Cells(2,Columns.Count)
为空,
.Cells(2,Columns.Count).End(xlToLeft)
在指定方向上查找具有值的下一个单元格。这是与Ctrl+LeftArrow等效的VBA
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定义为一个字符串,因为如果我假设它是一个数字并将其定义为Long,那么如果它不是,我将得到一个错误

HeadColLast=.Cells(1,ColLast).Value
将HeadColLast设置为第1行中的值


希望这一切都有意义。

好的,这里有一个函数,可以在工作簿中用作公式。它还解决了您的两个问题:

将下面的代码粘贴到模块中

语法/用法

=MyFunc(单元格范围,Arg)

单元格范围:(必需)A2:E2等范围

Arg:(必需)可以取“H”或“R”的值。“H”将给出列标题,“R”将给出行值

示例

=MyFunc(A1:E2,“H”)将给出“n”和

=MyFunc(A1:E2,“R”)将为您提供“1”

选项显式
函数MyFunc(rng作为范围,stype作为字符串)作为变量
Dim MyArray()作为字符串
淡烤饼一样长
如果stype=“”或(UCase(stype)“H”和_
UCase(stype)“R”)然后退出函数
带rng
MyArray=Split(.Address,“$”)
sCol=单元格(Val(MyArray)(UBound(MyArray))_
Columns.Count).End(xlToLeft.Column
如果UCase(stype)=“H”,则
MyFunc=单元格(1,sCol)
ElseIf UCase(stype)=“R”然后
MyFunc=范围(MyArray(UBound(MyArray)-1)和_
MyArray(UBound(MyArray))).Value
如果结束
以
端函数

注意:这只是一个通用代码,向您展示了它是如何工作的,目前它不会处理任何错误。

您可以用内联注释解释代码,以避免答案混乱。另外,如果您没有选择任何内容,您的代码如何知道要返回哪些值?@JP。我认为(也许不公平)OP对语法知之甚少,所以我想提供一个详细的解释。我将使用内联注释来解释我为什么要做某事,而不是解释语法。也许我不清楚;我应该说我没有像在no
Range(X)中那样选择工作表、范围或单元格。选择
Value=ActiveCell.Value
。使用箭头键快捷键确定范围限制不需要两个完整性测试a)测试用于启动搜索的单元格是否为空[不常见,因为这通常意味着整行/整列如果已满]b)测试找到的单元格不是空的[更常见的是,行和列通常是完全空的].我发布的链接中的
Find
方法绕过了这一检查process@brettdj.我无法获得接近500个字符的对brettdj和JP的回复,因此需要将两条评论作为一条来阅读。我发现,如果我必须与一个问题作斗争,我会学到最好的东西。无论我找到还是得到解决方案,我都会记住它,并记住一点更多内容指导了我回答问题的方法:解决方案和更多内容。但是这种方法在查找某个范围内最后使用的单元格时会出现故障,因为每种技术(查找、箭头键快捷方式、特殊单元格)在一种或多种情况下失败。@JP.我是否解释了解决方案,或者什么时候可能会失败,因为两种方法都做得太多了?在这里,我对箭头键快捷方式进行了过度解释,并忽略了失败条件。错了?可能是在这种情况下?我有一个工作簿,其中包含大约20个工作表,每个工作表都显示了不同的结果边界条件和一个适用于所有这些条件的例程。自从我写了这个例程以来,我学到了很多关于边界条件的知识。也许我应该回顾一下并发表它。可能的副本。是的,这是一个多副本。关于获取列中最后一个非空单元格,也有很多问题——答案是实际上是一样的。@user1112251,你必须开始使用搜索函数。你的解决方案很好,但是当我使用“H”来获取标题时,它只返回0。我在发布之前已经尝试过该代码。希望你没有在与我相同的行中输入公式
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