【问题标题】:copy worksheet excel VBA fine tuning. Copy from certain cells, paste in certain cells & worksheet naming,复制工作表 excel VBA 微调。从某些单元格复制,粘贴在某些单元格和工作表命名中,
【发布时间】:2015-04-09 17:04:43
【问题描述】:

编辑:我更新了一些代码,现在我也收到了一条错误消息。错误如下所示。

我在此站点上找到了一段代码,并将工作表复制到另一个工作簿,但我想做一些微调。我需要源工作表从单元格“A11”-“J11”复制单元格中的所有信息,直到行中的信息结束。

复制的信息需要在单元格“A4”-“J4”中发布,直到没有更多信息可以粘贴为止。

复制工作表时,它需要命名为某个名称(假设它需要命名为“客户信息”),但是,目标工作簿中将有一个同名的当前工作表。有没有办法在不添加 (1) 到名称末尾的情况下复制它,因为已经有一个具有该名称的选项卡。

这是我目前拥有的代码

Sub UpdateCustomerInformation()

Dim wkbSource As Workbook
Dim wkbDest As Workbook
Dim shttocopy As Worksheet
Dim wbname As String
Dim destSheet As Worksheet



' check if the file is open
Ret = Isworkbookopen("\\showdog\service\\Service_job_PO\Customer Information - Query.xls")
If Ret = False Then
' open file
Set wkbSource = Workbooks.Open("\\showdog\service\\Service_job_PO\Customer Information - Query.xls")
Else
'Just make it active
 'Workbooks("C:\stack\file1.xlsx").Activate
 Set wkbSource = Workbooks("Customer Information - Query.xls")
 End If

' check if the file is open

Ret = Isworkbookopen("\\showdog\service\Service Jobs.xlsm")
If Ret = False Then
' open file
Set wkbDest = Workbooks.Open("\\showdog\service\Service Jobs.xlsm")
Set destSheet = wkbDest.Sheets("Customer Information")
'perform copy
Set shttocopy = wkbSource.Sheets("Report")
shttocopy.Range("A11:J11").End(xlDown).Copy

此处抛出错误:“对象不支持此属性或方法”

wkbDest.Sheets(destSheet.Name).Range("A4:J4").End(xlDown).Paste

我不确定为什么。我以为我做的一切都是正确的,但我显然没有

Application.DisplayAlerts = False

wkbDest.Save
wkbDest.Close

Application.DisplayAlerts = True

'close file
Else
'Just make it active
 'Workbooks("C:\stack\file2.xlsx").Activate
 Set wkbDest = Workbooks("Service Jobs.xlsm")
 Set destSheet = wkbDest.Sheets("Customer Information")
'perform copy
Set shttocopy = wkbSource.Sheets("Report")
shttocopy.Range("A11:J11").End(xlDown).Copy
wkbDest.Sheets(destSheet.Name).Range("A4:J4").End(xlDown).Paste

End If



End Sub

Function Isworkbookopen(filename As String)
Dim ff As Long, ErrNo As Long
Dim wkb As Workbook
Dim nam As String

wbname = filename
On Error Resume Next

ff = FreeFile()
Open filename For Input Lock Read As #ff
Close ff
ErrNo = Err
On Error GoTo 0
Select Case ErrNo
Case 0: Isworkbookopen = False
Case 70: Isworkbookopen = True
Case Else: Error ErrNo
End Select
End Function

我不确定如何完成上述任务。任何帮助将不胜感激!

【问题讨论】:

  • 如果您想操作目标工作表的数据(或名称等属性),则需要另一个工作表对象(Dim destSheet As Worksheet)。然后,您不需要执行“shttocopy.Copy”,而是需要将其拆分并更具体(shttocopy.Range("A11:J11").Copy)并将其更具体地粘贴到 destSheet(wkbDest.Sheets(destSheet.名称).Range("A4:J4").Paste )。您粘贴的代码中有很多硬定义的元素,因此如果您希望它更健壮,我可能会建议更改其中的一些元素。如果您需要更多帮助,我可以提供更复杂的答案。
  • 我会试一试。我知道如何利用这些信息完成我的任务。我只是不确定如何开始。我会让你知道我的进步。谢谢!
  • 我听从了你的建议,但是我现在遇到了一个错误。我更新了代码,这样你就可以看到我做了什么。
  • @RichardHorvath,Range 对象只有 PasteSpecial 方法。您可以将行编辑为如下所示:wkbDest.destSheet.Range("A4:J4").End(xlDown).PasteSpecial - 请注意我也更改了 sheet 部分,您已经设置了工作表,不需要再做一次。

标签: vba excel


【解决方案1】:

复制整个范围形式shttocopy(使用@Rgo所说的并假设shttocopy的范围内没有空白单元格)到destsheet中现有范围的底部+ 1行(再次假设“A”栏中没有空格)。

With shttocopy
    .Range(.Range("A11"), .Range("A11").End(xlDown).End(xlToRight)).Copy _
    destsheet.Range("A4").End(xlDown).Offset(1)
End With

【讨论】:

  • 当我使用这个时,我仍然得到一个错误,说“应用程序定义或对象定义错误”。
  • 我不熟悉在 Range...Copy 内嵌入 .End(xlDown).End(xlroRight)。我建议您是否尝试识别单元格地址的右下边缘,以便在我上面写的复制命令之外这样做。您还可以使用源工作表 .UsedRange.columns.count 获取最后一列编号,使用 .UsedRange.Rows.Count 获取最后一行。这两个嵌入在 Cells(row,column) 中将返回地址。最后,在另一个范围内使用 Range 函数时,请尝试添加 .address。
  • @rgo End 方法返回一个 Range,因此您可以再次将其作为 Range 进行操作,例如使用另一个 @987654326 @ 方法,这又返回一个 Range 对象,因此您可以复制它,或选择它,或其他范围方法。
【解决方案2】:

此代码可以更改。

shttocopy.Range("A11:J11").End(xlDown).Copy
wkbDest.Sheets(destSheet.Name).Range("A4:J4").End(xlDown).Paste

shttocopy.Range("A11:J11").Copy destsheet.range("A4")

您不需要将 destSheet.name 放入 Sheets() 虽然宏记录器会创建单独的复制/粘贴指令,但应该像上面那样重写。

End(xlDown) 通常用于定位下一个可用于复制的行,不应以这种方式使用。

如果您想一次复制一行,请使用 End(xlUP) 查找下一个可用行:

lRow = DestSheet.Range("A65536").end(xlUP).row + 1
shttocopy.Range("A1").Copy destsheet.range("A" & lrow)

如果您需要识别要复制的范围的右下角地址,请使用以下代码:

 dim aRange as range

 set aRange = shttocopy.range(Range("A1").address, Cells(shttocopy.usedrange.rows.count, shttocopy.usedrange.columns.count).address)

  Shttocopy.arange.copy ...

在一行上复制并在另一行上粘贴方法经常会引发错误,建议更换它。如上所述。

【讨论】:

  • 没有错误或任何东西被抛出,但它表明什么也没做。它只是一张白纸,没有任何内容被复制
猜你喜欢
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多