Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA,将图纸复制并粘贴到图纸,复制不需要的标题_Vba_Excel - Fatal编程技术网

VBA,将图纸复制并粘贴到图纸,复制不需要的标题

VBA,将图纸复制并粘贴到图纸,复制不需要的标题,vba,excel,Vba,Excel,我有一个密码 1) 查找工作表1中的标题 2) 在工作表2中查找标题 3) 匹配图纸和副本之间的标题,并将类似标题的数据从图纸1粘贴到图纸2 4) 我有一个选项,如果表1中的标题存在于“映射”表中,则将标题更改为映射中的标题,然后进行复制和粘贴 我第一次在第1页和第2页之间这样做时效果很好。(尽管我的工作表1不需要“映射”选项卡)。当我在使用另一个工作表(确实使用了mappings选项卡)之后直接再次尝试此代码时,我会复制一些标题,而不应该只复制标题下的数据 +------+----------

我有一个密码

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也可以这样做。看


您需要在最后将屏幕更新切换为True,并包括函数get\u max\u row。。如果在代码顶部有OptionExplicit,它会提示您执行此操作。而且使用.Select会使代码的速度大大降低,不要使用它(只有在极少数情况下它才是有用和必要的)。在需要显式的地方,也会缺少变量声明和隐式数据类型。例如,子签名看起来需要字符串,但使用变体。显示图纸和mapp的一些示例数据
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