Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/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
Excel 从特定索引处的数组中删除项_Excel_Vba - Fatal编程技术网

Excel 从特定索引处的数组中删除项

Excel 从特定索引处的数组中删除项,excel,vba,Excel,Vba,我有一个数字数组,一旦我“使用”了一个数字,我想用我为该值存储的特定索引来删除它 我知道没有直接的方法,但有没有办法解决这个问题 例如: ShiftArray(1,25,12) Pos = 1 Shiftarray(pos).delete 然后数组应该是=移位数组(1,12) (我知道这种方法并不存在,只是为了明确目的) 我尝试了以下操作,但出现了一个错误: ShiftHeadsArray(pos - 1) = " " StringUse = Application.W

我有一个数字数组,一旦我“使用”了一个数字,我想用我为该值存储的特定索引来删除它

我知道没有直接的方法,但有没有办法解决这个问题

例如:

ShiftArray(1,25,12)

Pos = 1

Shiftarray(pos).delete
然后数组应该是=移位数组(1,12)

(我知道这种方法并不存在,只是为了明确目的)

我尝试了以下操作,但出现了一个错误:

ShiftHeadsArray(pos - 1) = " "
StringUse = Application.WorksheetFunction.Trim(Join(ShiftHeadsArray, " "))
ShiftHeadsArray = Split(StringUse, " ")
其中pos是我要在数组中删除的数字的位置。

请尝试此代码

Sub Test()
    Dim arr
    arr = Array(1, 25, 12)
    DeleteItem arr, 1
    Debug.Print Join(arr, ", ")
End Sub

Sub DeleteItem(ByRef arr, v)
    Dim a(), i As Long, n As Long, x As Long, y As Long
    x = LBound(arr): y = UBound(arr)
    ReDim a(x To y)
    For i = x To y
        If i <> v Then a(i - n) = arr(i) Else n = n + 1
    Next i
    If (y - n) >= x Then ReDim Preserve a(x To y - n)
    arr = a
End Sub
子测试()
暗淡的边缘
arr=数组(1,25,12)
删除项目arr,1
调试。打印联接(arr,“,”)
端接头
子项(ByRef arr,v)
Dim a(),i长,n长,x长,y长
x=LBound(arr):y=UBound(arr)
重拨a(x到y)
对于i=x到y
如果i v那么a(i-n)=arr(i)否则n=n+1
接下来我
如果(y-n)>=x,则ReDim保留a(x到y-n)
arr=a
端接头

如果您对捕获可能的错误感兴趣,那么使用基于阵列的解决方案并不是那么简单

备注:如果输入不正确,则应该引发错误,而不是像本例中那样返回空数组或输入数组。但这取决于您喜欢函数的行为方式

公共子测试()
“一些常见的测试:
Assert Join(RemoveItemByIndex(Array(),1),“-”=vbNullString
断言连接(RemoveItemByIndex(数组(1),0),“-”=vbNullString
Assert Join(RemoveItemByIndex(数组(1),1),“-”=vbNullString
断言连接(RemoveItemByIndex(数组(1,25,12),1),“-”=“1-12”
断言连接(RemoveItemByIndex(数组(1,25,12),10),“-”=“1-25-12”
断言连接(RemoveItemByIndex(数组(1,25,12),-1),“-”=“1-25-12”
Assert Join(removietembyindex(“foo”、-1)、“-”=vbNullString
“您的工作样本:
Dim originalArray()作为变体
原始阵列=阵列(1,25,12)
作为变体的Dim项目
对于RemoveItemByIndex(原始数组,1)中的每个项目
调试.打印项
下一项
端接头
公共函数RemoveItemByIndex(ByVal arrayToWorkOn作为变量,ByVal indexToRemove作为变量()
RemoveItemByIndex=数组()
如果不是IsArray(arrayToWorkOn),则退出函数
如果未初始化ArrayInInitialized(arrayToWorkOn),则退出函数
如果UBound(arrayToWorkOn)-LBound(arrayToWorkOn)=0,则退出函数
RemoveItemByIndex=arrayToWorkOn
如果indexToRemoveUBound(arrayToWorkOn),然后退出函数
ReDim结果数组(UBound(arrayToWorkOn)-1)作为变体
暗指数与长指数相同
Dim resultingIndex尽可能长
对于索引=LBound(arrayToWorkOn)到UBound(arrayToWorkOn):Do
如果index=indexToRemove,则退出Do
结果数组(结果索引)=arrayToWorkOn(索引)
结果索引=结果索引+1
错误时循环:下一个索引
RemoveItemByIndex=resultingArray
端函数
公共函数被ArrayInitialized(ByVal arrayToWorkOn作为变量)为布尔值
出错时继续下一步
IsArrayInitialized=IsArray(arrayToWorkOn)和_
非IsError(LBound(Arraytowon,1))和_
LBound(arrayToWorkOn,1)按索引删除数组项
选项显式
子测试RemoveArrayItemByIndex()
Dim地址作为变量:地址=数组(“A1”、“A2”、“A3”)
作为变量的尺寸值:值=数组(1、25、10)
Dim mIndex作为变体
mIndex=Application.Match(Application.Max(值),值,0)
Dim dAddress作为字符串:dAddress=Application.Index(地址,mIndex)
'如果您确定“地址”是从零开始的,而不是以前的
'行,您可以执行以下操作:
'Dim CADRESS As字符串:CADRESS=地址(索引-1)
removeArrayItemByIndex地址,mIndex
调试。打印“地址(之后):”&加入(地址,,)
removeArrayItemByIndex值,mIndex
Debug.Print“值(之后):”&Join(值,,”)
端接头
子测试RemoveArrayItemByIndexDebugPrint()
Dim地址作为变量:地址=数组(“A1”、“A2”、“A3”)
调试。打印“地址(之前):”&加入(地址,,)
作为变量的尺寸值:值=数组(1、25、10)
调试。打印“值(之前):”&Join(值,,”)
Dim mIndex作为变体
mIndex=Application.Match(Application.Max(值),值,0)
调试。打印“最大索引:”&mIndex
Dim dAddress作为字符串:dAddress=Application.Index(地址,mIndex)
'如果您确定“地址”是从零开始的,而不是以前的
'行,您可以执行以下操作:
'Dim CADRESS As字符串:CADRESS=地址(索引-1)
调试。打印“删除地址:”&dAddress
removeArrayItemByIndex地址,mIndex
调试。打印“地址(之后):”&加入(地址,,)
removeArrayItemByIndex值,mIndex
Debug.Print“值(之后):”&Join(值,,”)
端接头
子removeArrayItemByIndex(_
ByRef arr作为变体_
ByVal索引(长度)
长
对于n=索引+LBound(arr)-1到UBound(arr)-1
arr(n)=arr(n+1)
下一个
ReDim保留arr(LBound(arr)到n-1)
端接头

为什么需要这样做?您的最终目标是什么?我有两个阵列要这样做。一个数组包含我找到的最大值,另一个数组包含它们的单元格位置。所以我在数组中找到最大值,在另一个数组中使用它的索引找到单元格位置,然后使用位置删除它的内容。然后,我想从数组中删除该项以查找下一个最大值我如何通过要删除的索引?那是v吗?是的,我的兄弟v是你需要删除的索引。非常有效。你就是那个人。@Yasserkalil-变量
n
的预期用途是什么?谢谢你,刚刚监督了增量-认为它在这里没有用。