我对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)"
我做错了什么?谢谢!
答案 0 :(得分:0)
您将T1Address
作为文字而不是变量传递。试试这个:
ActiveCell.Formula = "=COUNTA('1st Sheet'!" & T1Address & ")"
Shai Rado's approach实际上更好。
您可以忽略Select
和ActiveCell
,只需使用
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 & ")"