Vba 什么';将一系列单元格从一个工作簿复制到另一个工作簿的正确语法是什么?

Vba 什么';将一系列单元格从一个工作簿复制到另一个工作簿的正确语法是什么?,vba,excel,copy,paste,Vba,Excel,Copy,Paste,我正在创建一本新书,然后打开目录中的文件,并将相应的工作表和值添加到新书中。我已经看过很多显示“Copy Destination:=”的表单,或者只有一个范围与另一个相等,但是我无法让我的脚本工作。除了Else场景中“工作簿(文件名).Close”前面的这一行之外,一切都正常(这只是一个片段,所以相信我98%都正常)。我通常会找到我的答案并找出答案,但我在这里认输了。救命啊 Dim SiteUsedCheck As Boolean Dim NewBook As Workbook Dim NewS

我正在创建一本新书,然后打开目录中的文件,并将相应的工作表和值添加到新书中。我已经看过很多显示“Copy Destination:=”的表单,或者只有一个范围与另一个相等,但是我无法让我的脚本工作。除了Else场景中“工作簿(文件名).Close”前面的这一行之外,一切都正常(这只是一个片段,所以相信我98%都正常)。我通常会找到我的答案并找出答案,但我在这里认输了。救命啊

Dim SiteUsedCheck As Boolean
Dim NewBook As Workbook
Dim NewSheet As Worksheet
Dim SaveAsName As String
Dim WeekRange As Range

Set WeekRange = Range("I5:O17")

SaveAsName = "Invoice" & "_" & Home.Range("C23").Value & ".xlsm"
MsgBox SaveAsName

Set NewBook = Workbooks.Add
    With NewBook

                Do While FileName <> "" '<---recall FileName variable looks at excele books; it ignores folders

                    Workbooks.Open (Directory & FileName)

                        If Workbooks(FileName).Worksheets("TotalHours").Cells(SecretTest, WeekCol) = 0 Then

                            Workbooks(FileName).Close

                        Else
                            Dim TempSheetName As String
                            Set NewSheet = .Sheets.Add(After:=.Sheets(.Sheets.Count))
                            TempSheetName = Workbooks(FileName).Worksheets("TotalHours").Range("B2").Value
                            NewSheet.Name = TempSheetName

                            NewBook.Sheets(TempSheetName).Range("A1").Value = Workbooks(FileName).Sheets("TotalHours").Range("WeekRange") '<--This is the line that keeps getting an error. But if I put a "1" on the right side of the = it works. So what's wrong with this tiny piece?

                            Workbooks(FileName).Close

                        End If


                    FileName = Dir()

                Loop

        .SaveAs FileName:= _
            InvoiceDirectory & SaveAsName _
            , FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False

        Workbooks(SaveAsName).Close
    End With
Dim SiteUsedCheck为布尔值
将新书本作为工作簿
将新闻纸变暗为工作表
将SaveAsName设置为字符串
昏暗的周末
设置周距=范围(“I5:O17”)
SaveAsName=“Invoice”和“Home.Range”(“C23”).Value和“.xlsm”
MsgBox SaveAsName
Set NewBook=工作簿。添加
用纽本

执行While FileName“”最简单的方法是使用一些标准语法,如:

r1.Copy r2
其中,
r1
r2
已被定为范围。这里有一个小例子

Sub BooktoBook()
    Dim r1 As Range, r2 As Range, NewBook As Workbook
    Set r1 = ActiveWorkbook.Sheets("Sheet1").Range("A3:D7")

    Set NewBook = Workbooks.Add
    Set r2 = NewBook.Sheets("Sheet1").Range("A3:D7")

    r1.Copy r2
End Sub
或许

NewBook.Sheets(TempSheetName).Range("A1").resize(weekrange.rows.count,weekrange.columns.count).Value = WeekRange.value

谢谢大家,当我把我学到的东西和给我的两个答案结合起来时,我重新安排了一周的工作,使之真正处于正确的位置,如下面的代码所示

Dim SiteUsedCheck As Boolean
Dim NewBook As Workbook
Dim NewSheet As Worksheet
Dim SaveAsName As String
Dim TempInvoiceRange As Range



SaveAsName = "Invoice" & "_" & Home.Range("C23").Value & ".xlsm"
MsgBox SaveAsName

Set NewBook = Workbooks.Add
    With NewBook

                Do While FileName <> "" '<---recall FileName variable looks at excele books; it ignores folders

                    Dim OpenRange As Range
                    Workbooks.Open (Directory & FileName)

                    Select Case Home.Range("C25")

                        Case Is = 1
                            Set WeekRange = Workbooks(FileName).Worksheets("TotalHours").Range("A5:G17")    '<---Range for Current Week to transfer to invoice
                            SecretTest = 18                                                                 '<---Row to check if site was used for the week
                            WeekCol = 7                                                                     '<---Column corresponding to current week
                        Case Is = 2
                            Set WeekRange = Workbooks(FileName).Worksheets("TotalHours").Range("I5:O17")
                            SecretTest = 18
                            WeekCol = 15
                        Case Is = 3
                            Set WeekRange = Workbooks(FileName).Worksheets("TotalHours").Range("Q5:W17")
                            SecretTest = 18
                            WeekCol = 23
                        Case Is = 4
                            Set WeekRange = Workbooks(FileName).Worksheets("TotalHours").Range("A19:G31")
                            SecretTest = 32
                            WeekCol = 7
                        Case Is = 5
                            Set WeekRange = Workbooks(FileName).Worksheets("TotalHours").Range("I19:O31")
                            SecretTest = 32
                            WeekCol = 15

                    End Select

                        If Workbooks(FileName).Worksheets("TotalHours").Cells(SecretTest, WeekCol) = 0 Then

                            Workbooks(FileName).Close

                        Else
                            Dim TempSheetName As String
                            Set NewSheet = .Sheets.Add(After:=.Sheets(.Sheets.Count))
                            TempSheetName = Workbooks(FileName).Worksheets("TotalHours").Range("B2").Value
                            NewSheet.Name = TempSheetName
                            NewBook.Sheets(TempSheetName).Range("A1").Resize(WeekRange.Rows.Count, WeekRange.Columns.Count).Value = WeekRange.Value
                            Workbooks(FileName).Close

                        End If


                    FileName = Dir()

                Loop

        .SaveAs FileName:= _
            InvoiceDirectory & SaveAsName _
            , FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False

        Workbooks(SaveAsName).Close
    End With
Dim SiteUsedCheck为布尔值
将新书本作为工作簿
将新闻纸变暗为工作表
将SaveAsName设置为字符串
Dim TEMPICERANGE作为范围
SaveAsName=“Invoice”和“Home.Range”(“C23”).Value和“.xlsm”
MsgBox SaveAsName
Set NewBook=工作簿。添加
用纽本

当文件名为“”时,您似乎没有为
SecretTest
WeekCol
分配值?我看我看错了行
Range(“WeekRange”)
是错误的,因为它不是一个命名的范围,但是为什么您要尝试将单个单元格的值设置为一个范围?哦,我想您可以将整个范围放在一个单元格中,然后该单元格(在本例中为A1)将是复制的所有内容的左上角。在上面的代码片段中,周而复始是根据星期来定义的;我只写了一个例子,所以你们知道我在周末用的是什么。我在下面添加了一行回答,因为对于评论来说有点太长了,所以请告诉我它是否符合你们的要求。有趣。这是如此接近工作没有错误,但它抓住了它从错误的工作簿。我想从工作簿中抓取一个工作周,在打开任何文件之前,在代码开头定义工作周时,它会打开Do中的第一件事。你是说它应该被定义为每个打开的工作簿中的范围吗?是的,这就是为什么它不起作用。我将案例场景放到循环中,现在它就可以工作了。非常感谢你!我很难理解设置范围是如何工作的。这与另一个答案一起帮助我了解出了什么问题以及如何工作。谢谢你把它拆了!