- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要将范围(有条件)中的唯一值组合到同一行的另一个范围中。
其实我前两天发过类似的问题Link所提供的答案在我提出上述问题时有效。
但后来,我遇到了一个新问题,我宁愿问一个新的问题,让它更清楚:
(1) 如果单独范围内的所有单元格(例如 [C7:C8]
)都为空值,
然后我上了那条线 mtch = Application.Match(arr(i, 3), arrDC, 0)
Run-time error '13':Type mismatch
我可以在该行之前使用 On Error Resume Next
,但我认为这不是处理该错误的正确方法。
(2) 如果某些单元格或所有单元格位于单独的范围内,例如 [B9:B10]
具有空值,
然后我在最终结果中得到空行(在组合值之上)。
这是 link对于提供的具有预期输出的示例。
预先感谢您的学习支持和帮助。
Sub CombineRangesOneColumn_v2()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'_________________________________________
Dim sh As Worksheet, lastR As Long, arr, arrDict, dict As Object
Dim arrDB, arrDC, mtch, arrFin, i As Long, j As Long, k As Long
Set sh = ActiveSheet
lastR = sh.Range("A" & sh.Rows.Count).End(xlUp).Row
arr = sh.Range("A2:C" & lastR).Value2
Set dict = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(arr)
If Not dict.Exists(arr(i, 1)) Then
dict.Add arr(i, 1), Array(arr(i, 2), arr(i, 3)) 'Place the strings from columns "B" and "C"
Else
arrDict = dict(arr(i, 1)) 'extract the array from dict items (it cnnot be modified inside the item)
arrDict(0) = arrDict(0) & "|" & arr(i, 2) 'place in the array first element the strings collected from B:B
arrDC = Split(arrDict(1), vbLf) 'try splitting the second array element (string(s) from C:C)
If UBound(arrDC) = 0 Then 'if only one element:
If arrDC(0) <> arr(i, 3) Then
arrDict(1) = arrDict(1) & IIf(arr(i, 3) = "", "", vbLf & arr(i, 3)) 'add to it the value from C:C, separated by vbLf
End If
Else
mtch = Application.Match(arr(i, 3), arrDC, 0) 'check unicity of the string from C:C
If IsError(mtch) Then 'only if not existing:
arrDict(1) = arrDict(1) & IIf(arr(i, 3) = "", "", vbLf & arr(i, 3)) 'add it to the string to be used in the next step
End If
End If
dict(arr(i, 1)) = arrDict 'put back the array in the dictionary item
End If
Next i
ReDim arrFin(1 To UBound(arr), 1 To 1): k = 1 'redim the final array and initialize k (used to fill the array)
For i = 0 To dict.Count - 1 'iterate between the dictionary keys/items:
arrDict = dict.Items()(i) 'place the item array in an array
arrDB = Split(arrDict(0), "|") 'obtain an array of B:B strins from the item first array element
For j = 0 To UBound(arrDB) 'how many unique keys exists 'place the dictionry key per each iteration
arrFin(k, 1) = arrDB(j) & vbLf & arrDict(1) 'build the string of the second column
k = k + 1
Next j
Next i
'Drop the processed result near the existing range (for easy visual comparison):
sh.Range("D2").Resize(UBound(arrFin), 1).Value2 = arrFin
'_______________________________________________
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
最佳答案
Sub Extract_unique_values_and_combine_in_adjacent_cells()
' The delimiter between the 2nd column value and the 3rd column values.
Const dDelimiter As String = vbLf ' use e.g. 'vbLf & vbLf' to understand
' The delimiter between the 3rd column values.
Const vDelimiter As String = vbLf ' use e.g. ',' to understand
' Reference the worksheet ('ws').
Dim ws As Worksheet: Set ws = ActiveSheet ' improve!
' Reference the table range (has headers).
Dim strg As Range: Set strg = ws.Range("A1").CurrentRegion
' Calculate the number of data rows ('rCount')(exclude header row).
Dim rCount As Long: rCount = strg.Rows.Count - 1
' Reference the source data range ('srg') (no headers).
Dim srg As Range: Set srg = strg.Resize(rCount).Offset(1)
' Write the values from the source range to a 2D one-based array,
' the source array ('sData').
Dim sData() As Variant: sData = srg.Value
' Reference a newly created dictionary object ('dict').
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
dict.CompareMode = vbTextCompare ' case-insensitive i.e. 'a = A'
' The dictionary's 'keys' will hold the unique values from the 1st column,
' while each associated dictionary's 'item' will hold another dictionary
' whose 'keys' will hold the unique values from the 3rd column.
Dim Key1 As Variant
Dim Key3 As Variant
Dim r As Long
' Loop through the rows of the source array...
For r = 1 To rCount
' Write the current value from the 1st column to a variable ('Key1')...
Key1 = sData(r, 1)
' ... and check if it isn't already a 'key' of the dictionary.
If Not dict.Exists(Key1) Then ' not a 'key' in dictionary
' Add the value as the 'key' and assign a newly created dictionary
' to the associated item ('dict(Key1)').
Set dict(Key1) = CreateObject("Scripting.Dictionary")
dict(Key1).CompareMode = vbTextCompare ' case-insensitive
'Else ' is a 'key' of the dictionary; do nothing
End If
' Write the current value from the 3rd column to a variable ('Key3')...
Key3 = sData(r, 3)
If Not IsError(Key3) Then ' exclude errors
If Len(CStr(Key3)) > 0 Then ' exclude blanks
' ... and add it to the 'keys' of the current 'item dictionary'.
dict(Key1)(Key3) = Empty
End If
End If
Next r
' Write the length of the 3rd column delimiter to a variable ('vLen')
' (to not calculate it over and over since it will be used in a loop).
Dim vLen As Long: vLen = Len(vDelimiter)
' Concatenate the dictionary item dictionaries' keys to strings
' and replace the item dictionaries with those strings.
Dim String3 As String
' Loop through the keys of the dictionary (dict.Keys)...
For Each Key1 In dict.Keys
' Loop through the keys of the item dictionary ('dict(Key1).Keys')...
For Each Key3 In dict(Key1).Keys
' ... and concatenate the values into a string ('String3').
String3 = String3 & Key3 & vDelimiter
Next Key3
If Len(String3) > 0 Then ' the item dictionary was not empty
' Remove the redundant right most delimiter.
String3 = Left(String3, Len(String3) - vLen)
'Else ' the item dictionary was empty; do nothing
End If
' Replace the item dictionary with the string.
dict(Key1) = String3
' Reset the string variable.
String3 = vbNullString
Next Key1
' Define the the destination array ('dData'),
' a 2D one-based one-column string array with the same number of rows
' as the number of rows of the source array, .
Dim dData() As String: ReDim dData(1 To rCount, 1 To 1)
Dim String2 As String
' Loop through the rows of the source array...
For r = 1 To rCount
' Write the 2nd column value, converted to a string, to a variable.
String2 = CStr(sData(r, 2))
' Write the dictionary item associated to the key
' for the 1st column value to a variable.
String3 = dict(sData(r, 1))
If Len(String2) = 0 Then ' the 2nd column value is blank
If Len(String3) > 0 Then ' the current string is not an empty string
' Write just the 3rd column (concatenated) strings.
dData(r, 1) = String3
'Else ' the current string is an empty string; do nothing
' Note that each element of the destination array is initially
' an empty string since it was declared 'As String'.
End If
Else ' the 2nd column value is not blank
If Len(String3) > 0 Then ' the current string is not an empty string
' Concatenate the 2nd and 3rd column strings.
dData(r, 1) = String2 & dDelimiter & String3
Else ' the current string is an empty string
' Write just the 2nd column string.
dData(r, 1) = String2
End If
End If
Next r
' Write the values from the destination array to the 2nd column
' of the source data range (no headers).
srg.Columns(2).Value = dData
' Clear the 3rd column of the source table range (has headers).
strg.Columns(3).Clear
End Sub
关于arrays - 将范围(有条件)中的唯一值组合到另一个范围中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73181179/
在 C 中: int a[10]; printf("%p\n", a); printf("%p\n", &a[0]); 产量: 0x7fff5606c600 0x7fff5606c600 这是我所期望
我一直在尝试运行此循环来更改基于数组的元素的位置,但出现以下错误。不太确定哪里出了问题。任何想法或想法!谢谢。 var population = [[98, 8, 45, 34, 56], [9, 1
我正在尝试获取一个 Ruby 数组数组并将其分组以计算其值。 数组有一个月份和一个 bool 值: array = [["June", false], ["June", false], ["June"
所以我们的目标是在遇到某个元素时将数组分割成子数组下面的示例 array.split("stop here") ["haii", "keep", "these in the same array bu
在this问题已经回答了两个表达式是相等的,但在这种情况下它们会产生不同的结果。对于给定的 int[] 分数,为什么会这样: Arrays.stream(scores) .forEac
我认为我需要的是哈希数组的数组,但我不知道如何制作它。 Perl 能做到吗? 如果是这样,代码会是什么样子? 最佳答案 perldoc perldsc是了解 Perl 数据结构的好文档。 关于arra
我遇到了这个问题,从 API 中我得到一个扩展 JSON,其中包含一个名为坐标的对象,该对象是一个包含数组 o 数组的数组。 为了更清楚地看这个例子: "coordinates": [
postgres 中有(v 9.5,如果重要的话): create table json_test( id varchar NOT NULL, data jsonb NOT NULL, PRIM
我用 echo "${array[@]}" 和 echo "${array[*]}" 得到了相同的结果。 如果我这样做: mkdir 假音乐; touch fakemusic/{Beatles,Sto
我正在尝试创建 typealias 对象的数组数组 - 但我收到“表达式类型不明确,没有更多上下文”编译错误。这是我的代码: typealias TestClosure = ((message: St
如果您在 Python 中创建一维数组,使用 NumPy 包有什么好处吗? 最佳答案 这完全取决于您打算如何处理数组。如果您所做的只是创建简单数据类型的数组并进行 I/O,array模块就可以了。 另
当我将数组推送到只有一个数组作为其唯一元素的数组数组时,为什么会得到这种数据结构? use v6; my @d = ( [ 1 .. 3 ] ); @d.push( [ 4 .. 6 ] ); @d.
在 Julia 中,我想将定义为二维数组向量的数据转换为二维矩阵数组。 如下例所述,我想把数据s转换成数据t,但是至今没有成功。 我该如何处理这个案子? julia> s = [[1 2 3], [4
C 没有elementsof 关键字来获取数组的元素数。所以这通常由计算 sizeof(Array)/sizeof(Array[0]) 代替但这需要重复数组变量名。1[&Array] 是指向数组后第一
所以,假设我有一个像这样的(愚蠢的)函数: function doSomething(input: number|string): boolean { if (input === 42 || in
我有以下数组: a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] 我将它用于一些像这样的视觉内容: 1 2 3 4 5 6 7 8 9 10
我想知道数组中的 .toList 与 .to[List] 之间有什么区别。我在spark-shell中做了这个测试,结果没有区别,但我不知道用什么更好。任何意见? scala> val l = Arr
我很难获得完全相同对象的多个元素的当前元素索引: $b = "A","D","B","D","C","E","D","F" $b | ? { $_ -contains "D" } 替代版本: $b =
我正在尝试使用来自我的 API 的 v-select 执行 options,我将数据放在数组数组中。 Array which I got from API 它应该是一个带有搜索的 select,因为它
这个问题在这里已经有了答案: String literals: pointer vs. char array (1 个回答) 4 个月前关闭。 当我执行下一个代码时 int main() {
我是一名优秀的程序员,十分优秀!