VBA,将图纸复制并粘贴到图纸,复制不需要的标题
我有一个密码 1) 查找工作表1中的标题 2) 在工作表2中查找标题 3) 匹配图纸和副本之间的标题,并将类似标题的数据从图纸1粘贴到图纸2 4) 我有一个选项,如果表1中的标题存在于“映射”表中,则将标题更改为映射中的标题,然后进行复制和粘贴 我第一次在第1页和第2页之间这样做时效果很好。(尽管我的工作表1不需要“映射”选项卡)。当我在使用另一个工作表(确实使用了mappings选项卡)之后直接再次尝试此代码时,我会复制一些标题,而不应该只复制标题下的数据VBA,将图纸复制并粘贴到图纸,复制不需要的标题,vba,excel,Vba,Excel,我有一个密码 1) 查找工作表1中的标题 2) 在工作表2中查找标题 3) 匹配图纸和副本之间的标题,并将类似标题的数据从图纸1粘贴到图纸2 4) 我有一个选项,如果表1中的标题存在于“映射”表中,则将标题更改为映射中的标题,然后进行复制和粘贴 我第一次在第1页和第2页之间这样做时效果很好。(尽管我的工作表1不需要“映射”选项卡)。当我在使用另一个工作表(确实使用了mappings选项卡)之后直接再次尝试此代码时,我会复制一些标题,而不应该只复制标题下的数据 +------+----------
+------+------------+------+--+
| Col1 | Col2 | Col3 | |
+------+------------+------+--+
| Col1 | normaldata | Col3 | |
| | normaldata | | |
| | normaldata | | |
+------+------------+------+--+
代码:
选项显式
子导入数据库(从\u-ws到\u-ws)
变暗rng作为范围,trgtCell作为范围
Dim src As工作表
Dim trgt As工作表
Set src=工作表(从\u ws)
将trgt=工作表设置为
Dim row_num为整数
将最大行数据调整为整数
Dim source_选项卡作为字符串
Application.ScreenUpdating=False
图纸(至图纸)。选择
最大行数据=获取最大行(“”)
如果最大行数据为2,则
最大行数据=最大行数据+1
如果结束
图纸(“映射”)。选择
最大行=获取最大行(“”)
与src
对于Intersect(.Rows(1),.UsedRange).SpecialCells(xlCellTypeConstants)中的每个rng
对于行数=2到最大行数
如果from_ws=Range(“BU”和row_num).value,则
如果rng=范围(“BV”和行数)。则
rng=范围(“BW”和行数)。值
退出
如果结束
如果结束
下一行_num
设置trgtCell=trgt.Rows(1).Find(rng.value,LookIn:=xlValues,lookat:=xlWhole)
如果不是trgtCell,则为空
.Range(rng.Offset(1),.Cells(.Rows.count,rng.Column).End(xlUp)).copy
与trgt
.Cells(最大行数据,trgtCell.Column)。粘贴特殊XLPaste值
以
如果结束
"完"
下一个rng
以
Application.ScreenUpdating=False
端接头
获取最大行函数:
Public Function get_max_row(tab_name, Optional col_srch, Optional include_shapes As Boolean = True, Optional include_border = False)
Dim max_shape_row As Long: max_shape_row = 0
Dim max_shape_loc As Double: max_shape_loc = 0
If IsMissing(col_srch) Then
col_srch = ""
End If
old_tab = ActiveSheet.Name
If tab_name = "" Then
tab_name = old_tab
End If
select_tab = tab_name
Sheets(select_tab).Select
On Error GoTo errorHandler
max_row_num1 = Sheets(select_tab).Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
On Error GoTo 0
'max_row_num2 = ActiveSheet.UsedRange.Rows.Count
max_row_num2 = 2
'QuickMessage (max_row_num1 & "-" & max_row_num2)
If max_row_num1 > max_row_num2 Then
get_max_row = max_row_num1
Else
get_max_row = max_row_num2
End If
If col_srch <> "" Then
ref_srch_row = get_max_row
Do While ref_srch_row > 1
If Range(col_srch & ref_srch_row).value <> "" Then
Exit Do
End If
ref_srch_row = ref_srch_row - 1
Loop
get_max_row = ref_srch_row
End If
If include_shapes = True Then
max_text_row = get_max_row
shapes_num = IsEmpty(Sheets(tab_name).Shapes)
If shapes_num = False Then
For Each Item In Sheets(tab_name).Shapes
'Debug.Print Item.Name & ":" & Item.Top & ":" & Item.Height
curr_shape_loc = Item.Top + Item.Height
max_shape_loc = IIf(curr_shape_loc > max_shape_loc, curr_shape_loc, max_shape_loc)
Next Item
For Each cell In Sheets(tab_name).Columns("A:A").Cells
curr_cell_loc = cell.Top
If curr_cell_loc > max_shape_loc Then
max_shape_row = cell.row
Exit For
End If
Next cell
get_max_row = IIf(max_shape_row > max_text_row, max_shape_row, max_text_row)
End If
End If
'check border
If include_border = True Then
On Error Resume Next
count_num = 0
For Each cell In ActiveSheet.UsedRange.Cells
count_num = count_num + 1
If cell.Borders(xlEdgeBottom).LineStyle <> xlNone Then
get_max_row = Application.Max(max_shape_row, max_text_row, cell.row)
End If
If count_num > 10000 Then
Exit For
End If
Next cell
On Error GoTo 0
End If
Sheets(old_tab).Select
Exit Function
errorHandler:
get_max_row = 1
Resume Next
End Function
Public Function get_max_row(选项卡名称,可选列,可选包含形状,布尔值=True,可选包含边框=False)
按长度调整最大形状行:最大形状行=0
将最大形状定位为双精度:最大形状定位=0
如果是missing(col_srch),则
col_srch=“”
如果结束
old_tab=ActiveSheet.Name
如果tab_name=“”,则
选项卡名称=旧选项卡
如果结束
选择选项卡=选项卡名称
工作表(选择选项卡)。选择
关于错误转到错误处理程序
最大行数\u num1=工作表(选择选项卡)。单元格。查找(内容:=“*”,后面:=[A1],搜索顺序:=xlByRows,搜索方向:=xlPrevious)。行
错误转到0
'max_row_num2=ActiveSheet.UsedRange.Rows.Count
最大行数=2
'快速消息(最大行数m1&“-”&最大行数m2)
如果最大行数大于最大行数,则
get_max_row=max_row_num1
其他的
获取最大行数=最大行数
如果结束
如果col_srch“”则
ref\u srch\u行=获取\u最大\u行
当ref_srch_row>1时执行
如果范围(列和参考列)。值为“”,则
退出Do
如果结束
ref_srch_行=ref_srch_行-1
环
get_max_row=ref_srch_row
如果结束
如果include_shapes=True,则
最大文本行=获取最大行
shapes\u num=IsEmpty(表(选项卡名称).shapes)
如果shapes_num=False,则
对于工作表中的每个项目(选项卡名称)。形状
'Debug.Print Item.Name&“:”&Item.Top&“:”&Item.Height
当前形状=项目顶部+项目高度
最大形状锁定=IIf(当前形状锁定>最大形状锁定,当前形状锁定,最大形状锁定)
下一项
表格中的每个单元格(选项卡名称)。列(“A:A”)。单元格
当前单元格位置=单元格顶部
如果当前单元格位置>最大形状位置,则
最大形状行=cell.row
退出
如果结束
下一个细胞
get_max_row=IIf(max_shape_row>max_text_row,max_shape_row,max_text_row)
如果结束
如果结束
“检查边界
如果include_border=True,则
出错时继续下一步
计数_num=0
对于ActiveSheet.UsedRange.Cells中的每个单元格
count\u num=count\u num+1
如果cell.Borders(xlEdgeBottom).LineStyle xlNone,则
get\u max\u row=Application.max(max\u shape\u row、max\u text\u row、cell.row)
如果结束
如果计数>10000,则
退出
如果结束
下一个细胞
错误转到0
如果结束
工作表(旧选项卡)。选择
退出功能
错误处理程序:
get_max_row=1
下一步继续
端函数
如果您的目的是合并来自不同工作表或区域的数据,那么为了显著简化代码,同时使其更加健壮(对于行插入之类的事情),我建议使用Ctrl+T键盘快捷键将每个源区域制作成Excel表,然后使用以下方法之一:
- 使用VBA将各个表中的所有数据合并到一个表中。看
- 使用PowerQuery也可以这样做。看
Public Function get_max_row(tab_name, Optional col_srch, Optional include_shapes As Boolean = True, Optional include_border = False)
Dim max_shape_row As Long: max_shape_row = 0
Dim max_shape_loc As Double: max_shape_loc = 0
If IsMissing(col_srch) Then
col_srch = ""
End If
old_tab = ActiveSheet.Name
If tab_name = "" Then
tab_name = old_tab
End If
select_tab = tab_name
Sheets(select_tab).Select
On Error GoTo errorHandler
max_row_num1 = Sheets(select_tab).Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).row
On Error GoTo 0
'max_row_num2 = ActiveSheet.UsedRange.Rows.Count
max_row_num2 = 2
'QuickMessage (max_row_num1 & "-" & max_row_num2)
If max_row_num1 > max_row_num2 Then
get_max_row = max_row_num1
Else
get_max_row = max_row_num2
End If
If col_srch <> "" Then
ref_srch_row = get_max_row
Do While ref_srch_row > 1
If Range(col_srch & ref_srch_row).value <> "" Then
Exit Do
End If
ref_srch_row = ref_srch_row - 1
Loop
get_max_row = ref_srch_row
End If
If include_shapes = True Then
max_text_row = get_max_row
shapes_num = IsEmpty(Sheets(tab_name).Shapes)
If shapes_num = False Then
For Each Item In Sheets(tab_name).Shapes
'Debug.Print Item.Name & ":" & Item.Top & ":" & Item.Height
curr_shape_loc = Item.Top + Item.Height
max_shape_loc = IIf(curr_shape_loc > max_shape_loc, curr_shape_loc, max_shape_loc)
Next Item
For Each cell In Sheets(tab_name).Columns("A:A").Cells
curr_cell_loc = cell.Top
If curr_cell_loc > max_shape_loc Then
max_shape_row = cell.row
Exit For
End If
Next cell
get_max_row = IIf(max_shape_row > max_text_row, max_shape_row, max_text_row)
End If
End If
'check border
If include_border = True Then
On Error Resume Next
count_num = 0
For Each cell In ActiveSheet.UsedRange.Cells
count_num = count_num + 1
If cell.Borders(xlEdgeBottom).LineStyle <> xlNone Then
get_max_row = Application.Max(max_shape_row, max_text_row, cell.row)
End If
If count_num > 10000 Then
Exit For
End If
Next cell
On Error GoTo 0
End If
Sheets(old_tab).Select
Exit Function
errorHandler:
get_max_row = 1
Resume Next
End Function