|
本帖最后由 kokokeke001 于 2020-8-27 21:20 编辑
- Sub test()
- ar = Sheets("已有").[a1].CurrentRegion
- xh = Sheets("已有").Cells(Rows.Count, 1).End(xlUp)
- Set d = CreateObject("scripting.dictionary")
- For i = 2 To UBound(ar)
- If Trim(ar(i, 1)) <> "" Then 'Trim函数删除给定输入字符串的前导空格和尾随空格。
- d(Trim(ar(i, 1))) = i '字典非空a列i行(a列编号即用于判断新增还是更新的依据)
- End If
- Next i
- br = Sheets("原始").[a1].CurrentRegion
- '[a1].CurrentRegion由a1向四周找单元格,遇到整空行空列停止,的范围(不包含遇到的空行列)
- 'aa=[a1].CurrentRegion
- 'UBound(aa) 取范围的最大值,参数1为行(默认可省略,参数2为列)
- 'MsgBox UBound(br) & Chr(13) & UBound(br, 2)
- ReDim cr(1 To UBound(br), 1 To UBound(br, 2))
- '这里cr是个数组(很可能猜错)表示每个br范围内单元格的行列(的值?)。
- For i = 2 To UBound(br)
- If Trim(br(i, 1)) <> "" Then
- m = d(Trim(br(i, 1))) '从字典d里按原始表行取a列数据(编号),不为空时
- If m <> "" Then
- For j = 1 To UBound(br, 2) '从表原始向表已有赋值,
- ar(m, j) = br(i, j) 'm是已有表的行,i是原始表内需要更新数据的行,j相同的列
- Next j
- End If
- End If
- '以上把需要更新的数据放到ar里面了。
- If Trim(br(i, 1)) = "" Then '(编号)为空时,需要新增行
- n = n + 1 'n第一次用=1,每次+1
- xh = xh + 1 '编号+1
- cr(n, 1) = xh 'n,1就是n行1列,cr(n,1)就是这个单元格的值,新增数据的1行1列单元格的值等于xh(原来的最大编号)+1
- For j = 2 To UBound(br, 2)
- cr(n, j) = br(i, j) '这里赋值和上面一样
- Next j
- End If
- Next i
- Sheets("已有").[a1].CurrentRegion = ar '这里更新数据
- r = Sheets("已有").Cells(Rows.Count, 1).End(xlUp).Row + 1 '这里r用来过渡一个新行
- If n <> "" Then
- Sheets("已有").Cells(r, 1).Resize(n, UBound(cr, 2)) = cr '这里新增数据'把cells().resize()代替range使变量更简单的参与。
- End If
- End Sub
复制代码
学习了。看了好久,越发觉得优雅。
ar(3,1)可以同时传递行、列、行列(单元格)的值,而且还是个范围,要好好学习数组了。
这是个数组吧。
一直都只会用cells,觉得比range好用。觉得变量好参与,现在看来要升级一下了。
|
|