Excel 根据条件将范围复制到新工作簿的宏

Excel 根据条件将范围复制到新工作簿的宏,excel,vba,Excel,Vba,可能重复: 我尝试创建宏的目的如下:将工作簿范围复制到新工作簿,但未成功。看一下示例1中的第一个屏幕截图,我想要实现的是将范围R4:AB6复制到一个新工作簿中,并附加一个条件。宏应仅复制活动单元格的行包含值的行。示例1的第二个屏幕截图显示了宏的结果:一个新工作簿,其粘贴范围基于所述标准。我已经添加了另一个示例,以便更清楚地说明我需要什么。在示例2中,屏幕截图2显示了活动单元格为R7的起始位置。运行宏的结果将是最终屏幕截图,其中第4行和第5行已与活动单元格的行一起复制,并且仅当该行不为空时 我真

可能重复:

我尝试创建宏的目的如下:将工作簿范围复制到新工作簿,但未成功。看一下示例1中的第一个屏幕截图,我想要实现的是将范围R4:AB6复制到一个新工作簿中,并附加一个条件。宏应仅复制活动单元格的行包含值的行。示例1的第二个屏幕截图显示了宏的结果:一个新工作簿,其粘贴范围基于所述标准。我已经添加了另一个示例,以便更清楚地说明我需要什么。在示例2中,屏幕截图2显示了活动单元格为R7的起始位置。运行宏的结果将是最终屏幕截图,其中第4行和第5行已与活动单元格的行一起复制,并且仅当该行不为空时

我真的很感激任何帮助,因为我对vba还是一个新手,在这件事上我已经很长时间没有头绪了


这是相当粗糙的,但希望这能有所帮助

Sub bks()

Application.ScreenUpdating = False
Dim WB1 As Workbook
Dim WB2 As Workbook
Dim name1 As String
Dim name2 As String
Dim colLet As String

'grab name of current workbook
name1 = ThisWorkbook.Name
Set WB1 = Workbooks(name1)


'create new workbook and set it
Workbooks.Add.Activate
name2 = ActiveWorkbook.Name
Set WB2 = Workbooks(name2)

WB1.Activate

Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim m As Integer
Dim mAdjust As Integer
Dim x As Double



'set x equal to number of rows you have
x = 100

Dim colSave() As Double
ReDim colSave(x)

j = 1
k = 1

'the `17` adjust the loop for the R column (17 columns over from 1)
    For i = 1 + 17 To 11 + 17
        For m = 1 To x

'for each row of records, set the first report column to 1 via the array colSave(m)
        If i = 1 + 17 Then
            colSave(m) = 1
        End If
           mAdjust = m + 5
               WB2.Activate
        j = colSave(m)

'convert the column number to column letter
            If i > 26 Then
               colLet = Chr(Int((i - 1) / 26) + 64) & Chr(Int((i - 1) Mod 26) + 65)
            Else
               colLet = Chr(i + 64)
            End If

            WB1.Activate

        'the conditional statements you wanted
                If Cells(mAdjust, i) <> "" Then
                    Range(colLet & "4," & colLet & "5," & colLet & mAdjust).Activate
                        Selection.Copy
                        WB2.Activate
                        Sheets("Sheet1").Cells((m - 1) * 5 + 1, j).Activate
                        ActiveSheet.Paste
                    colSave(m) = colSave(m) + 1
                End If
            Next m
    Next i

Application.ScreenUpdating = True
WB2.Activate

'`j` and `k` allow you to move the paste columns sperately based on your condition.
End Sub
Sub-bks()
Application.ScreenUpdating=False
将WB1设置为工作簿
将WB2设置为工作簿
Dim name1作为字符串
Dim NAME 2作为字符串
作为弦的调暗夹头
'获取当前工作簿的名称
名称1=此工作簿。名称
设置WB1=工作簿(名称1)
'创建新工作簿并设置它
工作簿。添加。激活
name2=ActiveWorkbook.Name
设置WB2=工作簿(名称2)
WB1.激活
作为整数的Dim i
作为整数的Dim j
将k变为整数
将m作为整数
与整数相同
将x调为双精度
'将x设置为您拥有的行数
x=100
Dim colSave()为双精度
ReDim colSave(x)
j=1
k=1
'17'调整R列的循环(从1到17列)
对于i=1+17至11+17
对于m=1到x
'对于每一行记录,通过数组colSave(m)将第一个报告列设置为1
如果i=1+17,那么
colSave(m)=1
如果结束
mAdjust=m+5
WB2.激活
j=colSave(m)
'将列编号转换为列字母
如果我>26那么
夹头=Chr(Int((i-1)/26)+64)和Chr(Int((i-1)Mod 26)+65)
其他的
夹头=Chr(i+64)
如果结束
WB1.激活
'您想要的条件语句
如果单元格(mAdjust,i)“,则
范围(夹头和“4”&夹头和“5”&夹头和马达)。激活
选择,复制
WB2.激活
表(“表1”)。单元格((m-1)*5+1,j)。激活
活动表。粘贴
colSave(m)=colSave(m)+1
如果结束
下一个m
接下来我
Application.ScreenUpdating=True
WB2.激活
“`j`和`k`允许您根据自己的条件移动粘贴列。
端接头

您好,感谢您抽出时间!我得到错误400。我可能会遗漏什么?错误发生在哪里?只要您要复制的工作表在点击“运行”时处于活动状态,此宏就可以工作。代码是为您的确切示例编写的。您必须进行一些更改才能将其应用到其他位置。我相信您的错误是由于条件语句中缺少
声明造成的。上面的代码应该是固定的。将
x
设置为您拥有的行数。请记住,即使使用VBA,这些大循环也可能需要一段时间。这对我很有用。我不知道你的问题是什么。代码将循环从R6到R
x
的每一行,其中x是行数。应在代码中手动设置该值
x
。有很多方法可以使这成为一个自动化的过程,但这是一个快速而肮脏的方法。