Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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/9/visual-studio/8.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
Excel 基于条件创建命名范围时出现运行时错误_Excel_Vba - Fatal编程技术网

Excel 基于条件创建命名范围时出现运行时错误

Excel 基于条件创建命名范围时出现运行时错误,excel,vba,Excel,Vba,我有下面的代码遍历一个表。当它在C列中找到“Reporting”一词,在B列中找到“OSI”一词时,它会为B列和C列中的条件为真的每一行创建一个从D-E-F列开始的称为“OSIRep”的范围 然而,当我将单词改为“Security”和“OSI”以创建范围“OSISec”时,我得到了一个错误,我不知道为什么。错误为“运行时错误1004-对象的方法“范围”\u工作表“失败”,这发生在sht.Range(sRng)上 它搜索的范围也一样,我尝试创建的名称不存在,并且我的条件存在。有什么想法吗 我尝试过

我有下面的代码遍历一个表。当它在C列中找到“Reporting”一词,在B列中找到“OSI”一词时,它会为B列和C列中的条件为真的每一行创建一个从D-E-F列开始的称为“OSIRep”的范围

然而,当我将单词改为“Security”和“OSI”以创建范围“OSISec”时,我得到了一个错误,我不知道为什么。错误为“运行时错误1004-对象的方法“范围”\u工作表“失败”,这发生在sht.Range(sRng)上

它搜索的范围也一样,我尝试创建的名称不存在,并且我的条件存在。有什么想法吗

我尝试过对工作表进行保护,解锁单元格,探索错误代码,但都没有用

提前感谢您提供的任何帮助或见解

Set sht = ThisWorkbook.Worksheets("Features")

Set featuresRng = sht.Range(sht.Range("B1"), sht.Range("C" & sht.Rows.Count).End(xlUp))
rngArray = featuresRng
ReDim NewArr(1 To 1)
y = 1
For i = 1 To UBound(rngArray)
    If rngArray(i, 2) = "Reporting" And rngArray(i, 1) = "OSI" Then
        ReDim Preserve NewArr(1 To y)
        NewArr(y) = featuresRng.Rows(i).Resize(1, 3).Offset(0, 2).Address
        y = y + 1

    End If
Next i

sRng = Join(NewArr, Application.DecimalSeparator)
ThisWorkbook.Names.Add "OSIRep", sht.Range(sRng)

根据我的评论,
Range
只接受255个字符的地址字符串,因此在循环时最好处理实际的Range对象:

For i = 1 To UBound(rngArray)
    If rngArray(i, 2) = "Reporting" And rngArray(i, 1) = "OSI" Then
         Dim OutputRange As Range
         If OutputRange Is Nothing Then
            Set OutputRange = featuresRng.Rows(i).Resize(1, 3).Offset(0, 2)
         Else
            Set OutputRange = Union(OutputRange, featuresRng.Rows(i).Resize(1, 3).Offset(0, 2))
         End If
    End If
Next i

If Not OutputRange Is Nothing Then OutputRange.Name = "OSIRep"

您不需要
featuresRng
对象,因为您可以直接寻址工作表,因为您事先知道要处理的列。以下是实现目标的有效方法:

Sub宏1()
尺寸sht作为工作表,MySel作为范围,rngArray作为变量,i作为长度
Set sht=此工作簿。工作表(“功能”)
用短发
rngArray=.Range(“B1”),.Range(“C”和.Rows.Count).End(xlUp)).Value
对于i=1至UBound(rngArray)
如果rngArray(i,2)=“报告”且rngArray(i,1)=“OSI”,则
如果迈塞尔什么都不是
设置MySel=.Range(“D”&i&“:F”&i)
其他的
设置MySel=Application.Union(MySel.Range(“D”&i&“:F”&i))
如果结束
如果结束
接下来我
以
如果不是MySel,那么MySel.Name=“OSIRep”
'设置MySel=无
端接头

此时的
sRng
有多长?地址的范围限制为255个字符。我想你是对的,问题出在字符上。当我尝试添加“安全性”时,我所指的范围是三行,而不仅仅是一行用于报告。对于更大的范围,您有什么解决方案可以建议吗?与其建立地址字符串,不如创建一个范围对象(使用
Union
),然后在末尾将其命名。您好@Rory谢谢您的建议。我已经查过Union函数,但仍然不知道如何使用它,你能告诉我如何在我的代码中实现它吗?@PKen,检查下面的答案。你好@AAA,谢谢你的回复!!这很有效。但是,如果我想做另一个选择,比如说“过滤器”和“OSI”,它会将以前的范围添加到我的新范围中。我该如何避免这种情况?@PKen,你是在同一个宏中这样做的吗?如果是这样,在代码的最后一行之后添加以下内容:
Set MySel=Nothing