把ws改成ws.Name试一试。 我试了可以。 wbsource.Worksheets(ws.Name).Range("A44:A2385").Copy wbtarget.Worksheets(ws.Name).Range("A3").PasteSpecial Paste:=xlPasteValues 完整的: Sub CopySheet() Dim wbsource As Workbook Dim wbtarget As Workbook Dim ws As Worksheet '' Open source workbook Set wbsource = Workbooks.Open("C:\Users\David\Documents\A.xlsx") '' Open target workbook Set wbtarget = Workbooks.Open("C:\Users\David\Documents\B.xlsx") '' Loop through each worksheet in the array For Each ws In wbtarget.Sheets(Array("P1", "P2")) '' Copy data from source workbook to target workbook wbsource.Worksheets(ws.Name).Range("A44:A2385").Copy wbtarget.Worksheets(ws.Name).Range("A3").PasteSpecial Paste:=xlPasteValues Next ws '' Close the source workbook wbsource.Close SaveChanges:=False '' Close the target workbook wbtarget.Close SaveChanges:=True MsgBox "Data copied successfully!", vbInformation End Sub
不会VB,但是很想知道GPT回答的对不对: 你的VBA代码中使用了For Each循环来遍历工作表,并且试图将特定的单元格范围从一个工作簿复制到另一个工作簿。然而,从你提供的图片中,代码在执行循环时出现了错误,而直接写出工作表名称的方式却可以正常工作。 出错的原因可能有几个: Sheets数组:在For Each ws In Sheets(Array("P1", "P2"))这一行代码中,你没有指定Sheets属于哪个工作簿。如果这两个工作表"P1"和"P2"是在wbSource工作簿中,那么你应该使用wbSource.Sheets。 变量作用域:如果"P1"和"P2"不在相同的工作簿中,你需要确保对应的工作表引用正确。比如,如果"P1"在wbSource中而"P2"在wbTarget中,你不能在同一个循环中处理它们。 Worksheet对象:在第一张图中,你使用ws变量,但在定义它的那一行前面有一个单引号,这表示这行是被注释掉的。所以,ws没有被正确地定义为Worksheet对象,这将导致运行时错误。 为了解决这些问题,你可以尝试以下修改: Sub CopySheet() Dim wbSource As Workbook Dim wbTarget As Workbook Dim ws As Worksheet Set wbSource = Workbooks.Open("file A.xlsx") Set wbTarget = Workbooks.Open("file B.xlsx") ' Assuming that the sheets "P1" and "P2" are in wbSource For Each ws In wbSource.Sheets(Array("P1", "P2")) ' Copy range to clipboard ws.Range("A44:Z385").Copy ' PasteSpecial to paste values, formulas, formats, etc. ' Assuming you want to paste to the same sheet names in wbTarget wbTarget.Worksheets(ws.Name).Range("A3").PasteSpecial Paste:=xlPasteValues Next ws End Sub
请确保"P1"和"P2"都在wbSource中,并且在wbTarget中有相同名称的工作表,且这些工作表已经打开。如果这些工作表不在同一个工作簿中,你需要分别指定它们的工作簿。此外,确保去掉了Dim ws As Worksheet前面的单引号。
me2me2 发表于 2024-03-09 00:32 不会VB,但是很想知道GPT回答的对不对: 你的VBA代码中使用了For Each循环来遍历工作表,并且试图将特定的单元格范围从一个工作簿复制到另一个工作簿。然而,从你提供的图片中,代码在执行循环时出现了错误,而直接写出工作表名称的方式却可以正常工作。 出错的原因可能有几个: Sheets数组:在For Each ws In Sheets(Array("P1", "P2"))这一行代码中,你没有指定Sheets属于哪个工作簿。如果这两个工作表"P1"和"P2"是在wbSource工作簿中,那么你应该使用wbSource.Sheets。 变量作用域:如果"P1"和"P2"不在相同的工作簿中,你需要确保对应的工作表引用正确。比如,如果"P1"在wbSource中而"P2"在wbTarget中,你不能在同一个循环中处理它们。 Worksheet对象:在第一张图中,你使用ws变量,但在定义它的那一行前面有一个单引号,这表示这行是被注释掉的。所以,ws没有被正确地定义为Worksheet对象,这将导致运行时错误。 为了解决这些问题,你可以尝试以下修改: Sub CopySheet() Dim wbSource As Workbook Dim wbTarget As Workbook Dim ws As Worksheet Set wbSource = Workbooks.Open("file A.xlsx") Set wbTarget = Workbooks.Open("file B.xlsx") ' Assuming that the sheets "P1" and "P2" are in wbSource For Each ws In wbSource.Sheets(Array("P1", "P2")) ' Copy range to clipboard ws.Range("A44:Z385").Copy ' PasteSpecial to paste values, formulas, formats, etc. ' Assuming you want to paste to the same sheet names in wbTarget wbTarget.Worksheets(ws.Name).Range("A3").PasteSpecial Paste:=xlPasteValues Next ws End Sub
请确保"P1"和"P2"都在wbSource中,并且在wbTarget中有相同名称的工作表,且这些工作表已经打开。如果这些工作表不在同一个工作簿中,你需要分别指定它们的工作簿。此外,确保去掉了Dim ws As Worksheet前面的单引号。
请看图。
任务是把数据从一个workbook copy到另一个workbook(另一个有设好的formatting)
Many thanks!
谢谢指正,改过来了。
期间这种问题怎么问chatgpt?就像帖子里这样问吗?
wbsource.Worksheets(ws.Name).Range("A44:A2385").Copy wbtarget.Worksheets(ws.Name).Range("A3").PasteSpecial Paste:=xlPasteValues
完整的: Sub CopySheet()
Dim wbsource As Workbook Dim wbtarget As Workbook Dim ws As Worksheet '' Open source workbook Set wbsource = Workbooks.Open("C:\Users\David\Documents\A.xlsx") '' Open target workbook Set wbtarget = Workbooks.Open("C:\Users\David\Documents\B.xlsx") '' Loop through each worksheet in the array For Each ws In wbtarget.Sheets(Array("P1", "P2")) '' Copy data from source workbook to target workbook wbsource.Worksheets(ws.Name).Range("A44:A2385").Copy wbtarget.Worksheets(ws.Name).Range("A3").PasteSpecial Paste:=xlPasteValues Next ws '' Close the source workbook wbsource.Close SaveChanges:=False '' Close the target workbook wbtarget.Close SaveChanges:=True MsgBox "Data copied successfully!", vbInformation
End Sub
You definitely know more than I do! Thanks too!
别客气
你的VBA代码中使用了For Each循环来遍历工作表,并且试图将特定的单元格范围从一个工作簿复制到另一个工作簿。然而,从你提供的图片中,代码在执行循环时出现了错误,而直接写出工作表名称的方式却可以正常工作。 出错的原因可能有几个: Sheets数组:在For Each ws In Sheets(Array("P1", "P2"))这一行代码中,你没有指定Sheets属于哪个工作簿。如果这两个工作表"P1"和"P2"是在wbSource工作簿中,那么你应该使用wbSource.Sheets。 变量作用域:如果"P1"和"P2"不在相同的工作簿中,你需要确保对应的工作表引用正确。比如,如果"P1"在wbSource中而"P2"在wbTarget中,你不能在同一个循环中处理它们。 Worksheet对象:在第一张图中,你使用ws变量,但在定义它的那一行前面有一个单引号,这表示这行是被注释掉的。所以,ws没有被正确地定义为Worksheet对象,这将导致运行时错误。 为了解决这些问题,你可以尝试以下修改:
Sub CopySheet()
Dim wbSource As Workbook Dim wbTarget As Workbook Dim ws As Worksheet
Set wbSource = Workbooks.Open("file A.xlsx") Set wbTarget = Workbooks.Open("file B.xlsx")
' Assuming that the sheets "P1" and "P2" are in wbSource For Each ws In wbSource.Sheets(Array("P1", "P2"))
' Copy range to clipboard ws.Range("A44:Z385").Copy
' PasteSpecial to paste values, formulas, formats, etc. ' Assuming you want to paste to the same sheet names in wbTarget wbTarget.Worksheets(ws.Name).Range("A3").PasteSpecial Paste:=xlPasteValues
Next ws
End Sub
请确保"P1"和"P2"都在wbSource中,并且在wbTarget中有相同名称的工作表,且这些工作表已经打开。如果这些工作表不在同一个工作簿中,你需要分别指定它们的工作簿。此外,确保去掉了Dim ws As Worksheet前面的单引号。
我能看出来的至少是它说的这些问题我原来code里面一个都没有。所以对于改正我code里面的runtime error 没有用。
谢谢你告诉我怎么问 chatgpt 问题,不过的确目前它还做不到解决我的问题。
今天上班仔仔细细又看了一遍这个code,再感谢一下。发现写的非常完整严谨,非常user friendly.
我又去学了一下弄出来一个window,让用户可以选择source file.现在比较完美了。