VBA使用列号的单元格值设置函数的范围

时间:2017-01-17 18:35:15

标签: excel vba excel-vba

我对Excel VBA比较陌生。我需要使用相应单元格的值设置许多COUNTA函数的列范围。每对匹配的单元具有每个函数的范围的正式列号和最终列号。我尝试将此单元格的值定义为变量,然后将变量定义为Address,并将值作为列号。 像这样:

public function update(Request $request, NewsModule $news)
{
    $news->update($request->all());

    $news->content->update($request->all());

    return fractal()
        ->item($news, new NewsModuleTransformer)
        ->parseIncludes(['content'])
        ->toArray();
}

问题是该函数不起作用,它只显示值“1”,而不管该范围内非空单元格的数量。我了解到,列的一部分也可以为Adress变量的范围指定一个名称,所以我找到了一种方法来做到这一点,但它似乎也没有用。 像这样:

Dim T1Address As String
T1Start = Sheets(2).Range("AQ3").Value
T1End = Sheets(2).Range("AR3").Value
T1Address = Cells(11, T1Start).Address & ":" & Cells(11, T1End).Address
Range("AT3").Select
ActiveCell.Formula = "=COUNTA('1st Sheet'!T1Address)"

我做错了什么?谢谢!

3 个答案:

答案 0 :(得分:0)

您将T1Address作为文字而不是变量传递。试试这个:

ActiveCell.Formula = "=COUNTA('1st Sheet'!" & T1Address & ")"

Shai Rado's approach实际上更好。 您可以忽略SelectActiveCell,只需使用

即可
Range("AT3").Formula = "=COUNTA('1st Sheet'!" & T1Address & ")"

我看到的另一个问题是,您尝试将"AQ3"中的单元格T1Start的值和"AR3"中的单元格T1End的值存储起来。不确定这是否真的是你的意图,但我认为你的意思是获得这些地址的列号。如果是这种情况,请替换为:

T1Start = Sheets(2).Range("AQ3").Value
T1End = Sheets(2).Range("AR3").Value

有了这个

T1Start = Sheets(2).Range("AQ3").Column
T1End = Sheets(2).Range("AR3").Column

更新:根据您的评论,您希望引用工作簿中的第一个工作表,无论其如何调用。以下是我所知道的替代方案:

  • Sheets(1).name - 考虑图表和工作表
  • Worksheets(1).name - 仅考虑工作表
  • Sheet1.name - 使用工作表的名称(不要与标题混淆,用户可以更改)
  • ThisWorkbook.Worksheets(1).name - 符合调用代码的工作簿,这意味着如果用户打开了多个工作簿,这仍然可以正常工作

请注意我正在使用工作表的.name属性,因为我不想使用整个对象。 当你说你试过的时候

Range("AT3").Formula = "=COUNTA(Sheets(1)" & T1Address & ")"  

你犯了同样的错误,因为你传递Sheets(1)作为文字而不是对象本身(实际上也是错误的)。这就是你如何做到的:

Range("AT3").Formula = "=COUNTA('" & Sheets(1).name & "'!" & T1Address & ")" 

这里有几点需要注意:

  • 我使用Sheets(1).name值作为参数,而不是文字(在我的代码和你的代码中比较Sheets(1)的高亮颜色以供视觉参考)
  • 我已将参数括在'(单引号)中,因为这就是Excel理解它的方式
  • 我还在名称后附加了!,因为这是Excel的语法

所以最后,假设您的工作表名为“MyWorksheet”而T1Address包含“A1”,则单元格“AT3”的值应为=COUNTA('MyWorksheet'!A1)

答案 1 :(得分:0)

您可以通过设置范围,然后从中检索Address来实现此目的。

注意:如果我有更多数据,例如Sheets(2) and/or' 1st Sheet'`和/或您要放置此公式的位置是可能重叠(同一张纸)。

尝试以下代码:

Dim T1Rng As Range

Set T1Rng = Range(Cells(11, Sheets(2).Range("AQ3").Column), Cells(11, Sheets(2).Range("AR3").Column))
Range("AT3").Formula = "=COUNTA('1st Sheet'!" & T1Rng.Address & ")"

答案 2 :(得分:0)

您在对其他答案之一的评论中说,您不想计算“1st Sheet”表单上的单元格,而是想要计算工作簿中当前首先显示的任何工作表上的单元格。如果是这样,请从以下位置更改您的代码:

Range("AT3").Select
ActiveCell.Formula = "=COUNTA('1st Sheet'!T1Address)"

Range("AT3").Formula = "=COUNTA('" & Worksheets(1).Name & "'!" & T1Address & ")"