如何联接由逗号分隔的命名范围中的返回值 [英] How to join returned values from named range separated by comma
问题描述
我花了数小时试图找出如何连接命名范围内返回的值,但是结果是
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的2维数据字段数组
- 仅基于逗号分隔的字符串值获取选定的行
- 将相同的数组缩减为荷兰语和英语列
调用代码
由于您的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:
- 将空的第一行插入到您指定的范围
Motor
(或用?
,#N / A
等填充) 。) - 按如下所示更改第二个助手功能:
- Insert an empty first row into your named range
Motor
(or fill it e.g. with?
,#N/A
etc.) - 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屋!