请教VBA大侠,为什么用loop就出错,写开了是通的。请问错在哪里了?Thank you

I
ILuvSunshine
楼主 (北美华人网)
VBA小白一个.
请看图。
任务是把数据从一个workbook copy到另一个workbook(另一个有设好的formatting)
Many thanks!
I
ILuvSunshine
上图不行,run time error, mismatch type,下图works
f
fxiyz
问chatgpt啊
t
therealabcdefg
到底是上图work,还是下图?标题说loop不work。你的上图是loop
I
ILuvSunshine
回复 4楼 therealabcdefg 的帖子
谢谢指正,改过来了。
期间这种问题怎么问chatgpt?就像帖子里这样问吗?
t
therealabcdefg
你的loop里面,ws是worksheet。但在下图里是string。你试试将ws定义成string。在string里loop。我也只是略知一二。
理查德
   把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
I
ILuvSunshine
THANK YOU SO MUCH for your help @理查德!!! You saved my day!!
I
ILuvSunshine
therealabcdefg 发表于 2024-03-08 14:03
你的loop里面,ws是worksheet。但在下图里是string。你试试将ws定义成string。在string里loop。我也只是略知一二。

You definitely know more than I do! Thanks too!
I
ILuvSunshine
现在下班了,手机上打中文方便多了,多说几句,我上面的loop 办法是从stack exchange 上抄来的,看来不行啊,还是华人上能人厉害!
理查德
ILuvSunshine 发表于 2024-03-08 15:08
现在下班了,手机上打中文方便多了,多说几句,我上面的loop 办法是从stack exchange 上抄来的,看来不行啊,还是华人上能人厉害!

别客气
m
me2me2
不会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前面的单引号。
m
me2me2
ILuvSunshine 发表于 2024-03-08 13:58
回复 4楼 therealabcdefg 的帖子
谢谢指正,改过来了。
期间这种问题怎么问chatgpt?就像帖子里这样问吗?

t
therealabcdefg
chatGPT写程序还为时尚早。会一本正经的胡说八道,还会自己瞎编一些keyword。其实lz的问题很简单。就是因为在loop中,worksheets()里面的参数应该是一个string,不应该是worksheet。
I
ILuvSunshine
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前面的单引号。

我能看出来的至少是它说的这些问题我原来code里面一个都没有。所以对于改正我code里面的runtime error 没有用。
I
ILuvSunshine
me2me2 发表于 2024-03-09 00:33

谢谢你告诉我怎么问 chatgpt 问题,不过的确目前它还做不到解决我的问题。
I
ILuvSunshine
回复 7楼 理查德 的帖子
今天上班仔仔细细又看了一遍这个code,再感谢一下。发现写的非常完整严谨,非常user friendly.
我又去学了一下弄出来一个window,让用户可以选择source file.现在比较完美了。