精华内容
下载资源
问答
  • 2016-11-27 22:08:47
    Sub macro1()
    Dim arr, i%
    arr = Array(1, 2, 3, 4, 5, 6)
    On Error Resume Next
    i = WorksheetFunction.Match(9, arr, 0)
    If i > 0 Then MsgBox "存在" Else MsgBox "不存在"
    End Sub


    更多相关内容
  • VBA中如何判断数组为空

    千次阅读 2022-04-04 10:02:42
    复杂的代码开发过程,程序逻辑结构可能存在多个分支,有时需要判断变量是否为空,例如对于Range变量,可以使用如下代码。

    在复杂的代码开发过程中,程序逻辑结构可能存在多个分支,使用变量时,可能需要判断变量是否为空,例如对于Range变量,可以使用如下代码。

    Sub RangeDemo()
        Dim rngAll As Range
        Dim rng1 As Range
        Set rng1 = [a1:b3]
        If rngAll Is Nothing Then
            Set rngAll = rng1
        Else
            Set rngAll = Union(rngAll, rng1)
        End If
    End Sub
    

    【代码解析】
    第5行代码使用Is Nothing判断Range对象变量rngAll是否为空。
    如果为空,那么第6行代码使用Set关键字为对象变量赋值。
    如果不为空,那么第7行代码使用Union函数合并单元格区域。
    rngAll为空时,使用Union函数合并单元格区域,将产生错误号5的运行时错误。
    在这里插入图片描述

    但是Is Nothing仅适用于对象变量,无法判断普通变量和数组变量,有的同学知道VBA中有IsEmpty函数,从名字看似乎就是为此而生的,咱们测试一下。

    Sub demo1()
        Dim a() As Integer
        Dim b() As Variant
        Dim d As Integer
        Dim e As Variant    
        If IsEmpty(a) Then Debug.Print "整数数组a为空"
        If IsEmpty(b) Then Debug.Print "变体数组b为空"
        If IsEmpty(c) Then Debug.Print "未声明变量c为空"
        If IsEmpty(d) Then Debug.Print "整数变量d为空"
        If IsEmpty(e) Then Debug.Print "变体变量e为空"    
        c = 1
        e = 2
        If IsEmpty(c) Then Debug.Print "未声明变量为空" Else Debug.Print "c不为空"
        If IsEmpty(e) Then Debug.Print "变体变量为空" Else Debug.Print "e不为空"
    End Sub
    

    【代码解析】
    代码非常简单,用于测试不同变量的结果,输出结果如下。
    在这里插入图片描述

    IsEmpty函数仅适用于变体变量(未声明的变量,默认为变体变量),对于变体数组也不适用。第11至12行代码赋值后,第13至14行代码可以检测到变量不为空。


    那么到底如何判断数组是否为空呢?其实也不复杂,

    Sub demo2()
        Dim a() As Integer
        On Error Resume Next
        LB = LBound(a)
        If Err.Number = 9 Then
            Debug.Print "数组为空"
        Else
            Debug.Print "数组不为空"
        End If
        On Error GoTo 0
    End Sub
    

    【代码解析】
    第3行代码忽略运行时错误继续代码执行。
    第4行代码使用LBound函数读取变量的下标下界。
    如果数组为空,那么将产生错误号为9的运行时错误,第5行代码捕获错误,输出提示信息。
    第10行代码恢复系统错误处理机制。

    如果使用如下代码声明数组,数组中每个元素的值都为零,因此数组不为空。

    Sub demo3()
        Dim a(1 To 2) As Integer
        On Error Resume Next
        LB = LBound(a)
        If Err.Number = 9 Then
            Debug.Print "数组为空"
        Else
            Debug.Print "数组不为空"
        End If
        On Error GoTo 0
    End Sub
    
    展开全文
  • 多维数组是经常用到的数据结构,判断数组中是否包含某个元素的常规办法就是变量整个数组,逐个对比。自定义函数如下: Function ItemInArrayLoop(aData, vEle) As Boolean ItemInArrayLoop = False For i = 1 ...

    多维数组是经常用到的数据结构,判断数组中是否包含某个元素的常规办法就是变量整个数组,逐个对比。自定义函数如下:

    Function ItemInArrayLoop(aData, vEle) As Boolean
        ItemInArrayLoop = False
        For i = 1 To ubund(aData, 1)
            For j = 1 To UBound(aData, 2)
                If aData(i, j) = vItem Then
                    ItemInArrayLoop = True
                    Exit Function
                End If
            Next j
        Next i
    End Function

    函数返回值为布尔类型。简单的测试代码:

    Sub DEMO_LOOP()
        Dim a(1 To 10, 1 To 10), b(1 To 10, 1 To 10), i, j
        For i = 1 To 10
            For j = 1 To 10
                a(i, j) = i + j
                b(i, j) = CStr(i + j)
            Next
        Next
        Debug.Print ItemInArrayLoop(a(), 10) ' True
        Debug.Print ItemInArrayLoop(a(), 20) ' False, 没有20
        Debug.Print ItemInArrayLoop(a(), "10")   ' False, 数据类型不匹配
        Debug.Print ItemInArrayLoop(b(), "10")   ' True
    End Sub

    在数组元素比较多或者维度维度比较多的时候,循环判断效率就会较低。既然是VBA的解决方案,肯定可以考虑利用工作表还是来提高效率。
    工作表函数MATCH进行快速判断数组中是否包含某个值,但是只支持一维数组,幸运的是,
    工作表函数INDEX可以用来实现数组切片,也就是多维数组的一部分可以转换为一维数组。

    Function ItemInArray(aData, vEle) As Boolean
        ItemInArray = False
        If VBA.IsArray(aData) Then
            For i = LBound(aData, 2) To UBound(aData, 2)
                ItemInArray = Not (IsError(Application.Match(vEle, Application.Index(aData, , i), 0)))
                If ItemInArray Then Exit Function
            Next i
        End If
    End Function

    测试代码如下,结果与循环判断完全相同。

    Sub DEMO()
        Dim a(1 To 10, 1 To 10), b(1 To 10, 1 To 10), i, j
        For i = 1 To 10
            For j = 1 To 10
                a(i, j) = i + j
                b(i, j) = CStr(i + j)
            Next
        Next
        Debug.Print ItemInArray(a(), 10) ' True
        Debug.Print ItemInArray(a(), 20) ' False, 没有20
        Debug.Print ItemInArray(a(), "10")   ' False, 数据类型不匹配
        Debug.Print ItemInArray(b(), "10")   ' True
    End Sub

    VBA的Fitler函数可以实现在数组中查找,但是有如下限制:

    • 必须是String数组
    • 不能实现精确查找
      例如下面代码中数组a()包含1到10,使用Filter查找”1”,返回的结果是两个元素,数组元素’10’也在结果数组中,因此ItemInArray中的MATCH不能简单的用Filter代替。
    Sub DEMO_FILTER()
        Dim a(1 To 10) As String, i, aRes
        For i = 1 To 10
            a(i) = i
        Next
        aRes = VBA.Filter(a(), "1")
        Debug.Print Join(aRes, ",")
    End Sub

    对于字符串数组,如果数组元素是规范的数据,那么使用INSTR判断会更加简洁。

    Sub DEMO()
        aKey = Array("R01", "R02", "R03")
        ' option 1
        sKeyList = Join(aKey, "|")
        Debug.Print InStr(1, sKeyList, "R01", vbTextCompare) > 0
        Debug.Print InStr(1, sKeyList, "R11", vbTextCompare) > 0
        ' option 2
        Debug.Print UBound(VBA.Filter(aKey, "R01", , vbTextCompare)) = 0
        Debug.Print UBound(VBA.Filter(aKey, "R11", , vbTextCompare)) = 0 ' 不存在时,Ubound返回的结果为-1
    End Sub

    先用JOIN函数将数组连接为一个字符串,数据元素用”|”作为分隔符,然后使用INSTR判断查找的字符是否包含在该字符串中。这个应用场景中,也可以使用FILTER函数实现。

    展开全文
  • vba-如何查找数组是否包含字符串

    千次阅读 2020-12-19 17:47:34
    可能重复:如何MS Access VBA数组中搜索字符串我目前正在处理Excel宏,但找不到解决方法Mainfram我写了以下内容,它给我消息“ Invalid Qualifier”,并If之后立即突出显示MainframDim Mainfram(4) As ...

    可能重复:

    如何在MS Access VBA数组中搜索字符串

    我目前正在处理Excel宏,但找不到解决方法Mainfram

    我写了以下内容,它给我消息“ Invalid Qualifier”,并在If之后立即突出显示Mainfram

    Dim Mainfram(4) As String

    Mainfram(0) = "apple"

    Mainfram(1) = "pear"

    Mainfram(2) = "orange"

    Mainfram(3) = "fruit"

    For Each cel In Selection

    If Mainfram.Contains(cel.Text) Then

    Row(cel.Row).Style = "Accent1"

    End If

    Next cel

    选择是一列

    有人帮忙吗?

    嗨,JP我尝试了您的建议,并说需要对象。 并突出了  如果IsInArray(cell.Text,Mainfram)然后这是我的完整代码

    Sub changeRowColor()

    Columns("B:B").Select

    Dim cel As Excel.Range

    Dim Mainfram(4) As String

    Mainfram(0) = "apple"

    Mainfram(1) = "pear"

    Mainfram(2) = "orange"

    Mainfram(3) = "Banana"

    For Each cel In Selection

    If IsInArray(cell.Value, Mainfram) Then

    Rows(cel.Row).Style = "Accent1"

    End If

    Next cel

    End Sub

    Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean

    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)

    End Function

    没关系,我发现了这个愚蠢的错误...反正谢谢你

    展开全文
  • 判断相同的标准是? 所有元素相同,不看排列,看组合 拆解特点 1 数组的元素个数相同,但不看次序 2 元素可能重复的话,不能只看不重复的元素 3 如1 1 2 3 不等于 1 2 33 ......
  • 最近遇到一个问题,给出一个有序的二维数组(方阵)(有序指的是对于每一行和每一列元素都是逐渐增大的),然后让你用最快的方法判断某个值是否在这个数组中,如果存在则返回True,反之返回False。例如给出的有序...
  • 大家好,我们今日继续讲解VBA代码解决方案的第61讲内容:在VBA中如何使用动态数组,以及利用动态数组去除重复的方法。在上一讲我们讲了使用数组函数将单元格的文本进行分隔后写入到工作表的方法,那么问题...
  • 大家好,我们今日继续讲解VBA数组与字典解决方案第22讲:在VBA中如何使用动态数组,以及利用动态数组去除重复的方法。如果文本含有大量的重复,此时,如果我们要剔除重复,该怎么办?用VBA的方法该如何做到...
  • 首先了解快速排序之前我们先了解一下冒泡排序,冒泡排序是相邻元素之间两两对比,按小数前大数后的规律调整两数的位置,经过多轮对比以后,即可完成排序.宏观来看,其实就是大数往后小数往前的一种排序方式,微观上冒泡...
  • 判断二维数组中是否存在某

    千次阅读 2019-09-16 23:59:59
    请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路: 从数组的左下角元素开始比较,若目标整数等于该元素,则返回true, 若目标整数大于该元素,则 x 右移。若目标整数小于该元素...
  • VBA示例函数之 求人不如自已动手 统计数组中非重复数据个数,供初学者参考,大牛勿进~~~~~~~
  • 但是在数组中VBA没有提供类sort方法用于排序.现在为了探究数组内排序的方法,我特意整理的一下VBA数组内排序的笔记分享给大家(如果是高手请无视).有不少地方将数组排序分成七种,十种,十五种,二十五种甚至有五十多种,...
  • 判断两个字符串或者两个数组中值是否相同 eg: let str1 = 'fit,stan' let str2 = 'stan,fit' let str3 = 'fit' 思想: 将字符串转变成数组去比较 原因: 一个字符串包含多个时,比较出现错位,可能存在前后颠倒...
  • 微信公众号: 真是一天世界 继变量声明之后...判断及清空数组数组的最大最小索引号如何将数组写入单元格1. 什么是数组数组就是一个列表或一组数据表是同类型多个变量的集合2. 数组的特性数组中的元素共享一个数组...
  • 4 种方式 使用List: ...事实上,如果你确实需要高效的去检查数组或集合中是否包含某个,一个有序列表或者有序树能把时间复杂度降低到O(log(n)),或者使用散列集合,时间复杂度为O(1); 转载自: ...
  • 大家好,我们今日继续讲解VBA数组与字典解决方案第22讲:在VBA中如何使用动态数组,以及利用动态数组去除重复的方法。如果文本含有大量的重复,此时,如果我们要剔除重复,该怎么办?用VBA的方法该如何做到...
  • '自定义函数,将数组中的元素连接起来(可以每个元素两边分别加字符) 'By Gao Dawei,2020-10-09 Function ArrayJoin(ByVal arr As Variant, Optional element_plugin_left As String = "", _ Optional element_...
  • 关于excel的vba数组

    2022-04-06 14:09:57
    什么是vba数组?先让我们从字面来看一下它的意思:“数:数据;组:组合”。从字面很直观地看出,数组就是N个数据的组合,如果某个变量只包含一个数据,就不是数组,只能是一个普通的变量。 有人把数组比喻为一串用...
  • VBA数组完全教程

    万次阅读 多人点赞 2017-06-25 11:45:15
    兰色幻想VBA数组入门教程10集 1. 前言:不要把VBA数组想的太神秘,它其实就是一组数字而已。 2. 数组的维数: Sub 数组示例() Dim x As Long, y As Long Dim arr(1 To 10, 1 To 3) '创建一个可以容下10行...
  • 大家好,今日继续讲解VBA数组与字典解决方案,今日的内容是第8讲。在上一讲的数组专题,我详细地讲了利用数组公式的好处,或许有的朋友还没有充分理解,今日继续给大家讲解。我讲解,力争每篇文章可以作为一个...
  • VBA实现插入排序
  • 判断一个数组是否存在某 Arr.includes(‘1’) 判断数组Arr里面是否存在1,如果存在则返回true,否则返回false
  • 希尔排序 VBA实现
  • 如何查找一个数组内,某个元素的index是多少? 如果element元素唯一,可以用match查, 但是 application.match 比 worksheetfunction.match() 函数更健壮 如果不唯一呢 用match 只能返回第一个查到的元素的index...
  • 如何判断动态数组为空?

    千次阅读 2021-03-15 03:17:55
    VBA开发时经常用到数组,但是如何判断数组是否为空,这里说的“空”指的是,动态数组声明后,但是未赋值之前的状态,【本地窗口】显示如下。 此时Dim语句已经执行完毕,可以认为已经完成了初始化,数组并无法...
  • 数组不改变的情况下只能增加列的数,如果要增加行,只能先转置,再增加,然后转置还原; 如果数组存储了null,则不能被转置,因此存入空值时需要过滤; 经过多次实验证明:VBA数组起始标只能以1开始,否则...
  • 大家好,我们今日继续讲解VBA数组与字典解决方案第22讲:在VBA中如何使用动态数组,以及利用动态数组去除重复的方法。如果文本含有大量的重复,此时,如果我们要剔除重复,该怎么办?用VBA的方法该如何做到...
  • 如何判断数组已经初始化

    千次阅读 2018-12-07 03:04:42
    VBA编程经常用到数组代码使用数组之前,需要确保数组已经完成初始化操作,借助API可以进行判断。 Private Declare Function SafeArrayGetDim Lib "oleaut32.dll" (ByRef ...
  • 【SolidWorks宏】VBA 获取数组的长度

    万次阅读 2018-05-11 22:20:18
    获取数组长度" Public Function ArrayLength(ByVal ary) As Integer ArrayLength = UBound(ary) - LBound(ary) + 1 End Function REM "调用示例" Sub SplitSample() '声明 Dim temp() As String ...
  • 在VBA中, Not 任何数字,返回值均为True --- 添加 If _number = 0 then _number = Flase

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,720
精华内容 688
关键字:

vba判断值是否在数组中