Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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_Find_Range - Fatal编程技术网

VBA-基于标题值设置函数范围

VBA-基于标题值设置函数范围,vba,excel,find,range,Vba,Excel,Find,Range,我是VBA新手,所以我需要一些帮助来完成这个项目。我试图编写一个易于伸缩和扩展的脚本,因此我尽量避免硬代码值。我也不想在代码中使用任何Excel函数。我有一个计算范围平均值的函数。我有一个sub可以把平均值打印到一个单独的文本文件中。但是,我不想硬编码我需要取平均值的范围。是否可以搜索标题(不使用查找),然后指定标题下的值范围 这是我到目前为止所拥有的。请注意,范围现在已硬编码。这是完美的工作,因为是,但我需要它更灵活的情况下,数据并不总是以相同的方式呈现 Function AvgMS(Rng

我是VBA新手,所以我需要一些帮助来完成这个项目。我试图编写一个易于伸缩和扩展的脚本,因此我尽量避免硬代码值。我也不想在代码中使用任何Excel函数。我有一个计算范围平均值的函数。我有一个sub可以把平均值打印到一个单独的文本文件中。但是,我不想硬编码我需要取平均值的范围。是否可以搜索标题(不使用查找),然后指定标题下的值范围

这是我到目前为止所拥有的。请注意,范围现在已硬编码。这是完美的工作,因为是,但我需要它更灵活的情况下,数据并不总是以相同的方式呈现

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