cherrycdh 发表于 2021-4-27 16:21

我又有问题啦,关于redim与split的应用

在学习vba过程中,老师给了这样的样式
就是有一串导入的数据",,张三,李四,,王五,赵六,",然后呢将它的空值去掉之后在一个个单元格的显示,具体的状态如下

然后呢,老师是没用单元格计算的,所以他是给出的代码是:
Sub 老师的有空值拆分()
    Dim a() As String, s As String, x
    Dim b() As String, i As Long
    s = ",,张三,李四,,王五,赵六,"
    a = Split(s, ",")
    '首先,循环统计数组a中非空字符串的数量,记入i
    For Each x In a
      If x <> "" Then i = i + 1
    Next x
    '然后,重新制定动态数组b的最大下标为i-1,即可容纳i个元素
    ReDim b(i - 1)
    '因为已经重新定义了数组大小,所以i记录的数组已经毋庸
    '我们可以将i设置为0,用来在后面循环时控制数组下标
    '这样可以少定义一个变量
    i = 0
    For Each x In a
      If x <> "" Then
            b(i) = x
            i = i + 1
      End If
    Next x
    '到此为止,b数组中就是所有拆分出来的非空字符串
End Sub

按照这个代码,如果我要输出在单元格中,就要在设定单元格开始的行列,所以根据他,我就设定了单元格开始的位置,最终我的代码如下:
Sub 有空值拆分()
    Dim a() As String, i As Long, x
    Dim b() As String, s As Long
    a = Split(Cells(49, 2), ",")
    For Each x In a
      If x <> "" Then i = i + 1
    Next x
    ReDim b(i - 1)
    i = 0
    s = 49
    For Each x In a
      If x <> "" Then
            i = i + 1
            Cells(s, 4) = x
            s = s + 1
      End If
    Next x
End Sub

问题是,需要那么累赘吗?我不知道redim在这段代码里面的实际应用在哪里,因为我一开始if函数的时候将非空单元格取消不就行了?
我想法里面的代码是这样的,而且我最后运行的效果也成功了,所以我就感觉很奇怪
Sub 有空值拆分2()
Dim a() As String, i As Long, x
Dim b() As String, s As Long
    a = Split(Cells(49, 2), ",")
    s = 49
    For Each x In a
      If x <> "" Then
            Cells(s, 4) = x
            s = s + 1
      End If
    Next x
End Sub

dunxp 发表于 2021-4-27 17:35

上面那个代码没写完,应该还有个Range.Valve=b的赋值过程。数据量大的时候,区域赋值比较快。

可以不用redim,把a数组中非空值移到前面,并记录非空值数量,区域赋值时指定区域大小就行了,例如.Resize(1,4).Value=a

MasterW 发表于 2021-4-27 20:29

方法有很多中,能实现就行。现实中会根据数据量大小做优化。
页: [1]
查看完整版本: 我又有问题啦,关于redim与split的应用