如何联接由逗号分隔的命名范围中的返回值 [英] How to join returned values from named range separated by comma

查看:72
本文介绍了如何联接由逗号分隔的命名范围中的返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我花了数小时试图找出如何连接命名范围内返回的值,但是结果是

I've spent hours trying to find out how to join returned values from a named range, but the result is a


run -time error 32-类型不匹配。

run-time error 32 - Type mismatch.

作为一个新手,我仍然在处理数组,所以也许我忽略了一些细节。谢谢您的帮助。

As a newbie I'm still struggling with arrays, so maybe I've overlooked some detail. Thank you for helping me out.

示例:(B1)汽油,(B2)柴油,(B3)氢化物->(E1)汽油,(E2)柴油, (E3)混合

Example: (B1)Benzine, (B2)Diesel, (B3)Hybride -> (E1)Gasoline, (E2)Diesel, (E3)Hybrid

这是命名范围:

This is the named range:

另一个示例(更清晰):

示例2:(B1)汽油,(B3 )混合->(E1)汽油,(E3)混合

Example 2: (B1)Benzine, (B3)Hybride -> (E1)Gasoline, (E3)Hybrid

Option Explicit

Sub splitter()

Dim i As Long
Dim w As Long
'Dim oWB As Workbook
Dim oWS As Worksheet
Dim oWS9 As Worksheet
Dim rngMOTOR As Range
Dim rngMOTOR2 As Range
Dim arrMOTOR() As Variant
Dim LastRow As Long

'Set oWB = Workbooks("BRONBESTAND.xlsm")
Set oWS = Sheets("ONDERDELEN")
Set oWS9 = Sheets("MOTOR")                                              '5 columns: 1 Short & LONG + 1 NL + 3 Languages !!!!! WARNING

LastRow = oWS.Range("A" & Rows.Count).End(xlUp).Row

    For i = 2 To LastRow                                                                             'Starting below headers


        Set rngMOTOR = oWS.Cells(i, "M")                                                                'MOTOR      ...
        Set rngMOTOR2 = oWS9.Range("MOTOR")                                                 'MOTOR2: MOTOR - Bronbestand       arrPOS = rngPOS2.Value

        arrMOTOR = rngMOTOR2.Value


'*********
Dim txt As String
Dim j As Integer
Dim Splitted As Variant
Dim arrMOTORall As Variant
Dim arrMOTORsplit As Variant
Dim Motor3 As String

txt = oWS.Cells(i, "M")                                                                'MOTOR      ...

        Debug.Print ("txt : ") & i & ": "; txt

    If Not IsEmpty(txt) Then

        Splitted = Split(txt, ", ")
        For j = 0 To UBound(Splitted)

                Cells(1, j + 1).Value = Splitted(j)
                        Debug.Print ("                ---> Splitted: ") & Splitted(j)

        '**** INSERT *****


                For w = LBound(arrMOTOR) To UBound(arrMOTOR)
                    If arrMOTOR(w, 1) = Splitted(j) Then                                                                    'EX: B - Benzine
                            arrMOTORsplit = (arrMOTOR(w, 4))                                                               '(arrMOTOR(y, 2)) -> 1=SHORT+LONG , 2=NL, 3=FR, 4=EN
                                    Debug.Print ("                ---> arrMOTORsplit: ") & i & ": " & arrMOTORsplit

        '**** JOIN ****
                            arrMOTORall = Join(arrMOTORsplit, ", ")
                                    Debug.Print ("arrMOTORall: ") & arrMOTORall


                    End If
                Next w
        Next j
    End If

   Next i
End Sub


推荐答案

为命名列中的每个列获取逗号分隔的字符串范围

我没有分析您的代码,但这应该可以接收加入的前三个值

I didn't analyze your code, but this should work to receive the first three values joined

"Benzine, Diesel, Hybride"  ' e.g. from first column 

"Gasoline, Diesel, Hybrid"  ' e.g. from the fourth column

通过 Application从命名范围 Motor中选择。索引函数。

注释

参数此 Index 函数中的0表示不选择特定的行,参数 ColNo 选择循环中的每一列。随后的 transposition 允许将2维数组的值更改为1维数组。 Join 函数需要一个1维数组,并在其中连接所选的列项目。

The parameter 0 in this Index function indicates to not choose a specific row, the Parameter ColNo chooses each of your columns in a Loop. A subsequent transposition allows to change the 2 dimensioned array values to a 1-dim array. The Join function needs a 1-dim array and concatenates the chosen column items therein.

提示:以下示例代码使用完全限定的范围引用,假设您不调用 TestMe 过程从您的个人宏库。在后一种情况下,您必须更改引用和工作簿标识(不使用 ThisWorkbook !!)。

Hint: The following sample code uses a fully qualified range reference assuming that you don't call the TestMe procedure from your Personal Macro Library. In the latter case you'd have to change references and workbook identification (not using ThisWorkbook!).

示例代码

Option Explicit      ' declaration head of your code module

Sub TestMe()
Dim v As Variant, ColNo As Long
' assign first three rows to variant 1-based 2-dim datafield array
  v = ThisWorkbook.Worksheets("Motor").[Motor].Resize(3, 4) ' Named range value
' write comma separated list for each column
  For ColNo = 1 To 4
      Debug.Print Join(Application.Transpose(Application.Index(v, 0, ColNo)), ", ")
  Next ColNo
End Sub




编辑-在任何订单中灵活搜索以翻译已加入的列表

此解决方案允许在高级w中使用 Application.Index 函数以任何组合的形式返回联接的搜索词。使用行和列数组作为参数。主要功能 getSplitters()仅需三个步骤即可创建一个变量2-dim数组,没有循环和重新调整,并使用两个语言常量(Const DUTCH和const英语):

This solution allows to return joined search words in any combination using the Application.Index function in an advanced way using row and column arrays as parameters. The main function getSplitters() creates a variant 2-dim array in only three steps without loops and redims and uses two language constants (Const DUTCH and Const ENGLISH).:


  1. 将数据分配给基于变量1的2维数据字段数组

  2. 仅基于逗号分隔的字符串值获取选定的行

  3. 将相同的数组缩减为荷兰语和英语列

调用代码

由于您的OP,调用代码可以对列 M 在工作表 ONDERDELEN 中,只要A列中有值。这是通过将找到的这些字符串值传递给主函数<$来实现的c $ c> getSplitters 创新方法,只需三个步骤即可获得结果,没有循环(请参见下面的功能代码)。

Due to your OP the calling code anylyzes all comma separated strings in Column M in your sheet "ONDERDELEN" as far as there are values in column A. This is made by passing these found string values to the main function getSplitters with an innovative approach to get results in only three steps without Loops (see function code below).

翻译基于指定范围内的值 Motor 表格电机 中的 B1:E4 ,其中行包含不同种类的燃料,而相邻列用于不同语言(在第一列中以荷兰语开头,在第四列中以英语开头)。

Translation is based on values in the named range Motor "B1:E4" in sheet "Motor" where rows comprise different sort of fuel with neighbouring columns for different languages (starting with Dutch in the first column and English in the fourth col).

请注意,使用VBA遍历数组以获取值要比通过范围更快。

Option Explicit             ' declaration head of your code module
Const DUTCH   As Integer = 1
Const ENGLISH As Integer = 4

Sub TranslateAnyFuelCombination()
' Purpose: returns comma separated lists in column "M" and translates from Dutch to English
' Example: "Benzine, Hybride, Diesel" (Dutch) gets to "Gasoline, Hybrid, Diesel" in English
  Dim s As String
  Dim oWS As Worksheet, i&, LastRow&, vMOTOR As Variant
  Set oWS = Thisworkbook.Worksheets("ONDERDELEN")   ' fully qualified reference
' Get last row of wanted data
  LastRow = oWS.Range("A" & Rows.Count).End(xlUp).Row
  vMOTOR = oWS.Range("M1:M" & LastRow)
  For i = 2 To LastRow                       'Starting below headers
      Debug.Print getSplitters(vMOTOR(i, 1))
  Next i
End Sub

主要功能

Function getSplitters(ByVal sRows As String) As String
  Dim i As Long, j    As Long
  Dim v As Variant, a As Variant
' [0] analyze selected rows string, e.g. "Benzine, Hybride, Diesel"
  a = getRowAr(sRows)          ' -> assign 1-dim Rows Array(1, 3, 2)
' [1] assign data to variant 1-based 2-dim datafield array
  v = Application.Transpose(ThisWorkbook.Worksheets("Motor").[Motor])      ' Named range value
' [2] get only selected rows, e.g. 1st, 3rd and 2nd -> in free order (!) Benzine, Hybride, Diesel
  v = Application.Transpose(Application.Index(v, _
      Application.Evaluate("row(1:" & UBound(v, 2) & ")"), _
      a))                      ' transposed columns array = selected rows
' [3] reduce to Dutch and English columns
  v = Application.Transpose(Application.Index(v, _
      Application.Evaluate("row(1:" & (UBound(a) + 1) & ")"), _
      Array(DUTCH, ENGLISH)))               ' selected columns array (above array retransposed)
' [4] return concatenated strings
  getSplitters = Join(Application.Transpose(Application.Transpose(Application.Index(v, 1, 0))), ", ") & " -> " & _
                 Join(Application.Transpose(Application.Transpose(Application.Index(v, 2, 0))), ", ")
End Function

两个帮助功能

Function getRowAr(ByVal sList As String) As Variant
' Purpose: split comma separated list into 1-dim number array in FREE ORDER
' Example: "Benzine, Hybride, Diesel" -> Array(1, 3, 2)
  Dim ar, i&
' change words in comma separated list to numbers
  ar = Split(Replace(sList, " ", ""), ",")
  For i = LBound(ar) To UBound(ar)
      ar(i) = val(getNumber(ar(i)))                ' change to numbers
  Next i
  getRowAr = ar                                    ' return
End Function

Function getNumber(ByVal s As String) As Long
' Purpose: replaces dutch search words with corresponding row number
  Dim arFuel
' get search words to 1-dim array
  arFuel = Application.Index(ThisWorkbook.Worksheets("Motor").[Motor], 0, DUTCH)
' return corresponding number
  getNumber = Application.Match(s, arFuel)
End Function




附录 (根据评论进行编辑)

如果您确定并置的搜索词(或起始部分)实际上匹配,否则将引发错误13。您可以分两步解决此问题:

The above code works as intended if you are sure that the concatenated search words (or starting parts) actually match else an Error 13 is raised. You can solve this issue in two steps:


  1. 空的第一行插入到您指定的范围 Motor (或用#N / A 等填充) 。)

  2. 按如下所示更改第二个助手功能:

  1. Insert an empty first row into your named range Motor (or fill it e.g. with ?, #N/A etc.)
  2. Change the 2nd helper function as follows:

已编辑的功能 getNumber()

Edited function getNumber()

 Function getNumber(ByVal s As String) As Long
 ' Purpose: replaces dutch search words with corresponding row number
   Dim arFuel
 ' get search words to 1-dim array
   arFuel = Application.Index(ThisWorkbook.Worksheets("Motor").[Motor], 0, DUTCH)
 ' return corresponding number
   On Error Resume Next                             ' provide for not found case
   getNumber = Application.Match(s, arFuel, 0)      ' find only exact matches
   If Err.Number <> 0 Then getNumber = 0            ' could be omitted in case of a zero return
 End Function

这篇关于如何联接由逗号分隔的命名范围中的返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆