Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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
尝试使用Excel VBA跳过复制/粘贴循环中的空行_Vba_Excel - Fatal编程技术网

尝试使用Excel VBA跳过复制/粘贴循环中的空行

尝试使用Excel VBA跳过复制/粘贴循环中的空行,vba,excel,Vba,Excel,我有一个Excel文件中行项目的复制/粘贴循环,该循环将这些行项目中的数据导出到基于Excel的表单中,并按B行中的值保存每个表单。我的问题是,这些行项目在同一工作表上分为3个不同的表,每个表都有不同数量的要复制的行项目。此外,每个表由两个空行分隔 我需要宏为我做什么: 从第17行开始,复制第一个表中的所有行项目,直到它到达一个空行-这从1行到600行不等 跳到第二个表并执行相同的功能 重复第三个表格 忽略一些声明,因为我删除了一大块代码以提高可读性。我想我需要3个单独的复制/粘贴循环来完成这项

我有一个Excel文件中行项目的复制/粘贴循环,该循环将这些行项目中的数据导出到基于Excel的表单中,并按B行中的值保存每个表单。我的问题是,这些行项目在同一工作表上分为3个不同的表,每个表都有不同数量的要复制的行项目。此外,每个表由两个空行分隔

我需要宏为我做什么:

  • 从第17行开始,复制第一个表中的所有行项目,直到它到达一个空行-这从1行到600行不等
  • 跳到第二个表并执行相同的功能
  • 重复第三个表格
  • 忽略一些声明,因为我删除了一大块代码以提高可读性。我想我需要3个单独的复制/粘贴循环来完成这项工作(这里我只包括2个),我尝试使用.Find引用第二个/第三个表的开头。宏在第一个表中正常运行,但在遇到空行时不会停止,在尝试基于空单元格的值保存文件时失败。我认为问题在于wsSource的
    下的
    EndOne=.Range(“B”和.Rows.Count).End(xlUp).Row
    参数。它不只是计算第一个表的非空白行,而是计算第三个表末尾的行数

    Sub CopyToForm()
    
    Dim wbSource As Workbook, wbForm As Workbook
    Dim wsSource As Worksheet, wsForm As Worksheet
    Dim formpath As String, foldertosavepath As String
    Dim EndOne As Long, EndTwo As Long, EndThree As Long, i As Integer
    Dim strProcessingFormPath As String
    'Dim strCancel As String
    'Dim strFilt As String
    'Dim intFilterIndex As Integer
    'Dim strDialogueFileTitle As String
    Dim SecondTable As String
    Dim ThirdTable As String
    
    Set wbSource = ThisWorkbook '~~> Write your code in Indication Tool.xls
    Set wsSource = wbSource.Sheets("Indication Tool") '~~> Put the source sheet name
    
    
    With wsSource
        '~~> Counts how many rows are in the Indication Tool
        EndOne = .Range("B" & .Rows.Count).End(xlUp).Row
        If EndOne < 17 Then MsgBox "No data for transfer": Exit Sub
        For i = 17 To EndOne
            Set wbForm = Workbooks.Open(formpath) '~~> open the form
            Set wsForm = wbForm.Sheets("Processing Form") '~~> Declare which worksheet to activate
            '~~> Proceed with the copying / pasting of values
            .Range("B" & i).Copy wsForm.Range("F7:K7")
            .Range("C" & i).Copy: wsForm.Range("D8").PasteSpecial xlPasteValues
            .Range("C" & i).Copy: wsForm.Range("D30").PasteSpecial xlPasteValues
            .Range("D" & i).Copy: wsForm.Range("H29").PasteSpecial xlPasteValues
            .Range("E" & i).Copy: wsForm.Range("E29").PasteSpecial xlPasteValues
            .Range("F" & i).Copy: wsForm.Range("D33").PasteSpecial xlPasteValues
            .Range("G" & i).Copy: wsForm.Range("K30").PasteSpecial xlPasteValues
            .Range("H" & i).Copy: wsForm.Range("P33").PasteSpecial xlPasteValues
            .Range("L" & i).Copy: wsForm.Range("H32").PasteSpecial xlPasteValues
            .Range("R" & i).Copy: wsForm.Range("D87").PasteSpecial xlPasteValues
            '.Range("C5:M5").Copy: wsForm.Range("E102").PasteSpecial xlPasteValues
            '~~> Save the form using the value in cell i,B
            wbForm.SaveAs .Range("B" & i).Value & ".xls"
            wbForm.Close
            Set wbForm = Nothing
            Set wsForm = Nothing
       Next
    
    End With
    
    With wsSource
        SecondTable = .Range("B:B").Find("SecondTable").Row
        EndTwo = .Range("B" & .Rows.Count).End(xlUp).Row
        For i = Second Table + 1 To EndTwo
            Set wbForm = Workbooks.Open(formpath) '~~> open the form
            Set wsForm = wbForm.Sheets("Processing Form") '~~> Declare which worksheet to activate
            '~~> Proceed with the copying / pasting of values
            .Range("B" & i).Copy wsForm.Range("F7:K7")
            .Range("C" & i).Copy: wsForm.Range("D8").PasteSpecial xlPasteValues
            .Range("C" & i).Copy: wsForm.Range("D30").PasteSpecial xlPasteValues
            .Range("D" & i).Copy: wsForm.Range("H29").PasteSpecial xlPasteValues
            .Range("E" & i).Copy: wsForm.Range("E29").PasteSpecial xlPasteValues
            .Range("F" & i).Copy: wsForm.Range("D33").PasteSpecial xlPasteValues
            .Range("G" & i).Copy: wsForm.Range("K30").PasteSpecial xlPasteValues
            .Range("H" & i).Copy: wsForm.Range("P33").PasteSpecial xlPasteValues
            .Range("L" & i).Copy: wsForm.Range("H32").PasteSpecial xlPasteValues
            .Range("R" & i).Copy: wsForm.Range("D87").PasteSpecial xlPasteValues
            .Range("C5:M5").Copy: wsForm.Range("E102").PasteSpecial xlPasteValues
            '~~> Save the form using the cells i,B
            wbForm.SaveAs .Range("B" & i).Value & ".xls"
            wbForm.Close
            Set wbForm = Nothing
            Set wsForm = Nothing
       Next
    
    End With
    
    End Sub
    
    子CopyToForm()
    将wbSource作为工作簿,wbForm作为工作簿
    将wsSource设置为工作表,将wsForm设置为工作表
    Dim formpath作为字符串,foldertosavepath作为字符串
    Dim EndOne为长,END2为长,END3为长,i为整数
    Dim strProcessingFormPath作为字符串
    '作为字符串的Dim strCancel
    '作为字符串的Dim strFilt
    '作为整数的Dim intFilterIndex
    'Dim strDialogueFileTitle作为字符串
    将第二个表设置为字符串
    作为字符串的第三个数字
    设置wbSource=ThisWorkbook'~~>在指示工具.xls中编写代码
    设置wsSource=wbSource.Sheets(“指示工具”)“~~>输入源工作表名称
    使用wsSource
    “~~>统计指示工具中的行数
    EndOne=.Range(“B”和.Rows.Count).End(xlUp).Row
    如果EndOne<17,则MsgBox“无传输数据”:退出Sub
    对于i=17到EndOne
    设置wbForm=工作簿。打开(formpath)~~>打开表单
    设置wsForm=wbForm.Sheets(“处理表单”)~~>声明要激活的工作表
    “~~>继续复制/粘贴值
    .Range(“B”和i).复制wsForm.Range(“F7:K7”)
    .Range(“C”和i).Copy:wsForm.Range(“D8”).paste特殊XLPaste值
    .Range(“C”和i).Copy:wsForm.Range(“D30”).paste特殊XLPaste值
    .Range(“D”和i).Copy:wsForm.Range(“H29”).paste特殊XLPaste值
    .Range(“E”和i).Copy:wsForm.Range(“E29”).paste特殊XLPaste值
    .Range(“F”和i).Copy:wsForm.Range(“D33”).paste特殊XLPaste值
    .Range(“G”和i).复制:wsForm.Range(“K30”).paste特殊XLPaste值
    .Range(“H”和i).Copy:wsForm.Range(“P33”).paste特殊XLPaste值
    .Range(“L”和i).Copy:wsForm.Range(“H32”).paste特殊XLPaste值
    .Range(“R”和i).Copy:wsForm.Range(“D87”).paste特殊XLPaste值
    '.Range(“C5:M5”).Copy:wsForm.Range(“E102”).paste特殊XLPaste值
    “~~>使用单元格i、B中的值保存表单
    wbForm.SaveAs.Range(“B”和i).Value和“.xls”
    wbForm,关闭
    设置wbForm=Nothing
    设置wsForm=Nothing
    下一个
    以
    使用wsSource
    SecondTable=.Range(“B:B”).Find(“SecondTable”).Row
    EndTwo=.Range(“B”和.Rows.Count).End(xlUp).Row
    对于i=第二个表+1到第二个表
    设置wbForm=工作簿。打开(formpath)~~>打开表单
    设置wsForm=wbForm.Sheets(“处理表单”)~~>声明要激活的工作表
    “~~>继续复制/粘贴值
    .Range(“B”和i).复制wsForm.Range(“F7:K7”)
    .Range(“C”和i).Copy:wsForm.Range(“D8”).paste特殊XLPaste值
    .Range(“C”和i).Copy:wsForm.Range(“D30”).paste特殊XLPaste值
    .Range(“D”和i).Copy:wsForm.Range(“H29”).paste特殊XLPaste值
    .Range(“E”和i).Copy:wsForm.Range(“E29”).paste特殊XLPaste值
    .Range(“F”和i).Copy:wsForm.Range(“D33”).paste特殊XLPaste值
    .Range(“G”和i).复制:wsForm.Range(“K30”).paste特殊XLPaste值
    .Range(“H”和i).Copy:wsForm.Range(“P33”).paste特殊XLPaste值
    .Range(“L”和i).Copy:wsForm.Range(“H32”).paste特殊XLPaste值
    .Range(“R”和i).Copy:wsForm.Range(“D87”).paste特殊XLPaste值
    .Range(“C5:M5”).Copy:wsForm.Range(“E102”).paste特殊XLPaste值
    “~~>使用单元格i、B保存表单
    wbForm.SaveAs.Range(“B”和i).Value和“.xls”
    wbForm,关闭
    设置wbForm=Nothing
    设置wsForm=Nothing
    下一个
    以
    端接头
    
    使用.Find和每个表的单独复制/粘贴循环是否正确?我意识到这是一个复杂的问题,我感谢你花时间帮助我

    使用.Find和每个表的单独复制/粘贴循环是否正确

    不完全是。这些循环中的代码基本相同,因此它是一个很好的子程序候选者。这将使您的代码更具可读性,并且更易于维护,因为只有一个地方可以进行修订,而不是多个(想象一下,如果您需要进行10次不同的迭代,或者1000次——您不可能编写1000次不同的循环来做同一件事!!)

    考虑一下这一点(我观察到一些明显的错误,我会纠正,但这没有经过测试)。我所做的是将几个循环合并到一个子程序中。然后我们向该子例程发送一些信息,如表的开始位置和结束位置:

    Sub CopyStuff(ws as Worksheet, tblStart as Long, tblEnd as Long)
    
    我们将发送它:
    wsSource
    ,其他变量将用于/重复用于确定每个表的开始/结束。I r
    Sub CopyToForm()
    
        Dim wbSource As Workbook 'No longer needed in this context: wbForm As Workbook
        Dim wsSource As Worksheet 'No longer needed in this context: wsForm As Worksheet
        Dim formpath As String, foldertosavepath As String
        Dim tblEnd As Long, tblStart As Long, i As Integer
        Dim strProcessingFormPath As String
        Dim tblStart as Integer: tblStart = 16
    
        Set wbSource = ThisWorkbook '~~> Write your code in Indication Tool.xls
        Set wsSource = wbSource.Sheets("Indication Tool") '~~> Put the source sheet name
    
        With wsSource
            '~~> Counts how many rows are in the Indication Tool
            tblEnd = .Range("B" & .Rows.Count).End(xlUp).Row
            If tblEnd < 17 Then GoTo EarlyExit  '## I like to use only one exit point from my subroutines/functions
    
                CopyStuff wsSource, tblStart, tblEnd
    
            tblStart = .Range("B:B").Find("SecondTable").Row + 1
            tblEnd = .Range("B" & .Rows.Count).End(xlUp).Row
    
                CopyStuff wsSource, tblStart, tblEnd
    
            'And presumably...
            tblStart = .Range("B:B").Find("ThirdTable").Row + 1
            tblEnd = .Range("B" & .Rows.Count).End(xlUp).Row  
    
                CopyStuff wsSource, tblStart, tblEnd
    
        End With
    
        Exit Sub
    
    EarlyExit:
        MsgBox "No data for transfer"
    
    End Sub
    
    Private Sub CopyStuff(ws As Worksheet, tblStart as Long, tblEnd as Long)
    Dim wbForm as Workbook, wsForm as Worksheet, i As Long
    With ws
    For i = tblStart to tblEnd
        Set wbForm = Workbooks.Open(formpath) '~~> open the form
        Set wsForm = wbForm.Sheets("Processing Form") '~~> Declare which worksheet to activate
        '~~> Proceed with the copying / pasting of values
        .Range("B" & i).Copy wsForm.Range("F7:K7")
        .Range("C" & i).Copy: wsForm.Range("D8").PasteSpecial xlPasteValues
        .Range("C" & i).Copy: wsForm.Range("D30").PasteSpecial xlPasteValues
        .Range("D" & i).Copy: wsForm.Range("H29").PasteSpecial xlPasteValues
        .Range("E" & i).Copy: wsForm.Range("E29").PasteSpecial xlPasteValues
        .Range("F" & i).Copy: wsForm.Range("D33").PasteSpecial xlPasteValues
        .Range("G" & i).Copy: wsForm.Range("K30").PasteSpecial xlPasteValues
        .Range("H" & i).Copy: wsForm.Range("P33").PasteSpecial xlPasteValues
        .Range("L" & i).Copy: wsForm.Range("H32").PasteSpecial xlPasteValues
        .Range("R" & i).Copy: wsForm.Range("D87").PasteSpecial xlPasteValues
        '.Range("C5:M5").Copy: wsForm.Range("E102").PasteSpecial xlPasteValues
        '~~> Save the form using the value in cell i,B
        wbForm.SaveAs .Range("B" & i).Value & ".xls"
        wbForm.Close
        Set wbForm = Nothing
        Set wsForm = Nothing
    Next
    End With
    End Sub