【问题标题】:Excel VBA Join functionExcel VBA 连接函数
【发布时间】:2018-08-18 01:00:27
【问题描述】:

我尝试在 vba 中加入向量的元素。

首先我使用 for 循环特定的字符串进行搜索。

CE_addr = FindAll(Workbooks("raw_data.xlsm").Worksheets("IQ_Key_Dev_Type").Cells(k, (p - 1)).Value, _
                Worksheets("Sheet1").Range("O:O"), xlValues, xlWhole).Address

然后我使用地址对象来获取右侧一列的对应值。

              rn = Split(CE_addr, ",")
              n = UBound(rn, 1) - LBound(rn, 1)

              For w = 0 To n
              ReDim CE_cod(n) As Variant
              CE_cod((w)) = Workbooks("raw_data.xlsm").Worksheets("CE_List").Range(rn(w))

              Next w

所以在 CE_cod 向量中我保存了所有对应的值(有时它只是一个值,有时不止一个)

现在我想用“;”连接所有包含的(文本)值作为分隔符:

Cells(j, 3) = Join(CE_cod, ";")

假设 CE_cod 在第一个循环中有两个条目: ["XXX" , "YYY"] 第二个循环中只有一个:[“XXX”]

由于某种原因,第一种情况下 Cell(j,3) 中的结果(CE_cod 中的多个值)是:“;YYY”(请注意,添加了分隔符,而不是表达式本身)。 在第二种情况下,结果是:“XXX”

我检查了向量 CE_cod 是否包含所有值:

Cells(j, (10 + w)) = CE_cod((w))

确实,当我这样做时,包含“XXX”和“YYY”。

那么为什么join函数在有多个入口的时候会跳过向量的第一个入口呢?

PS:我在这里找到了“FindAll”功能: http://www.tushar-mehta.com/publish_train/xl_vba_cases/1001%20range.find%20and%20findall.shtml#_The_FindAll_function

【问题讨论】:

    标签: arrays excel vba join concatenation


    【解决方案1】:

    我认为你的 CE_cod 填充循环应该更接近这个。

      Dim CE_cod As Variant
      ReDim CE_cod(LBound(rn) to UBound(rn))
      For w = LBound(rn) to UBound(rn)
          'if you want to put a redim here, use Preserve
          'ReDim Preserve CE_cod(w)
          CE_cod(w) = Workbooks("raw_data.xlsm").Worksheets("CE_List").Range(rn(w))
      Next w
    

    rn 数组是通过拆分操作填充的,因此它是一个从零开始的一维数组。

    此外,如果您想保留您的值,则不应在没有 Preserve 参数的循环内使用 ReDim。无论如何,由于您事先知道目标边界,因此无需在循环内进行 ReDim。

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      相关资源
      最近更新 更多