VBA-基于标题值设置函数范围
我是VBA新手,所以我需要一些帮助来完成这个项目。我试图编写一个易于伸缩和扩展的脚本,因此我尽量避免硬代码值。我也不想在代码中使用任何Excel函数。我有一个计算范围平均值的函数。我有一个sub可以把平均值打印到一个单独的文本文件中。但是,我不想硬编码我需要取平均值的范围。是否可以搜索标题(不使用查找),然后指定标题下的值范围 这是我到目前为止所拥有的。请注意,范围现在已硬编码。这是完美的工作,因为是,但我需要它更灵活的情况下,数据并不总是以相同的方式呈现VBA-基于标题值设置函数范围,vba,excel,find,range,Vba,Excel,Find,Range,我是VBA新手,所以我需要一些帮助来完成这个项目。我试图编写一个易于伸缩和扩展的脚本,因此我尽量避免硬代码值。我也不想在代码中使用任何Excel函数。我有一个计算范围平均值的函数。我有一个sub可以把平均值打印到一个单独的文本文件中。但是,我不想硬编码我需要取平均值的范围。是否可以搜索标题(不使用查找),然后指定标题下的值范围 这是我到目前为止所拥有的。请注意,范围现在已硬编码。这是完美的工作,因为是,但我需要它更灵活的情况下,数据并不总是以相同的方式呈现 Function AvgMS(Rng
Function AvgMS(Rng As Range) As Double
Total = 0
Count = 0
For Each cell In Rng
If Not IsEmpty(cell) Then
Total = Total + cell.Value
Count = Count + 1
End If
Next cell
AvgMS = Total / Count
End Function
Sub Average() 'Generate CSV File
Dim FilePath As String
Dim AMS As Double
'Directory Address
FilePath1 = "Macintosh HD:Users:Me:Documents:Project:avg.csv"
FileNum = FreeFile
Open FilePath1 For Output As #FileNum
AMS = AvgMS(Range(Range("B2"), Range("B2").End(xlDown))) 'Define Data Range for AvgMS Function
Print #FileNum, AMS ' Print text to file.
Close #FileNum ' Close file.
MsgBox ("avg.csv successfully updated")
End Sub
您可以使用以下代码在“Sheet1”的“used range”中搜索文本“Header”:
函数FindFirstOccurrence(FindString作为字符串)作为范围
变暗rng As范围
如果修剪(FindString)“,则
带有图纸(“图纸1”)。使用图纸
Set rng=.Find(What:=FindString_
之后:=.Cells(.Cells.Count)_
LookIn:=xlValues_
看:=xlother_
搜索顺序:=xlByRows_
SearchDirection:=xlNext_
匹配案例:=假)
如果不是,那么rng什么都不是
设置FindFirstOccurrence=rng
其他的
设置FindFirstOccurrence=Nothing
如果结束
以
如果结束
端函数
子测试()
变暗rng As范围
设置rng=FindFirstOccurrence(“标题”)
如果不是,那么rng什么都不是
MsgBox注册地址
其他的
MsgBox“未找到”
如果结束
端接头
我希望您能根据您的要求调整它,但如果您需要更多的解释,请告诉我。提出了这个简单的解决方案,它很有效。这有什么问题吗
'Find column where the data is located and set range
i = 1
Do Until Cells(1, i) = "Text"
i = i + 1
Loop
CellNum = Cells(1, i).Offset(1, 0).Address(RowAbsolute:=False, ColumnAbsolute:=False)
'Set the range for AMS Function
Set MSrng = Range(CellNum, Range(CellNum).End(xlDown))l
嗨,谢谢你的回复。这看起来不错,但它抛出了一个错误,并表示需要对象。与
Set FindFirstOccurrence=vbNothing
部分有关。@DillonMcDonald:对不起,我赶时间,没有正确检查。请检查更新的代码。有几个问题,是的。(1) 如果找不到“文本”,您围绕i
的循环将永远不会结束。(2) 如果您试图查找的文本不在第1行中,该怎么办?您在问题中从未说过必须始终在第一行找到它。我在回答中发布的代码出了什么问题?嗨,很抱歉给你带来困惑。你的代码实际上工作得很好。我还可以修改它,将范围设置在它下面。(参见下面的代码)但我的目标是只使用VBA代码,而不使用Excel函数。是。查找不是excel函数?这是范围
对象的方法,所以不是excel函数。哦。好的,那就行了。再次感谢您的澄清。我能做我需要的只是改变这个部分rng1=rng.Offset(1,0).地址(RowAbsolute:=False,ColumnAbsolute:=False)
'Find column where the data is located and set range
i = 1
Do Until Cells(1, i) = "Text"
i = i + 1
Loop
CellNum = Cells(1, i).Offset(1, 0).Address(RowAbsolute:=False, ColumnAbsolute:=False)
'Set the range for AMS Function
Set MSrng = Range(CellNum, Range(CellNum).End(xlDown))l